Modular DesignLaws and Principles
in OOP and FP
Cohesion
Coupling
Cohesion
Coupling
1972
?
● Coincidental Cohesion: unrelated elements
● Temporal Cohesion: operations performed at the same time, e.g. initialization
● Sequential Cohesion: operations form a pipeline - one's output is another's input
● Informational Cohesion: operations are performed on the same data structure
● Functional Cohesion: all elements realize a single, well-defined task, e.g. a function
Cohesion levels
● Content Coupling: a module uses/alters data in another module
● Global-data Coupling: two modules communicate via global data
● Data-structure Coupling:communicate via data structure passed as a parameter (more information than needed)
● Data Coupling: communicate via parameter passing (minimal information)
● No Coupling: independent modules
Coupling levels
A modular unit of code...
● serves a clear purpose
● easy to use
● easy to extend
● easy to replace
● survives outside changes
Single Responsibility
Liskov Substitution
Interface Segregation
Open-Closed Principle
Dependency Inversion
Elements inside a package...
● are used together
● change together
Common Reuse Principle
Common Closure Principle
Packages should...
● be as stable as they are abstract
● depend on more stable packages
● not have cycles
Stable Abstractions Principle
Stable Dependencies Principle
Acyclic Dependencies Principle
The Law of Demeter
"the principle of least knowledge"
A
B
E G
F
DC
B
E
The Demeter Project
Train Wreckclient.getMortgage().paymentCollection().getNextPayment().applyPayment(300.0)
(update-in client [:mortgage :payments] conj (payment 300.0))
wiki.c2.com/?TrainWreck
Tell don’t ask
Feature Envy
in conclusion
Top Related