Skip to content
IRC-CodingIRC-Coding
Clean CodeSOLIDSRPOCPLSPISPDIP

Clean Code и SOLID: принципы, примеры и вопросы

Clean Code и SOLID: SRP, OCP, LSP, ISP, DIP. Значение, преимущества, недостатки и типичные вопросы.

S

schutzgeist

7 min read
Clean Code и SOLID: принципы, примеры и вопросы

Clean Code и SOLID-принципы

Clean Code - Refactoring, Patterns, Testen und Techniken für sauberen Code: Deutsche Ausgabe

Clean Code - Refactoring, Patterns, Testen und Techniken für sauberen Code: Deutsche Ausgabe

39,99 €

Bei Amazon ansehen

Affiliate-Link: Bei einem Kauf erhalten wir möglicherweise eine Provision.

Clean Code für Dummies: Besser programmieren. Professionelle Softwareentwicklung.

Clean Code für Dummies: Besser programmieren. Professionelle Softwareentwicklung.

24,99 €

Bei Amazon ansehen

Affiliate-Link: Bei einem Kauf erhalten wir möglicherweise eine Provision.

Besser coden: Best Practices für Clean Code. Das ideale Buch für die professionelle Softwareentwicklung

Besser coden: Best Practices für Clean Code. Das ideale Buch für die professionelle Softwareentwicklung

34,99 €

Bei Amazon ansehen

Affiliate-Link: Bei einem Kauf erhalten wir möglicherweise eine Provision.

Эта статья объясняет понятия Clean Code и SOLID, включая экзаменационные вопросы, ключевые элементы и теги.

Коротко

Clean Code - это читаемый, поддерживаемый и надёжный код. SOLID состоит из пяти центральных принципов объектно-ориентированного проектирования.

Краткое описание

Clean Code сосредотачивается на наименовании переменных, структуре, переиспользуемости и небольших, понятных функциях.

SOLID:

  • S (SRP): Класс имеет ровно одну ответственность.
  • O (OCP): Открыт для расширения, закрыт для изменения.
  • L (LSP): Подтипы должны корректно заменять базовые типы.
  • I (ISP): Много маленьких интерфейсов вместо нескольких больших.
  • D (DIP): Зависимости через абстракции, а не конкретные классы.

Ключевые пункты для подготовки к экзамену

  • Clean Code = читаемость и поддерживаемость. Clean Code означает, что исходный код написан так, чтобы его легко было понять, изменить и расширить. Читаемость снижает ошибки и облегчает командную работу.
  • SRP: один класс = одна задача. Single Responsibility Principle гласит, что класс должен иметь только одну ответственность. Если что-то меняется по одной причине, то должен измениться только этот класс.
  • OCP: расширяемость без изменений. Open-Closed Principle предполагает, что классы открыты для расширений, но закрыты для прямых изменений. Новые функции добавляются путём написания кода, а не переделки существующего.
  • LSP: подклассы корректно заменяемы (актуально для экзамена IHK). Liskov Substitution Principle требует, чтобы производный класс в любой момент мог заменить базовый класс без ошибок программы. Это частое экзаменационное задание.
  • ISP: разделение интерфейсов (практика). Interface Segregation Principle гласит, что интерфейсы должны быть небольшими и специализированными. Классы реализуют только те методы, которые им действительно нужны.
  • DIP: зависимость через интерфейсы. Dependency Inversion Principle предполагает, что модули должны зависеть от абстракций, а не от конкретных классов. Это делает код гибким и легко тестируемым.
  • Экономичность: меньше ошибок, быстрее адаптация новичков. Чистый код снижает вероятность ошибок и помогает новым разработчикам быстрее разобраться в проекте. На длительной дистанции это снижает затраты.
  • Документация: принципы в описании архитектуры. Когда Clean Code и SOLID сознательно применяются в проекте, эти решения должны быть отмечены в документации архитектуры. Так все участники видят обоснование.

