- SRP - single responsibility principle.
- OCP - Open / Close principle.
- LSP - Liskov substitution principle.
- ISP - Interface segregation principle.
- DIP - Dependency inversion principle.
- Rigidity - Ригідність, висока ціна внесення однієї зміни.
- Fragility - Крихкість, невеликі зміни в одному модулі викликають помилки у інших модулях.
- Immobility - Нерухомість, компоненти не можна використати повторно в інших системах.
- Viscosity - В'язкість, додавання однієї фічі викликає необхідність робиратись з багатьма аспектами.
Принцип єдиної відповідальності - кожен об'єкт повинен мати єдину відповідальність, і ця відповідальність повинна бути інкапсульованою класом. Простіше кажучи, один клас має робити щось одне.
Використання SRP веде до появи багатьох маленьких класів, між якими буває складно розібратись.
Прикладом SRP є використання патерну Фасад, де у класу є лише одна відповідальність - забезпечити простий інтерфейс для клієнта.
Елементи системи мають бути відкриті для розширення, але закриті для змін. Потрібно мати можливість вносити зміни додаючи новий код, а не змінюючи існуючий.
Паттерн Декоратор є прикладом застосування OCP, де паттерн додає нову поведінку до об'єкту без зміни оригінального коду.
Якщо S є підтипом T, то об'єкти типу T можуть бути замінені об'єктами типу S, без зміни властивостей програми. Або, підтипи мають бути сумісні з базовими типами. Іншими словами, функції, які використовують посилання на базовий клас, повинні мати можливість використовувати дочірній клас, не знаючи про це.
Простішими словами: батьківський клас можна замінити на дочірній без зміни властивостей програми.
Клієнти не повинні залежати від методів, які вони не використовують. Або, в інтерфейсі повинні бути лише методи пов'язані з конкретною задачею.
Високорівневі модулі не повинні (на пряму) залежати від низькорівневих. Обидва типи модулів повинні залежати від абстракцій (інтерфейсів та абстрактних клас). Високорівнева політика не повинна залежати від низькорівневих деталей.
По простому, між високорівневими та низькорівневими модулями має бути інтерфейс.
Прикладом DIP є паттерн Фабричний метод, який дозволяє створювати об'єкти через інтерфейс, а не напряму.