Найти тему

Принципы SOLID с объяснением и примерами на Java и Python

Оглавление

Принципы SOLID — это набор из пяти ключевых принципов разработки программного обеспечения (не путать с принципами ООП), которые помогают разработчикам создавать гибкие и поддерживаемые программные системы. Эти принципы были предложены Робертом Мартином и широко используются в профессиональной разработке ПО для улучшения архитектуры систем.

Рассмотрим каждый принцип с примерами на Java и Python.

1. Single Responsibility Principle (SRP)

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

Зачем это нужно:

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

Что будет, если не соблюдать:

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

Простое объяснение:

Если вы попытаетесь смешать несколько рецептов в одной кастрюле одновременно (например, варить суп и делать пирог), то результат будет непредсказуемым и вряд ли вкусным.

Пример на Java:

Нарушение принципа:

Исправляем:

-2

Пример на Python:

нарушение принципа:

-3

Исправляем:

-4

2. Open/Closed Principle (OCP)

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

Зачем это нужно:

Код должен быть открыт для расширения (легко добавлять новые функции), но закрыт для изменения. Это означает, что можно добавлять новые возможности без изменения существующего кода.

Что будет, если не соблюдать:

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

Простое объяснение:

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

Пример на Java:

Нарушение принципа:

-5

Исправляем:

-6

Пример на Python:

Нарушение принципа:

-7

Исправляем:

-8

3. Liskov Substitution Principle (LSP)

Принцип подстановки Барбары Лисков гласит, что объекты базового класса должны заменяться объектами его подклассов без нарушения поведения программы.

Зачем это нужно:

Этот принцип говорит, что объекты подклассов должны заменять объекты их базового класса без изменения логики программы. Это помогает сохранять предсказуемость программы при использовании наследования.

Что будет, если не соблюдать:

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

Простое объяснение:

Представьте, что вы заменили свою машину на другую модель, но у нее педаль тормоза неожиданно делает что-то другое (например, включает радио). Вы бы запутались и, вероятно, попали бы в аварию.

Пример на Java:

Нарушение принципа:

-9

Исправляем:

-10

Пример на Python:

Нарушение принципа:

-11

Исправляем:

-12

4. Interface Segregation Principle (ISP)

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

Зачем это нужно:

Клиенты (классы) не должны быть вынуждены реализовывать интерфейсы, которые они не используют. Лучше создавать маленькие и специализированные интерфейсы для разных задач, чем один большой интерфейс.

Что будет, если не соблюдать:

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

Простое объяснение:

Представьте, что вы купили пульт от телевизора, на котором есть кнопки для управления кухонной плитой, стиральной машиной и тостером. Это сбивает с толку и делает пульт трудным в использовании.

Пример на Java:

Нарушение принципа:

-13

Исправляем:

-14

Пример на Python:

Нарушение принципа:

-15

Исправляем:

-16

5. Dependency Inversion Principle (DIP)

Принцип инверсии зависимостей утверждает, что высокоуровневые модули не должны зависеть от низкоуровневых модулей. Оба должны зависеть от абстракций. Абстракции не должны зависеть от деталей, детали должны зависеть от абстракций.

Зачем это нужно:

Высокоуровневый код (который управляет бизнес-логикой) не должен зависеть от низкоуровневого кода (который выполняет конкретные действия, например, взаимодействие с базой данных). Оба должны зависеть от абстракций (интерфейсов). Это делает систему гибкой и легко изменяемой.

Что будет, если не соблюдать:

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

Простое объяснение:

Представьте, что в ресторане шеф-повар готовит блюда только на одной плите. Если плита сломается, весь ресторан закроется. Но если у ресторана есть множество плит (абстракция), то поломка одной из них не станет катастрофой — можно легко переключиться на другую.

Пример на Java:

Нарушение принципа:

-17

Исправляем:

-18

Пример на Python:

Нарушение принципа:

-19

Исправление:

-20

Заключение:

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

Итак, зачем придерживаться SOLID принципов?

  1. Код становится проще и чище. Легче понять, что делает каждый класс, и вносить изменения.
  2. Меньше ошибок. Когда код легко расширять и тестировать, вы реже будете сталкиваться с неожиданными сбоями.
  3. Легче масштабировать и изменять систему. Если проект становится больше, система не ломается, потому что каждый компонент хорошо изолирован.
  4. Упрощение командной работы. Каждый разработчик понимает, что делает каждый компонент, и может легко работать с ним.

Что будет, если не придерживаться SOLID?

  1. Запутанный код. Будет трудно понять, за что отвечает каждый класс, и любые изменения будут сопряжены с риском.
  2. Частые ошибки. Любое изменение может вызвать цепную реакцию ошибок, потому что изменения в одном месте будут затрагивать другие части системы.
  3. Трудности с поддержкой. В будущем вам и вашим коллегам будет сложно добавлять новые функции или исправлять баги, так как код будет сильно связан между собой.

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

-21

Вместо оглавления. Что вы найдете на канале QA Helper - справочник тестировщика?

Не забудьте подписаться на канал, чтобы не пропустить полезную информацию: QA Helper - справочник тестировщика

Пишите в комментариях какой пункт было бы интересно рассмотреть более подробно.

Обязательно прочитайте: Что должен знать и уметь тестировщик

Также будет интересно почитать: Вопросы которые задают на собеседовании тестировщикам