Розділ 18 · 22 питань

ООП та SOLID

22 питань і відповідей у розділі ООП та SOLID.

Ukrainian ООП та SOLID Вихідний Markdown
Мовні версії: English Russian Ukrainian

Питання цього розділу

  1. Що таке принцип Single Responsibility і як його застосовувати
  2. Наведіть приклад порушення принципу Single Responsibility
  3. Що таке принцип Open-Closed?
  4. Як рефакторити код, що порушує принцип Open-Closed?
  5. Що таке принцип Liskov Substitution?
  6. Наведіть приклад порушення принципу Liskov Substitution
  7. Що таке принцип Interface Segregation?
  8. Що таке принцип Dependency Inversion?
  9. Навіщо взагалі потрібні принципи SOLID?
  10. Що таке композиція і наслідування
  11. У яких випадках краще використовувати композицію замість наслідування
  12. Що таке делегування в ООП
  13. Як принцип Single Responsibility пов’язаний з cohesion
  14. Що станеться, якщо клас має кілька причин для зміни
  15. Як SOLID допомагає в тестуванні коду?
  16. Як принцип Dependency Inversion пов’язаний з Dependency Injection?
  17. Що таке Law of Demeter (принцип найменшого знання)?
  18. Як рефакторити God Object (божественний об’єкт)?
  19. Як принципи SOLID допомагають при розширенні функціоналу?
  20. Чи можна слідувати всім принципам SOLID одночасно?
  21. Як визначити, що клас має одну відповідальність?
  22. Які антипатерни суперечать принципам SOLID?

Навігатор по розділу

22 питання для підготовки до співбесіди на Middle Java Developer.


📋 Усі питання

# Питання Рівень складності
1 Що таке принцип Single Responsibility і як його застосовувати
2 Наведіть приклад порушення принципу Single Responsibility ⭐⭐
3 Що таке принцип Open_Closed ⭐⭐
4 Як рефакторити код, що порушує принцип Open_Closed ⭐⭐⭐
5 Що таке принцип Liskov Substitution ⭐⭐
6 Наведіть приклад порушення принципу Liskov Substitution ⭐⭐⭐
7 Що таке принцип Interface Segregation ⭐⭐
8 Що таке принцип Dependency Inversion ⭐⭐
9 Навіщо взагалі потрібні принципи SOLID ⭐⭐
10 Що таке композиція і наслідування ⭐⭐
11 В яких випадках краще використовувати композицію замість наслідування ⭐⭐
12 Що таке делегування в ООП ⭐⭐
13 Як принцип Single Responsibility пов’язаний з cohesion ⭐⭐⭐
14 Що станеться, якщо клас має кілька причин для зміни ⭐⭐
15 Як SOLID допомагає в тестуванні коду ⭐⭐
16 Як принцип Dependency Inversion пов’язаний з Dependency Injection ⭐⭐
17 Що таке Law of Demeter (принцип найменшого знання) ⭐⭐
18 Як рефакторити God Object (божественний об’єкт) ⭐⭐⭐
19 Як принципи SOLID допомагають при розширенні функціоналу ⭐⭐
20 Чи можна слідувати всім принципам SOLID одночасно ⭐⭐⭐
21 Як визначити, що клас має одну відповідальність ⭐⭐
22 Які антипатерни суперечать принципам SOLID ⭐⭐

🗺️ Карта залежностей тем

                    ┌──────────────────────────────────────────┐
                    │   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
  • 🎯 Шпаргалка для інтерв’ю — ключові тези, часті питання, червоні прапорці, пов’язані теми