Software design and clean code

Stage 1 of 10 · 8 lessons · ~3 weeks

Object-oriented programming properly

Go beyond the textbook definitions: use classes to protect rules, interfaces to hide change, polymorphism to remove type checks and composition instead of deep inheritance, in your language's modern style.

Start: Classes, objects and responsibilities

Lessons· one lesson for each topic, in this order

  1. 1Classes, objects and responsibilities
  2. 2Encapsulation and invariants
  3. 3Abstraction and interfaces
  4. 4Inheritance, used sparingly
  5. 5Polymorphism instead of type checks
  6. 6Composition over inheritance
  7. 7Value objects and immutabilityOptional
  8. 8Modern C#: properties, records and primary constructors

Do this

  • Rewrite one old project class so that all fields are private and every rule is enforced in a method.
  • Replace one if or switch on a type field with an interface and two classes.
  • Refactor one inheritance you wrote for code reuse into composition.
  • Write a small immutable value type, such as Money or Email, with its own validation.
  • Write unit tests that prove your invariants cannot be broken from outside.

Start with· follow one of these

Practise

  • Free exercises in your language with optional human mentoring on design, not just on passing tests

Keep handy

  • Microsoft's C# guide: the object-oriented programming and records sections

Also worth your time

Before moving on: A small domain model you wrote from a one-paragraph brief, such as a library or a clinic, with private state, at least one interface with two implementations, no type switches and composition wherever inheritance was tempting, plus unit tests for its rules.

Tauseef's advice
C# is one of the most object-oriented languages in wide use, and the .NET ecosystem uses interfaces and dependency injection everywhere. Learn records, init-only properties and primary constructors early: they make the right design the short one.

Mark this stage as not done?