Архив рубрики ~Лента новостей~

Принципы SOLID: зачем они нужны и как применять на практике

Принципы SOLID: зачем они нужны и как применять на практике

Принципы SOLID: зачем они нужны и как применять на практике

Принципы SOLID: зачем они нужны и как применять на практике

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

Что такое принципы SOLID?

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

Расшифровка аббревиатуры SOLID:

    S — Single Responsibility Principle (Принцип единственной ответственности)O — Open/Closed Principle (Принцип открытости/закрытости)L — Liskov Substitution Principle (Принцип подстановки Барбары Лисков)I — Interface Segregation Principle (Принцип разделения интерфейса)D — Dependency Inversion Principle (Принцип инверсии зависимостей)

Принципы SOLID: зачем они нужны и как применять на практике

Курс изучения Java

Можете пройти наш бесплатный курс по изучению Java

Single Responsibility Principle (SRP)

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

Пример нарушения SRP:

class Report { public String generateReport() { // Логика генерации отчета } public void saveToFile(String filename) { // Логика сохранения отчета в файл } }

Здесь класс и генерирует отчет, и сохраняет его на диск. Лучше вынести сохранение в отдельный класс.

Как исправить:

class Report { public String generateReport() { // Логика генерации отчета } } class ReportSaver { public void saveToFile(Report report, String filename) { // Логика сохранения отчета } }

Open/Closed Principle (OCP)

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

Плохой пример:

class AreaCalculator { public double calculateArea(Object shape) { if (shape instanceof Circle) { // Вычисление площади круга } else if (shape instanceof Square) { // Вычисление площади квадрата } return 0; } }

При добавлении новой фигуры придётся менять код калькулятора. Это нарушает принцип OCP.

Хороший пример:

interface Shape { double calculateArea(); } class Circle implements Shape { public double calculateArea() { // Площадь круга } } class Square implements Shape { public double calculateArea() { // Площадь квадрата } } class AreaCalculator { public double calculateArea(Shape shape) { return shape.calculateArea(); } }

Liskov Substitution Principle (LSP)

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

Пример нарушения LSP:

class Bird { public void fly() { // Птица летит } } class Penguin extends Bird { @Override public void fly() { throw new UnsupportedOperationException(«Пингвины не умеют летать»); } }

Пингвин не умеет летать, значит, наследование от Bird некорректно. Нужно пересмотреть иерархию.

Как исправить:

interface Bird { void eat(); } interface FlyingBird extends Bird { void fly(); } class Sparrow implements FlyingBird { public void fly() { // Воробей летит } public void eat() { // Воробей ест } } class Penguin implements Bird { public void eat() { // Пингвин ест } }

Принципы SOLID: зачем они нужны и как применять на практике

Курс изучения Java

Interface Segregation Principle (ISP)

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

Плохой пример:

interface Worker { void work(); void eat(); } class Robot implements Worker { public void work() { // Робот работает } public void eat() { // Робот не ест } }

Роботы не едят, значит, их заставляют реализовать ненужный метод.

Хороший пример:

interface Workable { void work(); } interface Eatable { void eat(); } class Human implements Workable, Eatable { public void work() { // Человек работает } public void eat() { // Человек ест } } class Robot implements Workable { public void work() { // Робот работает } }

Dependency Inversion Principle (DIP)

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

Плохой пример:

class LightBulb { public void turnOn() {} public void turnOff() {} } class Switch { private LightBulb bulb; public Switch(LightBulb bulb) { this.bulb = bulb; } public void operate() { // Управление лампочкой } }

Переключатель жёстко связан с конкретной реализацией лампочки.

Хороший пример:

interface Switchable { void turnOn(); void turnOff(); } class LightBulb implements Switchable { public void turnOn() {} public void turnOff() {} } class Switch { private Switchable device; public Switch(Switchable device) { this.device = device; } public void operate() { // Управление устройством } }

Заключение

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

Источник

❌ Нет тегов для этой статьи

Оцените материал:

Читайте также
Архив рубрики ~Обо всем~ Новые очки Snap громоздкие, дорогие, и мне действительно нужно их попробовать. Архив рубрики ~Обо всем~ Я создал 11 моделей для прогнозирования результатов чемпионата мира по футболу 2026 года. По их результатам будут определены четыре разных чемпиона. Архив рубрики ~Коротко из Telegram~ 🚨 На конференции AgentCon спикеры призвали разработчиков перестать использовать ИИ… Архив рубрики ~Коротко из Telegram~ Скидываем рутину на ИИ как профи — появился сайт с… Архив рубрики ~Обо всем~ На Лондонской неделе технологий Великобритания представила план развития инфраструктуры искусственного интеллекта – каковы его результаты? Архив рубрики ~Обо всем~ [Перевод] Эксперименты с водородом поставили под сомнение гипотезу о квантовых червоточинах Архив рубрики ~Обо всем~ Модули памяти DDR5 продолжают дорожать, но с нюансом Архив рубрики ~Обо всем~ Компания Commodore выпустила телефон-раскладушку, позволяющий отказаться от социальных сетей. Новости робототехники Репортаж с ICRA 2026 из Вены Архив рубрики ~Обо всем~ Компания SpaceX покупает стартап Cursor, занимающийся разработкой программного обеспечения для искусственного интеллекта, за 60 миллиардов долларов. Новости робототехники Интернет Архив рубрики ~Обо всем~ Китайские материаловеды разработали санскрин для перовскитных солнечных элементов. Больше всего от излучения страдал тонкий транспортный слой Архив рубрики ~Обо всем~ Формула-1 в Испании: Стратегическая борьба в старом стиле по-прежнему может быть захватывающей. Новости робототехники Морские хищники: новейшие российские БЭКи и подводные дроны представили в Кронштадте Архив рубрики ~Обо всем~ Новые очки Snap громоздкие, дорогие, и мне действительно нужно их попробовать. Архив рубрики ~Обо всем~ Я создал 11 моделей для прогнозирования результатов чемпионата мира по футболу 2026 года. По их результатам будут определены четыре разных чемпиона. Архив рубрики ~Коротко из Telegram~ 🚨 На конференции AgentCon спикеры призвали разработчиков перестать использовать ИИ… Архив рубрики ~Коротко из Telegram~ Скидываем рутину на ИИ как профи — появился сайт с… Архив рубрики ~Обо всем~ На Лондонской неделе технологий Великобритания представила план развития инфраструктуры искусственного интеллекта – каковы его результаты? Архив рубрики ~Обо всем~ [Перевод] Эксперименты с водородом поставили под сомнение гипотезу о квантовых червоточинах Архив рубрики ~Обо всем~ Модули памяти DDR5 продолжают дорожать, но с нюансом Архив рубрики ~Обо всем~ Компания Commodore выпустила телефон-раскладушку, позволяющий отказаться от социальных сетей. Новости робототехники Репортаж с ICRA 2026 из Вены Архив рубрики ~Обо всем~ Компания SpaceX покупает стартап Cursor, занимающийся разработкой программного обеспечения для искусственного интеллекта, за 60 миллиардов долларов. Новости робототехники Интернет Архив рубрики ~Обо всем~ Китайские материаловеды разработали санскрин для перовскитных солнечных элементов. Больше всего от излучения страдал тонкий транспортный слой Архив рубрики ~Обо всем~ Формула-1 в Испании: Стратегическая борьба в старом стиле по-прежнему может быть захватывающей. Новости робототехники Морские хищники: новейшие российские БЭКи и подводные дроны представили в Кронштадте