SOLID principles

Single responsibility principle

This mean if the one thing in specification is changed you only need to change the code in the single place or class

Open/closed principle

Software should be open for extension, but closed for modification.

Liskov substitution principle

Objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program.

Interface segregation principle

The interfaces should be small and provide as little methods as possible.

Dependency inversion principle

The lower module must not depends on higher module. In order to achieve this the code must to relay on abstractions (in other words the code has to use interfaces/protocols)