Раздел 18 · 22 вопросов

ООП и SOLID

22 вопросов и ответов в разделе ООП и SOLID.

Russian ООП и 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
  • 🎯 Шпаргалка для интервью — ключевые тезисы, частые вопросы, красные флаги, связанные темы