Знакомство с анти-паттернами
Анти-паттерны — полная противоположность паттернам. Напомним, паттерны проектирования — это примеры практик хорошего программирования, то есть шаблоны решения определённых задач. А вот анти-паттерны — их полная противоположность, то есть шаблоны ошибок, которые совершаются при решении различных задач.
Частью практик хорошего программирования является именно избежание анти-паттернов. Не надо думать, что это такая непонятная теоретическая фигня — это конкретные проблемы, с которыми сталкивался практически каждый разработчик. Кто осведомлен, тот и вооружён!
Рассмотрим несколько анти-паттернов, распространённых среди новичков:
- Магические числа и строки
- Класс бога
- Преждевременная оптимизация
- Изобретение велосипеда
- Изобретение одноколесного велосипеда
Магические числа и строки
Магическое число — константа, использованная в коде для чего-либо (чаще всего — идентификации данных), само число которой не несёт никакого смысла без соответствующего комментария. Числа не несут абсолютно никакой семантики.
Когда в коде вашего проекта начинаются появляться числа, значение которых не является очевидным, — это очень плохо. Программист, который не является автором такого кода, с трудностями сможет объяснить, как это работает. Со временем и автор кода с магическими числами не сможет объяснить его.
Числа затрудняют понимание кода и его рефакторинг. Главные причины этой ошибки — спешка при разработке и отсутствие практики программирования. Этот анти-паттерн надо пресекать на корню, оговаривая использование числовых констант перед началом разработки.
Для решения такой проблемы нужно создать переменную, имя которой объясняет назначение числовой константы, и присвоить ей требуемое значение.
Класс бога
Божественный объект — анти-паттерн, который довольно часто встречается у разработчиков ООП. Такой объект берет на себя слишком много функций и/или хранит в себе практически все данные. В итоге мы имеем непереносимый код, в котором, к тому же, сложно разобраться.
К тому же подобный код довольно сложно поддерживать, учитывая, что вся система зависит практически только от него. Причины этой ошибки: некомпетентность разработчика, взятие одним разработчиком большой части работы (особенно, когда объем работы превышает уровень опыта этого разработчика).
Бороться с таким подходом надо, разбивая задачи на подзадачи, которыми смогут заниматься разные разработчики.
Преждевременная оптимизация
Преждевременная оптимизация — это оптимизация, которую выполняют до того, как у программиста есть вся информация, необходимая для принятия взвешенных решений по поводу того, где и как нужно её проводить.
На практике сложно предсказать, где встретится узкое место. Попытки навести оптимизацию до получения эмпирических результатов приведут к усложнению кода и появлению ошибок, а пользы не принесут.
Как избежать? Сначала пиши чистый, читаемый, работающий код, используя известные и проверенные алгоритмы и инструменты. При необходимости используй инструменты для профилирования для поиска узких мест. Полагайся на измерения, а не на догадки и предположения.
Примеры и признаки
Кэширование до того, как провели профилирование. Использование сложных и недоказанных эвристических правил вместо математически верных алгоритмов. Выбор новых, непротестированных фреймворков, которые могут повести себя плохо под нагрузкой.
В чём сложность
Непросто определить, когда оптимизация будет преждевременной. Важно заранее оставлять место для роста. Нужно выбирать решения и платформы, которые позволят легко оптимизировать и расти. Также иногда преждевременную оптимизацию используют в качестве оправдания за плохой код. Например, берут алгоритм O(n2) только из-за того, что алгоритм был бы O(n) сложнее.
Изобретение велосипеда
Смысл этого анти-паттерна в том, что программист разрабатывает собственное решение задачи, для которой уже существуют решения, и зачастую куда более удачные.
Разработчик считает себя умнее, поэтому для каждой задачи пытается придумать собственное решение, несмотря на опыт его предшественников. Чаще всего это приводит только к потере времени и понижению эффективности работы программиста. Ведь решение скорее всего окажется неоптимальным, если вообще будет найдено.
Конечно, нельзя полностью отбрасывать возможность самостоятельного решения, так как это прямой дорогой приведет к программированию копипастом. Разработчик должен ориентироваться в задачах, которые могут предстать перед ним, чтобы грамотно их решить, используя при этом готовые решение или изобретая собственные.
Очень часто причиной этого анти-паттерна является банальная нехватка времени. А время — это деньги.
Изобретение велосипеда с квадратными колесами
Этот анти-паттерн очень тесно связан с простым изобретением велосипеда — это создание собственного плохого решения, когда существует более удачное решение.
Этот анти-паттерн вдвойне забирает время: сначала время тратится на изобретение и реализацию собственного решения, а потом — на его рефакторинг или замену.
Программист должен знать о существовании различных решений для определённых кругов задач, ориентироваться в их преимуществах и недостатках.
Все проблемы, с которыми ты столкнешься как программист, можно поделить на две части:
- эту проблему умные люди решили 30 лет назад
- эту проблему умные люди решили 50 лет назад
Большинство проблем в программировании были успешно решены еще до твоего рождения. Не нужно ничего изобретать — просто изучай опыт других людей (для этого и пишут книги).
В 2022 году мы можем отпраздновать такие дни рождения:
- Языки программирования
- Языку С исполнилось 50 лет (1972)
- Языку Java исполнилось 27 лет (1995)
- Языку Python исполнился 31 год (1991)
- Связь
- Интернету исполнилось 39 лет (1983)
- Мобильному телефону исполнилось 49 лет (1973)
- Первую СМС отправили 30 лет назад (1992)
- Паттерны
- Паттерну MVC исполнилось 44 года (1978)
- SQL придумали 48 лет назад (1974)
- Java Beans придумали 26 лет назад (1996)
- Библиотеки
- Hibernate придумали 21 год назад (2001)
- Spring придумали 20 лет назад (2002)
- Tomcat выпустили 23 года назад (1999)
- Операционные системы
- Unix выпустили в 51 год назад (1971)
- Windows увидела свет 37 лет назад (1985)
- Mac OS выпустили 21 год назад (2001)
И все эти вещи были не просто так придуманы, они были разработаны как решения проблем, которые были очень распространены и актуальны в то время.