Основные компоненты

  1. Говорящие имена - переменные, функции и классы должны иметь названия, которые прямо объясняют их назначение. Хорошее имя заменяет множество комментариев и делает код самодокументирующимся.
  2. Инкапсуляция/SRP - инкапсуляция скрывает внутренние детали и защищает данные от несанкционированного доступа. В сочетании с SRP это приводит к небольшим, сфокусированным классам, выполняющим одну задачу.
  3. Наследование по LSP - наследование должно использоваться так, чтобы производные классы могли правильно заменять базовый класс. Это предотвращает неожиданности при полиморфизме.
  4. Избежание God Objects - God Objects - это классы, несущие слишком много ответственности и знающие слишком много других классов. Их следует разделить на меньшие, специализированные классы.
  5. ISP-интерфейсы - интерфейсы должны быть небольшими и семантически связанными. Класс реализует только те интерфейсы, методы которых ему действительно нужны, оставаясь таким образом компактным.
  6. Абстракция/DIP - абстракции, такие как интерфейсы или абстрактные классы, развязывают модули друг от друга. DIP требует, чтобы высокоуровневые модули не зависели от низкоуровневых деталей, а от абстракций.
  7. Unit-тесты - unit-тесты проверяют отдельные компоненты изолированно. Clean Code и SOLID упрощают тестирование, потому что небольшие, развязанные классы легче тестировать с использованием моков.
  8. Рефакторинг - рефакторинг - это непрерывное улучшение существующего кода без изменения его поведения. Рефакторинг сохраняет код поддерживаемым и снижает технический долг.
  9. Диаграммы для пояснения - UML-диаграммы или простые диаграммы классов помогают визуализировать связи и зависимости. Они особенно полезны для описания архитектуры и подготовки к экзаменам.
  10. Инструменты анализа кода (SonarQube) - инструменты типа SonarQube автоматически обнаруживают code smells, сложность и проблемы безопасности. Они помогают командам поддерживать Clean Code и SOLID в повседневной работе.

Пример из практики (SRP)

class ReportPrinter {
  public void print(PDFReport report) {
    // только печать, без создания отчёта
  }
}

Преимущества и недостатки

Преимущества

  • Понятный код
  • Лучшая тестируемость
  • Меньше связанности
  • Структурированная архитектура

Недостатки

  • Более высокие начальные затраты
  • Чрезмерное применение может фрагментировать код

Типичные экзаменационные вопросы (с кратким ответом)

  1. Что означает Clean Code? Читаемый, поддерживаемый код.
  2. Какие SOLID-принципы существуют? SRP, OCP, LSP, ISP, DIP.
  3. Что такое God Object? Класс с слишком большой ответственностью.
  4. Почему DIP важен? Развязывает высокоуровневый код от низкоуровневого.

Свободный ответ

SOLID - это руководства, а не жёсткие правила. На экзамене важно уметь объяснить принцип и обосновать его примером, избегая избыточного проектирования.

Стратегия обучения

  1. Прочитайте небольшие главы про Clean Code.
  2. Рефакторьте собственный код (SRP/LSP).
  3. Сформулируйте по одному примеру для каждого принципа.
  4. Избегайте слишком больших классов.

Анализ темы

  • Суть: OOP, принципы проектирования
  • Сложности: избыточное проектирование
  • Безопасность: меньше скрытых состояний
  • Документация: архитектурные решения
  • Экономичность: меньше ошибок

Дополнительные ссылки

  1. https://refactoring.guru/design-patterns/principles
  2. https://www.sonarsource.com/products/sonarqube/

FAQ: Clean Code и SOLID-принципы

1. Что такое Clean Code?

Clean Code - это исходный код, который легко читать, понимать и поддерживать. Он следует ясным соглашениям, использует говорящие имена и избегает ненужной сложности.

2. Что означает SOLID?

SOLID - это аббревиатура пяти принципов объектно-ориентированного проектирования: Single Responsibility, Open-Closed, Liskov Substitution, Interface Segregation и Dependency Inversion.

3. Что такое Single Responsibility Principle?

Single Responsibility Principle утверждает, что класс должен иметь только одну ответственность. Если есть несколько причин для изменения класса, его следует разделить.

4. Что такое Open-Closed Principle?

Open-Closed Principle утверждает, что классы открыты для расширений, но закрыты для изменений. Новые возможности реализуются путём добавления кода, а не переделки существующего.

5. Что такое Liskov Substitution Principle?

Liskov Substitution Principle требует, чтобы производный класс в любой момент мог заменить базовый класс без ошибок программы. Это важный экзаменационный вопрос.

6. Что такое Interface Segregation Principle?

Interface Segregation Principle утверждает, что интерфейсы должны быть небольшими и специализированными. Классы должны реализовывать только те методы, которые им действительно нужны.

7. Что такое Dependency Inversion Principle?

Dependency Inversion Principle утверждает, что модули должны зависеть от абстракций, а не от конкретных классов. Это делает код гибким и тестируемым.

8. Что такое God Object?

God Object - это класс, несущий слишком большую ответственность и знающий слишком многое о других частях системы. God Objects нарушают SRP и должны быть разделены на меньшие классы.

