Michael Kennedy's session in SoCal codecamp, "Five Fundamental Object Oriented Design Principles for Agile Development" discussed the following postulates of class design mentioned in several Fowler’s Refactoring with examples.
- Single Responsibility Principle (SRP)
- Classes should not have more than one focus of responsibility.
- Open/Closed Principle (OCP)
- Class should be open for extending, but closed for modification.
- Liskov Substitution Principle (Design by Contract)
- Subtypes must be substitutable for their base types.
- Dependency Inversion Principle (DIP)
- Don't have high-level code directly call/inherit from library but use interfaces.
- Interface Segregation Principle
- Clients should not be forced to depend on methods (inherit from or implement) they don't use.
These are just one line summaries. Details can be found on links specified below. I found Barbara Liskov’s “Liskov Substitution Principle” most interesting as it has transitioned from this:
Let q(x) be a property provable about objects x of type T. Then q(y) should be true for objects y of type S where S is a subtype of T.[1]
To this
Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it [2]
To this
In class hierarchies, it should be possible to treat a specialized object as if it were a base class object. [3]
Refactoring: Improving the Design of Existing Code by Martin Fowler, et al
Agile Software Development, Principles, Patterns, and Practices by Robert C. Martin
Principles of Object-Oriented Design