Анти-паттерны
lang_of_article_differ
want_proper_trans
Анти-паттерны
Copy and Paste Programming
Самый махровый из всех анти-паттернов.
Когда он проявляется
Когда разработчику требуется реализовать две схожих задачи, самым простым решением чаще всего он видит следующее: написать одну задачу, её скопировать и внесение необходимые изменения, чтобы решить вторую задачу.
Какие проблемы несёт
- Ухудшается повторное использование кода - если потребуется подобная функциональность в новом проекте, то нужно будет вычленять код и переносить его.
- Понижается качество кода - часто найденные недочёты в коде правятся только в одном проекте, в остальных недостатки остаются.
- Усложняется поддержка кода - в случае, если в изначальном коде была ошибка, которую в будущем нужно исправить, то эта означает, что ошибка попала во все проекты, куда копировался код. Это приводит необходимости выполнять множественные исправления в разных проектах.
- Code Review значительно усложняется, так как приходится делать обзор фактически одного и того же кода в разных проектах без видимой значительной выгоды и роста производительности труда.
Причинами возникновения
- Наплевательское отношение к будущим участникам разработки проекта.
- Недостаток опыта в разработке.
- Ограничение времени на разработку.
Как решить проблему
Создание приватного репозитория решений и использования их в качестве библиотек, модулей, зависимостей. Об этом следует думать до старта разработки. Чаще задавайте себе вопрос: возможно, что понадобится решить подобную задачу где-нибудь ещё?
Spaghetti code
Спагетти-код - слабо структурированная и плохо спроектированная система, запутанная и очень сложная для понимания.
Когда он проявляется
Когда алгоритм реализуется в рамках одного метода или функции и содержит огромный по размеру кода.
Какие проблемы несёт
- Подобный код в будущем не может разобрать даже автор.
- Очень часто содержит в себе множество других анти-паттернов программирования, включая Copy and Paste Programming.
- Малоэффективные Code Review.
- Использовать спагетти-код повторно невозможно и нежелательно.
Причинами возникновения
Мысль о том, что если работает, то лучше не трогать, это часто связано с малым опытом в разработке.
Как решить проблему
Необходимо рефакторить спагетти-код полностью или переписать часть кода заново. Потратив немного времени при разработке, будет сэкономлено время при сопровождении и расширении в будущем.
Golden hammer
Золотой молоток - уверенность в полной универсальности кода.
Когда он проявляется
Применение одного решения (чаще всего какого-либо одного шаблона проектирования) для всех задач.
Какие проблемы несёт
Многие программисты используют данный анти-паттерн не подозревая о собственной некомпетентности, что приводит к остановке саморазвития.
Причинами возникновения
- У новичков - лень к изучению нового и увеличению знаний в шаблонах проектирования; как следствие, новичок пытается решить все задачи единственным известным способом, который он освоил.
- У профессионалов - профессиональная деформация, что приводит к выработке предпочтений в шаблонах проектирования, а не использования того шаблона, который нужен для решения конкретной задачи.
Как решить проблему
При решении задачи продумывать не одно решение, а несколько, определять достоинства и недостатки, и делать взвешенный выбор в пользу самого удачного решения - именно к поиску таких решений и сводится эффективная разработка.
Magic numbers
Магическое число - константа, используемая в коде, но которая не несёт никакого смысла без соответствующего комментария.
Когда он проявляется
Когда в коде вашего проекта начинаются появлятся числа, значение которых не является очевидным.
Какие проблемы несёт
- Разработчик, который не является автором кода, с трудностями сможет объяснить как это работает.
- Со временем, автор кода тоже не сможет объяснить что-либо.
- Числа затрудняют понимание кода и его рефакторинг.
Причинами возникновения
- Спешка при разработке.
- Отсутствие практики групповой разработки или сопровождения проекта.
Как решить проблему
Проводить Code Review, разработчиками, которые не задействованы в проекте.
Hard code
Хард-код - фиксация в коде различных данных об окружении. Например: пути к файлам, имена процессов, устройств и так далее.
Когда он проявляется
Этот анти-паттерн тесно связан с магическими числами, часто они переплетаются.
Какие проблемы несёт
- Код будет исправно работать только в окружении, в котором ведётся разработка.
- Может проявляется непредсказуемые дефекты во время перемещения, переименования файлов, и их поведение может меняться при изменения конфигурации устройств.
Причинами возникновения
- Разработчик во время написания или отладки алгоритма пишет хард-код и, по завершению, забывает удалить или модифицировать его.
- Малый опыт разработки под несколько платформ.
Как решить проблему
Оговаривать запрет на хард-код перед началом разработки проекта и проводить тщательные Code Review.
Soft code
Софт-код - параноидальная боязнь хард-кода. Этот анти-паттерн является вторым концом палки о хард-коде и поэтому тоже является опасным.
Когда он проявляется
В проекте настраивается абсолютно всё, что делает конфигурацию невероятно сложной и непрозрачной.
Какие проблемы несёт
- При разработке много ресурсов уходит на реализацию возможности настроек абсолютно всего.
- Развёртывание такой системы влечет так же дополнительные затраты.
Причинами возникновения
- Низкая квалификация разработчика - страх допустить анти-паттерн Hard Code.
- Небольшой опыт работы с разными окружениями.
Как решить проблему
Перед началом разработки проект следует определить, что должно быть настариваемым, а что является постоянным независимо от окружения или может быть настроено автоматически. Также использование принципов KISS, YAGNI поможет решить проблему.
Accidental complexity
Простыми словами анти-паттерно проще описать так - “заумность решения”. Ненужная сложность может быть внесена в решение любой задачи.
Когда он проявляется
В коде есть избыточные проверки, часть кода, реализовано с использованием анти-паттерна Soft Code, что позволяет конфигурировать поведение решения, например: использования lua совместно с компилируемым языком для описания бизнес-логики, так же проявляется, когда код не проходит рефакторинг.
Какие проблемы несёт
- Усложнение понимания кода.
- Понижение скорости работы.
Причинами возникновения
- Отсутствие или некачественность рефакторинга.
- Некомпетентность программиста.
Как решить проблему
Следует проводить Code Review и выполнять рефакторинг. Также использование принципов KISS поможет решить проблему.
Boat anchor
Сохранение неиспользуемых частей кода, которые остались после оптимизации или рефакторинга.
Когда он проявляется
- После рефакторинга, некоторые части кода остаются в системе, хотя они уже больше не будут использоваться.
- При сохранении части кода «на будущее», на случай, если придётся ещё раз использовать.
Какие проблемы несёт
Значительно усложняет чтение проекта, не неся абсолютно никакой практической ценности.
Причинами возникновения
Неумение использовать такие инструменты как “Система управления версиями” (git, mercurial)
Как решить проблему
Основной способ недопущения появления анти-паттерна - планирование при разработке, написание продуманного кода. При рефакторинге и оптимизации кода принудительно удалять код, который более использоваться не будет или создавать отдельную ветку в системе управления версиями, на случай, если есть вероятность возврата к архивному решению.
Reinventing the wheel
Смысл этого анти-паттерна в том, что разработчик реализует собственное решение для задачи, для которой уже существуют решения, которое может быть лучшие, чем придуманное.
Когда он проявляется
Когда разработчик считает свои знания уникальными, поэтому для каждой задачи пытается придумать собственное решение, не смотря на опыт его предшественников.
Какие проблемы несёт
- Потеря времени и понижение эффективности работы программиста.
- Снижает эффективность или оптимальность конечного продукта.
Причинами возникновения
- Повышенная самооценка или пониженная самокритичность.
- Нехватка времени на изучение готовых решений.
Как решить проблему
Разработчик должен ориентироваться в задачах, которые могут предстать перед ним, чтобы грамотно их решать - использовать готовые решение или изобретать собственные. Полностью же отбрасывать возможность самостоятельного решения нельзя, так как это прямая дорога к программированию копи-пастом.
Reinventing the square wheel
Простыми словами, это создание своего плохого решения, при существовании лучшего.
Когда он проявляется
Какие проблемы несёт
- Время тратится на изобретение и реализацию собственного решения.
- Время тратится на рефакторинг, поиск оптимального и замену.
Причинами возникновения
Низкая осведомлённость о готовых решениях при старте разработки.
Как решить проблему
Разработчик должен ориентироваться в задачах, которые могут предстать перед ним, чтобы грамотно их решать - использовать готовые решение или изобретать собственные.
Lava flow
Системное нарушение принципов разработки, которое со временем приводит к тому, что проект начинает состоять из неподдерживаемых кусков кода, а доработка проекты вынуждает писать новые слабо поддерживаемые куски кода.
Когда он проявляется
При систематических нарушениях таких принципов разработки и проектирования как: DRY, KISS, SOLID, YAGNI, DDD, TDD, BDD.
Какие проблемы несёт
- Увеличением сложности проекта.
- Замедляется скорость разработки проекта.
- Невозможность провести рефакторинг или внести новую функциональность.
Причинами возникновения
- Когда разработчик оставляет комментарии типа: “// Не знаю, как оно работает, но оно работает. Не удалять и не менять”.
- Разработка большого проекта одим разработчиком.
- Отсутствие Code Review.
- Отсутствие проектирования разработки.
Как решить проблему
Планировать разработку, писать продуманного кода, регулярно делать Code Review, выполнять оптимизацию и рефакторинг.
Programming by permutation
Многие неопытные разработчики пытаются решать некоторые задачи методом перебора, подбором параметров, порядка вызова функций и так далее. Все эти игры с +1, -1 к параметрам и подобные манипуляции устраняют только симптомы и не дают понимания сути происходящего.
Когда он проявляется
Если программист не понимает происходящего, как следствие не сможет предусмотреть все варианты развития событий.
Какие проблемы несёт
- Будет потрачено время на решение задачи перебором, а после повторно потратится время на переделку решения.
- Приучает разработчика к тому, что написание кода - это магия, а не инженерная работа.
Причинами возникновения
Всё сводится к низкой компетенции разработчика: если программист не может решить задачу несколькими путями - это скорее всего приведёт к появления этого анти-паттерна.
Как решить проблему
Не браться за разработку проекта, в котором не хватает компетенций до тех пор, пока пробелы в знаниях не будут закрыты.
Blind faith
Проще всего описать так: недостаточная проверка корректности входных данных, отсутствие тестирования при разработки кода и исправлении ошибок.
Когда он проявляется
Когда программист думает, что его код всегда будет работать в идеальных условиях, поэтому никогда не выдаст ошибок, или никогда не получит неверные входные данные или данные неверного типа.
Какие проблемы несёт
- Код делает неожидаемые действия.
- Приводит к брешам в безопасности.
- Приводит к каскаду ошибок, что значительно усложняет процесс стабилизирования.
Причинами возникновения
Избыточная доверие к потребителю кода.
Как решить проблему
Ввести правило в разработку, что все лгут, поэтому нельзя доверять никакому коду, даже собственному. Тут важно не перейти грать и приводить код к анти-паттерну Accidental complexity. Следует помнить про проверку входных данных и возможные проблемы у чужого кода, который используете в проекте.
God Object
Божественный объект - анти-паттерн, который довольно часто встречается у ООП разработчиков.
Когда он проявляется
Когда уровень проекта превышает уровень компетенций разработчика.
Какие проблемы несёт
- Объект берет на себя слишком много возможностей и/или хранит в себе практически все данные.
- Непереносимость кода.
- Сложно поддерживаемый код
Причинами возникновения
- Плохие знания шаблонов проектирования.
- Низкая компетенция у разработчика.
Как решить проблему
Использовать принципы разработки: DDD, TDD, DRY, KISS, SOLID