9. Что такое Code Smell?

Code Smell - это признак возможных проблем в коде, даже если код ещё функционирует. Длинные методы, большие классы и дублированный код - типичные code smells.

10. Что такое рефакторинг?

Рефакторинг - это улучшение существующего кода без изменения его поведения. Цель - сделать код более читаемым, поддерживаемым и тестируемым.

11. Что такое инкапсуляция?

Инкапсуляция скрывает внутренние детали класса и предоставляет только чётко определённый интерфейс наружу. Она защищает данные от несанкционированного доступа и снижает связанность.

12. Что такое связанность?

Связанность описывает, насколько сильно модули зависят друг от друга. Низкая связанность желательна, так как она упрощает изменения, тестирование и переиспользование.

13. Что такое когезия?

Когезия описывает, насколько сильно элементы класса или модуля принадлежат друг другу. Высокая когезия означает, что все части класса способствуют одной ответственности.

14. Что такое unit-тест?

Unit-тест проверяет отдельный компонент изолированно. Clean Code и SOLID упрощают unit-тестирование, так как небольшие, развязанные классы легче тестировать.

15. Что такое Dependency Injection?

Dependency Injection - это техника, при которой зависимости предоставляются извне, а не создаются внутри класса. Она помогает реализовать DIP.

16. Что такое интерфейс?

Интерфейс определяет контракт, который должны выполнять реализующие его классы. Интерфейсы обеспечивают абстракцию и развязывают модули.

17. Что такое полиморфизм?

Полиморфизм позволяет различным классам воспроизводиться через один и тот же интерфейс. Это основа Liskov Substitution Principle.

18. Что такое избыточное проектирование?

Избыточное проектирование - это чрезмерное применение сложных паттернов или принципов там, где достаточно простых решений. SOLID следует применять прагматично, а не догматически.

19. Что такое code review?

Code review - это проверка кода другими разработчиками. При этом проверяют читаемость, соответствие принципам и возможные ошибки.

20. Что такое говорящее имя?

Говорящее имя описывает назначение переменной, функции или класса. Оно делает код самообъясняющимся и снижает потребность в комментариях.

21. Что такое DRY?

DRY означает Do not Repeat Yourself. Это принцип, согласно которому дупликаты в коде должны избегаться, так как повторения затрудняют поддержку и способствуют ошибкам.

22. Что такое KISS?

KISS означает Keep It Simple, Stupid. Это принцип, согласно которому решения должны быть максимально простыми, чтобы избежать ошибок и повысить поддерживаемость.

23. Что такое YAGNI?

YAGNI означает You Ain’t Gonna Need It. Это предупреждение против реализации функций, которые в настоящий момент не требуются, чтобы избежать ненужной сложности.

24. Что такое технический долг?

Технический долг возникает, когда сознательно или бессознательно откладывают чистые решения в пользу быстрых результатов. Его необходимо впоследствии погашать рефакторингом.

25. Что такое SonarQube?

SonarQube - это инструмент анализа кода, который автоматически обнаруживает code smells, баги, уязвимости безопасности и технический долг. Он помогает командам поддерживать Clean Code.

26. Что такое UML-диаграмма классов?

UML-диаграмма классов отображает классы, атрибуты, методы и их связи. Она помогает коммуницировать архитектуру и визуализировать SOLID-принципы.

27. Что такое тестируемость?

Тестируемость описывает, насколько просто отдельный элемент кода можно автоматически тестировать. Clean Code и низкая связанность существенно повышают тестируемость.

28. Что такое поддерживаемость?

Поддерживаемость описывает, насколько просто систему можно изменять, исправлять или расширять. Clean Code и SOLID повышают поддерживаемость, улучшая структуру и читаемость.

29. Что такое архитектурное решение?

Архитектурное решение - это сознательный выбор при структурировании системы. Применение Clean Code и SOLID должно быть отражено в документации архитектуры.

30. Как начать работать с Clean Code и SOLID?

Начните с малого: используйте говорящие имена, сокращайте ответственность классов до одной, пользуйтесь интерфейсами и регулярно проводите рефакторинг. Формулирование по одному примеру для каждого SOLID-принципа помогает в обучении.

Продолжение пути обучения SOLID

Следующая статья в цикле SOLID посвящена SOLID Prinzipien Grundlagen — подробному введению в пять принципов SOLID с примерами кода.

Назад к блогу
Share:

Nächster Artikel in Архитектура программного обеспечения

Weiterlesen
Design Patterns: Singleton, Observer, Factory, Adapter

Похожие статьи