OO Design Principles#
Principles: Why? Which?#
Every handcraft has rules, on every single level, which everybody agrees upon
Our handcraft is no exception
On the design level: Design Principles
S: Single Responsibility
O: Open/Closed
L: Liskov Substitution
I: Interface Segregation
D: Dependency Inversion
⟶ SOLID (for people who find it hard to remember rules)
Antipattern: a pattern that violates any of these principles
Single Responsibility#
Every class must have responsibility over a single part of the program.(Robert C. Martin, at around 2000)Every class must do one thing and should do that well.(Jörg Faschingbauer (Unix addict), all the time)
Consequences:
Understanding is easier
Documenting is easier
Defining/writing tests is easier
Open/Closed#
Software entities must be open for extension, but closed for modification.(Bertrand Meyer, 1988)
Interpretations/consequences:
Adding functionality not by modifying but by adding (e.g. plugins)
Heavy use of interfaces
Liskov Substitution#
It must be possible in a program to exchange two implementations ofan interface without compromising the correctness of the program.(Barbara Liskov, 1995)
Classical violation of Liskow’s principle: square/rectangle
A rectangle is defined as a pair (width, height), each of which is modifiable separately
Can a square be seen as a rectangle then?
Consequences:
No special cases in user code
Polished interfaces
Interface Segregation#
No client of an interface should be forced to depend on methods it does not use.(Robert C. Martin (again), at around 2000)
Dependency Inversion#
* High-level modules should not depend on low-level modules. Both should depend on abstractions.* Abstractions should not depend upon details. Details should depend upon abstractions.(Robert C. Martin (again), at around 2000)