Когда вы хотите кушать, есть 2 варианта: прийти домой, приготовить вкусный, полезный, насыщенный обед и насладиться пищей, или быстренько забежать в кафешку и перекусить гамбургером с колой. Задача выполнена – вы сыты. Но какие последствия? Так выглядит антипаттерн в программировании. То, что на первый взгляд безопасно и выгодно, может оказаться проблемой. Давайте разберем, что такое антипаттерн и какие ошибки легко совершить на старте.
Антипаттерн — ваша вредная привычка
Антипаттерны программирования — это противоположность классическим и понятным шаблонам проектирования. Процесс разработки строится на определенных принципах, шаблонах, которые можно повторно использовать и получать нужный результат. Но бывает ситуация, когда в голову приходит «экстра выгодное» решение. Оно кажется эффективным и даже правильным. Решает проблему «здесь и сейчас».
Но так вы создаете antipattern — процесс, который приводит к неправильным результатам в дальнейшем. Почему так происходит:
- Есть проблема в части кода. Вы придумали «гениальное» решение, которое отличается от классических шаблонов проектирования.
- Внедряете это решение в код и данная часть работает. Но вы не знаете, как она будет работать дальше. Потому что архитектура строилась без учета этого решения.
- Совершенно другая часть кода от этого может пострадать. Или код вообще еще не написан. Но другой разработчик не знает про антипаттерн (да и вы сами можете просто забыть). Потом не понимает, почему код не работает как нужно.
Создается технический долг, который снежным комом накапливается. Anti Pattern — это вредная привычка. Она действительно может касаться отличным решением в моменте, но в дальнейшем создает больше проблем.
5 ключевых антипаттернов в программировании
Давайте разберем ключевые ошибки, которые допускают не только новички, но и опытные программисты. Эти антипаттерны очень распространены.
Спагетти-код
Этот антипаттерн получил такое название, потому что код выглядит, как спагетти на тарелке. Не понятно, где начало, а где конец. Происходит потому, что программист пишет функцию, потом еще одну, за ней — следующую. Но не смотрит на общую логику и структуру.
В итоге, когда код написан, он смотрит на общую структуру. А она хаотична. Приложение работает, но рефакторить его крайне тяжело или невозможно. Проще заново все переписать.
Такой код сложно читать, изменять, тестировать, масштабировать. А если там еще и ошибки есть (что в 90% случаев), то отсутствие нормальной структуры создаст проблему. Решение: выстраивать сразу правильную структуру:
- каждый логический кусок разбивать на функции и отдельные части;
- давать нормальные имена переменным, классам и другим компонентам кода;
- писать комментарии, где это важно;
- при использовании повторяющихся частей копипаст собирать в отдельные блоки;
- делать рефакторинг итерациями.
Антипаттерны программирования могут казаться несущественными. Но в итоге приводят к огромным проблемам в дальнейшем. Спагетти-код — один из таких.
Золотой молот
В программировании каждый шаблон решает определенный тип задач. Но теперь представьте, что вы придумали решение, которое подошло для задачи А, В, С. Вот у вас в руках «золотой молоток», который способен забивать любой гвоздь. Но это не значит, что он забьет шуруп.
Этот antipattern является проблемой многих разработчиков. Если решение сработало несколько раз, это не значит, что оно подойдет для всего. Не нужно пытаться решить любую задачу одним инструментом. Представьте, что вы научились готовить яичнику. Теперь вы делаете ее на завтрак, обед и ужин, на праздники, подаете всем гостям. И даже в заведении заказываете яичницу. Вроде еда, но что-то не так.
Якорь для лодки
Думать на перед иногда полезно. Но этот anti pattern приводит к негативным последствиям. В первую очередь, для программиста. В чем суть:
- вы думаете наперед, что потенциально может понадобиться;
- добавляете в код дополнительные строки, чтобы «потом было легче»;
- когда придет время – пара кликов, и новая функция работает;
- потом оказывается, что эта функция не нужна, или она должна работать иначе;
- ваш код написан просто так, загрузил объем, украл ваше время.
Код становится неактуальным. Этот «якорь» становится тяжелым, неудобным и не факт, что вообще понадобится. Но он уже в вашей лодке.
Объект Бога
Представьте, что у вас в офисе есть коллега, который пишет код, тестирует его, ведет проектную документацию, общается со стейкхолдерами, управляет процессами бизнес анализа. А еще он разрабатывает визуал для приложения, подключает API и выдает вам зарплату. Завтра он заболеет и не выйдет на работу. Что будет в компании?
Antipattern Объект Бога и есть такой «сотрудник». Только в коде. Когда один класс делает слишком много, становится «всемогущим», он создает зависимость других классов от него. Например, класс User хранит не только имя, но еще и телефон, корзину клиента, историю покупок и транзакции. Программист добавляет новые фичи в этот же класс, как правило, из-за лени. Потому что удобно. Он разрастается, становится сложно читаемым и критически тяжело тестируется. А если нужны изменения — вероятность ошибок сильно возрастает.
Чтобы такие антипаттерны, как Объект Бога не возникали, используйте принципы SOLID.
Копирование и вставка
Использование другого кода, как шаблона — норма. Но почему тогда это антипаттерны программирования? Потому что вредно именно бездумное копирование. Решение, которое кажется очевидным и понятным, создает в дальнейшем проблему.
Например, вам нужно добавить на ряд страниц форму регистрации. Она уже есть на StackOverflow или вы написали сами. Копируете, вставляете без изменений на каждую страницу просто куском кода.
Заказчик говорит, что нужно добавить в форму еще одно поле. А она у вас на 24 страницах. Вам придется в каждой форме внести изменения.
Чтобы решить эту проблему, нужно:
- первоначально отказаться от идеи бездумного копирования, изучать код и делать его адаптированным под ваш проект;
- провести код-ревью прежде, чем делать множество копий;
- провести рефакторинг, вынести в отдельные функции и классы, чтобы изменять в одном месте, а не в десятках других;
- провести тестирование, убедиться, что код подходит, а не является «золотым молотком».
Если копируете код (неважно, чужой или делаете дубликат своего), убедитесь, что он не станет anti pattern.
Заключение
Теперь вы знаете, что такое антипаттерны программирования, какие существуют наиболее распространенные и что делать, чтобы их не допускать. Помните, что быстрое, на первый взгляд, идеальное решение может привести к большим последствиям. Избавляйтесь от вредных привычек программирования еще до их появления.