-
Дублирование реализации и неправильная инкапсуляция при проверке терма
Исходный код Что не так в исходном коде Первое, что бросилось в глаза: альтернативные действия в алгоритме выбираются в зависимости от типа объекта-параметра. Согласно паттерну «информационный эксперт» из GRASP, если детали алгоритма зависят от другого объекта, то есть смысл алгоритм «отдать» тому другому объекту. В нашем случае проверка типа симоволов (Character.isDigit, Character.isLetter, Character.isLetterOrDigit, Character.isLetterOrDigit) зависит от типа терма…
-
Смешение знания при реализации карточной игры
Исходный код Что не так в исходном коде Приведённый метод заключает в себе знания о слишком многих вещах: как понять, какая ситуация сложилась в игре, и что делать в каждой ситуации. Все подробности свалены в одну кучу, и не сразу понятно, что к чему относится. Положение усугубляются тем, что не все названия переменных дают чёткое…
-
Неиспользование возможностей, предоставляемых языком программирования
Исходный код Что не так в этом коде Если не пользоваться всеми возможностями, языком программирования и в целом платформой, код получается громоздкий и слабо пригодный для развития. При написании данного фрагмента был забыт тот факт, что язык PHP создавался специально для лёгкого смешивания в одном файле HTML-разметки и кода. Второй момент, который можно улучшить: есть…
-
Одинаковая реализация двух кейсов при рендеринге веб-страницы
Исходный код Что так в этом коде Вероятнее всего, дублирование в этом фрагменте кода появилось в результате многократных изменений, то есть эволюционно. Здесь нужно смотреть в первую очередь на само ветвление в целом, а не на то, что происходит внутри веток. Ветвление появилось по причине того, что пользователь может запросить два вида страниц: домашнюю либо…
-
Возврат булевого значения из функции сравнения массивов чисел
Исходный код Что не так в исходном коде Странным выглядит то, что сравнение элементов массива начинается на с первого элемента под номером 0, а со второго под номером 1. Неудачно назван как метод, так и его параметры: название метода упоминает про какой-то модуль, а в методе выполняется поэлементное сравнение целочисленных массивов. Название параметра operand* является максимально общим,…
-
Выход из цикла и разделение ответственностей при генерации идентификатора
Исходный код Что не так в исходном коде Здесь опять, как и в прошлый раз, для выполнения как минимум одной попытки генерации идентификатора применён финт ушами. На этот раз я покажу другое решение в виде бесконечного цикла с принудительным выходом. Вариант рефакторинга Также нетрудно видеть, что код внутри цикла выполняет две обязанности: сгенерировать случайный идентификатор…
-
Ребус для обработки ключевых слов и их вывода через запятую
Исходный код Что не так в исходном коде В коротком фрагменте кода смешаны несколько ответственностей (знаний): почистить ключевые слова от лишних символов и привести к требуемому формату вывести ключевые слова через запятую не выводить ключевые слова с длиной меньше трёх символов Кроме смешения знаний этот код содержит финт ушами: для обработки ключевых слов они сначала…
-
Многократное повторение реализации очистки переменной сессии
Исходный код Что не так в исходном коде Нетрудно видеть, что каждый if выполняет одно и то же действие: проверяет и очищает указанную переменную сессии. Казалось бы, простой алгоритм: проверь значение и удали при наличии — а всё равно это алгоритм, он использует для реализации определённую последовательность операций. Соответственно, реализацию алгоритма необходимо прятать в функцию: Если кроме…
-
Пееребор всех возможных сочетаний регистра букв
Исходный код Что не так в исходном коде А если бы речь шла не о двухбуквенном слове, а о десятибуквенном? Как правильно Снова на помощь приходят регулярные выражения.
-
Больше одного знания и дублирование реализации при получении списка обоев
Исходный код Что не так в исходном коде Здесь смешаны в одну кучу две принципиально разные ответственности: формирование условия для выборки обоев и формирование трёх видов запросов для выборки трёх видов информации. С другой стороны, реализация формирования трёх видов запросов повторяется многократно, что затрудняет внесение изменений в эту реализацию. Нетрудно заметить, что условие для всех…