Why Every Single Element
of SOLID is Wrong!
Dan North
@tastapod
Slide 2
Slide 2 text
Single Responsibility
Open/Closed
Liskov Substitution
Interface Segregation
Dependency Inversion
Slide 3
Slide 3 text
Single Responsibility Principle
“one reason to change”
“only do one thing”
Slide 4
Slide 4 text
Single Responsibility Principle
What is a single responsibility anyway?
ETL: three responsibilities or one?
How can you predict what is going to change?
Pointlessly Vague Principle
Slide 5
Slide 5 text
Single Responsibility Principle
Simple code is easy to reason about
Can easily do several related things
Refactor until it Fits In Your Head
Write simple code
Slide 6
Slide 6 text
Open-Closed Principle
Open for extension, closed for modification
“When requirements change,
extend behaviour by adding new code,
not changing code that works”
Slide 7
Slide 7 text
Open-Closed Principle
Open for extension, closed for modification
“When requirements change,
the existing code is now wrong!
so replace it with code that works”
Cruft Accretion Principle
Slide 8
Slide 8 text
Open-Closed Principle
Simple code is easy to change
Simple code is easy to test
Simple code is both open and closed
Write simple code!
Slide 9
Slide 9 text
Liskov Substitution Principle
“Strong behavioural subtyping”
Substitution with a subtype preserves all
“desirable properties” of the original type
“Provably undecidable” but useful
Slide 10
Slide 10 text
Liskov Substitution Principle
“There is nothing quite so useless, as doing with great
efficiency, something that should not be done at all.”
Stuck in is-a and has-a modelling mindset
Drucker’s Warning Principle
Slide 11
Slide 11 text
Liskov Substitution Principle
What about acts-like-a, can-be-used-as-a?
Composition is simpler than inheritance
Try to avoid object hierarchies altogether
Write simple code!
Slide 12
Slide 12 text
Interface Segregation Principle
Many small interfaces are better than one big object
Design small, role-based interfaces
No client depends on methods it doesn’t use
Slide 13
Slide 13 text
Interface Segregation Principle
Practically anything is better than one big object
Design small, role-based classes
No client depends on methods it doesn’t use
Stable Door Principle
This is already true!! —>
Slide 14
Slide 14 text
Interface Segregation Principle
Don’t write big objects in the first place!
Write code that Fits In Your Head
If a class needs lots of interfaces, simplify the class!
Write simple code!
Slide 15
Slide 15 text
Dependency Inversion Principle
High-level modules should not depend on
lower-level modules
Abstractions (e.g. interfaces) should not depend on
details (e.g. concrete implementations)
Slide 16
Slide 16 text
Dependency Inversion Principle
Reuse is overrated, design for use!
DIP leads to a different kind of dependency,
dependency on DI frameworks!
Wrong Goal Principle
Slide 17
Slide 17 text
Dependency Inversion Principle
See how far you get combining simple classes
new is the new new!
Assemble into small components that Fit In Your Head
Write simple code!
Slide 18
Slide 18 text
Single Responsibility
Open/Closed
Liskov Substitution
Interface Segregation
Dependency Inversion
Slide 19
Slide 19 text
Single Responsibility
Open/Closed
Liskov Substitution
Interface Segregation
Dependency Inversion
Too much to remember!