- Identify the aspects of your app that vary and separate them from what stays the same.
- Favor composition over inheritance.
- Program to an interface, not an implementation.
- Loosely coupled designs allow us to build flexible object oriented systems that can handle change because they minimize the inter-dependency between objects.
- Classes should be open for extensions, but closed for modifications.
- Depend upon abstractions. Do not depend upon concrete classes.