Хватит пихать паттерны куда попало: как неправильное понимание ООП превращает ваш код в легаси

Пост опубликован в блогах iXBT.com, его автор не имеет отношения к редакции iXBT.com

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

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

Ловушка первая: «Всё вокруг — объект»
Понимание архитектуры
Понимание архитектуры
Автор: Qwen AI

Главная беда начинающих программистов, которые начитались учебников — это попытка смоделировать реальный мир один в один через классы и наследование. В учебниках нам пишут: «Класс — это чертеж Машины, а объекты — это конкретные Жигули и Мерседес».

В реальном промышленном коде это не работает. Пытаясь натянуть эту аналогию на бизнес-логику, разработчик создает гигантские иерархии наследования. Появляется условный BaseVehicle, от него AbstractCar, от него PassengerCar… А через полгода выясняется, что в проект нужно добавить электросамокат, который вообще не вписывается в эту цепочку, потому что у него нет коробки передач, но есть батарея.

Как надо на самом деле: Забудьте про наследование реального мира. Наследование в ООП нужно использовать только тогда, когда вам критически необходимо полиморфное поведение, либо жестко соблюдается принцип подстановки Барбары Лисков (LSP). Во всех остальных случаях используйте композицию — собирайте объект из мелких независимых интерфейсов, как конструктор Лего.

Ловушка вторая: Архитектурный оверинжиниринг (Overengineering)

Это классическая болезнь программистов, которые только-только освоили паттерны проектирования. Им сразу хочется применить их ВСЕ и желательно в одном месте. Вместо того чтобы написать простую функцию, которая берет данные из базы и отдает их пользователю, разработчик начинает городить огород:

  • Создает DataServiceFactory
  • Пишет AbstractDataRepository
  • Оборачивает всё в паттерн «Стратегия» (на случай, если завтра база данных сменится с PostgreSQL на Oracle — спойлер: не сменится никогда)
  • Добавляет «Наблюдателя» (Observer) для логирования каждого чиха

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

Паттерны, которые чаще всего используют не к месту

Давайте разберем три паттерна, которыми программисты грешат чаще всего:

  1. Singleton (Одиночка). Самый любимый и самый токсичный паттерн. Новички пихают его везде, где нужен глобальный доступ к объекту (например, к настройкам или базе). В итоге Singleton превращается в скрытую глобальную переменную. Код становится намертво связанным, а написать для такого класса модульные тесты (Unit-тесты) — это отдельный вид мазохизма, потому что объект хранит состояние между тестами.
  2. Factory Method (Фабричный метод). Отличный паттерн, если у вас реально есть динамически меняющиеся типы объектов. Но если у вас в системе всего два вида пользователей (Клиент и Админ) и их список не изменится в ближайшие три года, создавать под них абстрактные фабрики — это пустая трата рабочего времени и усложнение кода на ровном месте.
  3. Command (Команда). Превращать каждое банальное действие пользователя в отдельный класс «Команды» ради абстракции — прямой путь к раздуванию кодовой базы.
Как проектировать код и не сойти со ума?

Паттерны проектирования — это не священное писание. Это просто типовые паттерны для решения конкретных проблем. Если у вас нет этой проблемы прямо сейчас — вам не нужен этот паттерн. Держите в голове три главных правила чистого кода:

  • KISS (Keep It Simple, Stupid): делайте код максимально простым. Если задачу можно решить обычной понятной функцией без создания пяти классов — решите её функцией. Тот, кто будет читать ваш код после вас, скажет спасибо.
  • YAGNI (You Ain't Gonna Need It): вам это не понадобится. Не пишите код про запас. Не закладывайте в архитектуру гибкость «на будущее», если этого будущего нет в текущем техзадании. Код должен решать задачу, которая стоит перед вами сегодня.
  • Читаемость бьет абстракцию: архитектура хороша не тогда, когда в ней применены все паттерны из книги, а тогда, когда сторонний программист может открыть ваш проект и за 15 минут понять, как там всё устроено.

А как вы относитесь к паттернам? Замечали за собой или коллегами желание переусложнить архитектуру на ровном месте? Делитесь в комментариях примерами самого дикого оверинжиниринга, который вам попадался в работе!

Автор не входит в состав редакции iXBT.com (подробнее »)

2 комментария

N
Уникальность 100%
https://text.ru/antiplagiat/6a6a7f9f96474
j
[OFF]наконец-то статья по теме iXBT[/OFF]

Добавить комментарий

Сейчас на главной

Новости

Публикации

Что, если мы уже поймали сигналы инопланетян, но приняли их за пульсары? Вычислить их поможет алгоритм общения светлячков

Программы поиска внеземных цивилизаций (SETI) с момента своего появления в середине XX века опирались на представления о технологиях, которыми в тот момент обладало само человечество....

Почему компьютерные колонки трещали за секунду до звонка мобильного телефона

Телефон лежит на столе возле компьютера. В колонках неожиданно раздаётся знакомое «ты-ды-дыы, ты-ды-дыы». Через мгновение загорается экран и начинает играть мелодия вызова. Можно заранее потянуться...

Почему домашний йогурт готовится проще, чем кажется на самом деле

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

Почему механические клавиатуры — это прошлый век и за каким форматом будущее

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

Почему нельзя оставлять зарядное устройство от смартфона в розетке: скрытые риски, о которых многие забывают

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

Почему у старых телефонов на спинке был ещё один разъём и как он выручал в начале 2000-х

В моей небольшой коллекции телефонов есть несколько экземпляров из первой половины 2000-х. Парочка из них (Siemens C72 и Alcatel One Touch 331) оснащена загадочным разъёмом, который располагается...