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