3. Liskov substitution principle - “objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program.”
4. Interface segregation principle - “many client-specific interfaces are better than one general-purpose interface.
5. Dependency inversion principle - one should “Depend upon Abstractions. Do not depend upon concretions.