SOLID
1. Single responsibility - разделяй всё на мелкие сущности, чтобы у каждой была одна причина для изменения.
2. Open closed - закрыт для изменений, открыт для расширений. Для расширения использовать наследование.
3. Liskov substitution - любой производный класс должен выполнять тот же объем методов, что и базовый класс. (Самолёт и машина передвигаются, топливо, металлические, но не одно и тоже)
4. Interface segregation - программные сущности не должны зависеть от методов, которые они не используют. Разбивать крупные интерфейсы на мелкие.
5. Dependency Inversion - Классы высокого уровня не должны зависеть от классов низкого уровня. И те и другие должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.