Conflicts and limits — deciding which one to take
The five principles pull against each other. Push splitting and a change touches more files; interpose an abstraction and it takes more steps to trace what actually runs. This chapter covers how to decide when they conflict, and modern criticism of SOLID itself.
SOLID is not a single theory — where the five principles came from
The five SOLID principles were not born at the same time. Read the original text Martin published in 2000 and what you find are four principles of class design and six of package design, with SRP not among them. This chapter covers what the acronym hid.
SOLID principles
Explains the five SOLID principles of object-oriented design (single responsibility / open-closed / Liskov substitution / interface segregation / dependency inversion) with TypeScript examples. Deepen your understanding with a Bad / Good comparison for each principle.
SOLID Principles in Depth
A seven-chapter series that digs into the five SOLID principles across three layers, why you follow them, when it's OK to break them, and how they get misused. Each chapter goes to the original text of the principle and covers how it is reassessed today.
The dependency inversion principle — who owns the abstraction
DIP, DI, and IoC are separate concepts. Passing dependencies in from outside does not by itself invert anything. This chapter confirms from the original text what actually inverts, and which module the abstraction should belong to.
The interface segregation principle — half the motivation depends on the language
ISP has two motivations, avoiding recompilation and a design concern, and the former does not exist in TypeScript in its original form. In a structural type system you can satisfy ISP without carving out an interface.
The Liskov substitution principle — the types pass, the contract does not hold
LSP says a derived type must be substitutable for its base type, but the criterion for deciding substitutability lies in the contract. This chapter covers the four items the original text set out, precondition, postcondition, invariant, and history property, and how far the type checker is actually looking.
The open–closed principle — the cost when the prediction is wrong
OCP asks you to prepare extension points in advance, but misread the direction of extension and you are left with a wrong abstraction. This chapter confirms what the original text named as the means of achieving it, and covers how to judge its conflict with YAGNI.
The single responsibility principle — who "a reason to change" refers to
SRP's definition of "one reason to change" is subjective, and the granularity of the split shifts with every reader. This chapter covers what Martin meant when he later stated that this principle is about people, and what you lose when you split too far.