ООП та SOLID
22 питань і відповідей у розділі ООП та SOLID.
Питання цього розділу
- Що таке принцип Single Responsibility і як його застосовувати
- Наведіть приклад порушення принципу Single Responsibility
- Що таке принцип Open-Closed?
- Як рефакторити код, що порушує принцип Open-Closed?
- Що таке принцип Liskov Substitution?
- Наведіть приклад порушення принципу Liskov Substitution
- Що таке принцип Interface Segregation?
- Що таке принцип Dependency Inversion?
- Навіщо взагалі потрібні принципи SOLID?
- Що таке композиція і наслідування
- У яких випадках краще використовувати композицію замість наслідування
- Що таке делегування в ООП
- Як принцип Single Responsibility пов’язаний з cohesion
- Що станеться, якщо клас має кілька причин для зміни
- Як SOLID допомагає в тестуванні коду?
- Як принцип Dependency Inversion пов’язаний з Dependency Injection?
- Що таке Law of Demeter (принцип найменшого знання)?
- Як рефакторити God Object (божественний об’єкт)?
- Як принципи SOLID допомагають при розширенні функціоналу?
- Чи можна слідувати всім принципам SOLID одночасно?
- Як визначити, що клас має одну відповідальність?
- Які антипатерни суперечать принципам SOLID?
Навігатор по розділу
22 питання для підготовки до співбесіди на Middle Java Developer.
📋 Усі питання
🗺️ Карта залежностей тем
┌──────────────────────────────────────────┐
│ SOLID БАЗА (1-9) │
│ 1-2. SRP (що + приклад порушення) │
│ 3-4. OCP (що + рефакторинг) │
│ 5-6. LSP (що + приклад порушення) │
│ 7. ISP │
│ 8. DIP │
│ 9. Навіщо SOLID │
└──────────────────┬───────────────────────┘
│
┌──────────────────────────┼──────────────────────────┐
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌────────────────────┐
│ КОМПОЗИЦІЯ │ │ ГЛИБШЕ │ │ ПРАКТИКА │
│ І НАСЛІДУВАННЯ │ │ SRP/DIP │ │ І АНТИПАТЕРНИ │
│ (10-12) │ │ (13-16) │ │ (17-22) │
│ 10. Композиція │ │ 13. SRP + │ │ 17. Law of Demeter │
│ 11. Коли що │ │ cohesion │ │ 18. God Object │
│ 12. Делегув. │ │ 14. Кілька │ │ 19. Розширення │
│ │ │ причин │ │ 20. Всі SOLID разом│
│ │ │ 15. Тестув. │ │ 21. Як визначити │
│ │ │ 16. DIP vs DI │ │ 22. Антипатерни │
└───────────────┘ └───────────────┘ └────────────────────┘
🎯 Рекомендований порядок вивчення
🟢 Рівень Junior (тижні 1-2)
| Крок | Тема | Файли | Мета |
|---|---|---|---|
| 1 | SOLID огляд | Q9 | Навіщо потрібні принципи |
| 2 | SRP | Q1, Q2 | Одна відповідальність, приклади порушення |
| 3 | OCP | Q3 | Відкритий для розширення, закритий для модифікації |
| 4 | Композиція vs наслідування | Q10, Q11 | Чому композиція переважніша |
| 5 | Делегування | Q12 | Як працює делегування |
🟡 Рівень Middle (тижні 3-4)
| Крок | Тема | Файли | Мета |
|---|---|---|---|
| 1 | LSP | Q5, Q6 | Підстановка нащадків, приклади порушення |
| 2 | ISP | Q7 | Не змушуй реалізовувати зайве |
| 3 | DIP | Q8, Q16 | Залежність від абстракцій, зв’язок з DI |
| 4 | SRP + Cohesion | Q13 | Як SRP впливає на зв’язність |
| 5 | Наслідки порушення | Q14, Q15 | Що відбувається при порушенні SRP, як SOLID допомагає тестам |
| 6 | Law of Demeter | Q17 | Принцип найменшого знання |
🔴 Рівень Senior (тижні 5-6)
| Крок | Тема | Файли | Мета |
|---|---|---|---|
| 1 | OCP Refactoring | Q4 (Senior) | Strangler Fig, Strategy, Visitor, SPI |
| 2 | God Object Refactoring | Q18 | Progressive refactoring, Bounded Contexts |
| 3 | SOLID Trade-offs | Q20 | Коли принципи SOLID конфліктують самі з собою |
| 4 | Determining SRP | Q21 | Stakeholder analysis, cross-cutting concerns |
| 5 | Anti-patterns | Q22 | STUPID mnemonic, Speculative Generality |
| 6 | Extending Functionality | Q19 | YAGNI, Strangler Fig |
🔗 Ключові зв’язки між темами
Тема: Принципи SOLID
Q9 (Навіщо SOLID) → Q1 (SRP) → Q3 (OCP) → Q5 (LSP) → Q7 (ISP) → Q8 (DIP)
↓
Q13 (SRP+Cohesion) → Q14 (Кілька причин) → Q15 (Тестування)
Ключові зв’язки:
- Q9 ↔ Q22: SOLID захищає від STUPID антипатернів
- Q1 ↔ Q13: SRP → висока cohesion → менше LCOM
- Q3 ↔ Q4: OCP концепція → рефакторинг до OCP
- Q5 ↔ Q6: LSP теорія → конкретні приклади порушення (Date, SavingsAccount)
Тема: Композиція і наслідування
Q10 (Композиція vs наслідування) → Q11 (Коли що) → Q12 (Делегування)
Ключові зв’язки:
- Q10 ↔ Q11: Концепція → практичні правила вибору
- Q11 ↔ Q8: Композиція → DIP (залежимо від інтерфейсу, не реалізації)
- Q12 ↔ Q10: Делегування = механізм композиції
Тема: Практика та антипатерни
Q17 (Law of Demeter) → Q18 (God Object) → Q22 (Антипатерни)
↓ ↓
Q19 (Розширення) → Q20 (Всі SOLID) → Q21 (Як визначити SRP)
Ключові зв’язки:
- Q17 ↔ Q18: Train Wreck → God Object → рефакторинг
- Q18 ↔ Q22: God Object — один із STUPID антипатернів
- Q19 ↔ Q4: Розширення функціоналу → OCP рефакторинг
- Q20 ↔ Q9: Trade-offs SOLID → навіщо вони потрібні
🎓 Шпаргалка: що знати для кожного рівня
🟢 Junior
- SRP: одна причина для зміни = один стейкхолдер
- OCP: додавай нові класи, не змінюй старі
- Композиція > наслідування: has-a краще за is-a
- DIP: залеж від інтерфейсів, не від реалізацій
- ISP: не змушуй реалізовувати непотрібні методи
🟡 Middle
- LSP: нащадок не повинен посилювати передумови чи послаблювати постумови
- Cohesion: SRP → висока зв’язність, LCOM метрика
- Law of Demeter: не розмовляй з незнайомцями (a.b.c() = Train Wreck)
- DI vs DIP: DI — механізм, DIP — архітектурне правило
- Делегування: чорний ящик, тільки публічний інтерфейс
🔴 Senior
- OCP refactoring: Strangler Fig, Strategy, Visitor, SPI
- God Object refactoring: Progressive refactoring, Bounded Contexts, Saga
- SOLID trade-offs: коли принципи конфліктують (SRP vs DIP, OCP vs YAGNI)
- Megamorphic calls: 3+ реалізації інтерфейсу → деградація продуктивності
- sealed interface (Java 17+): pattern matching, компілятор гарантує повноту
- STUPID: Singleton, Tight Coupling, Premature Optimization, Indescriptive Naming, Duplication
📝 Формат кожного файлу
Кожен файл містить:
- 🟢 Junior Level — базове розуміння, прості аналогії, приклади
- 🟡 Middle Level — внутрішності, типові помилки, практичні приклади
- 🔴 Senior Level — deep dive, edge cases, production experience, monitoring
- 🎯 Шпаргалка для інтерв’ю — ключові тези, часті питання, червоні прапорці, пов’язані теми