Рубрика: Рефакторинг

  • Устранение дублирования кода при выполнении запроса к БД

    Исходный код Как избавиться от дублирования кода Поскольку условие if (!$ncat) влияет только на вид запроса к БД, но не влияет на обработку результатов запроса, второе можно «вынести за скобки». Кроме дублирования в этом фрагменте содержится два знания: как сформировать запрос и как обработать результаты запроса. В идеале тут следует применить рефакторинг «извлечение функции». Я бы убрал…

  • Устранение дублирования кода при формировании однотипных where

    Исходный код Как можно отрефакторить исходный код В этой функции много лишнего: дублируется код формирования where, присваиваются ненужные перенные, в дублируется значение типа. Также у параметра функции слишком широкий смысл: он назван $filter, хотя он используется как значение типа. Теория Принцип единственной реализации

  • Пример рефакторинга «извлечение функции» при подсчёте количества семёрок

    Исходный код Как улучшить исходный код Форматирование кода Мне явно не хватает пробелов для удобного чтения кода, особенно отступов — с трудом просматривается структура кода. Разделение ответственностей (разделение знаний) После форматирования вижу, что алгоритм функции состоит из двух крупных блоков: разбора входной строки, в процессе которого строка превращается в массив, а затем поиск чего-то в…

  • Пример рефакторинга «извлечение функции» при вычислении кода

    Исходный код Нарушение принципа единственного знания Этот фрагмент кода знает о двух вещах: какой числовой код соответствует каждому символу, и каким способом применяется числовой код. Полученим числового кода должен заниматься отдельный метод, который будет знать только об этом и ни о чём другом. Извлечение метода для вычисления числового кода Теперь можно дополнительно укоротить функцию GetLetterCode на основе…

  • Пример рефакторинга «извлечение метода» при вычислении ширины колонок

    Исходный код Что не так в исходном коде Отличный пример ужасного форматирования кода. Странные индексы массива -1 и -2. Короткие названия переменных w, A, var, которые ничего не сообщают об их предназначении. Магический литерал 5, смысл которого неизвестен. Сомнительная необходимость в двух одинаковых циклах. Смешаны две разных ответственности (два разных знания): вычисление ширины элемента и присвоение новой ширины всем элементам. Разные ответственности…

  • Дублирование реализации при выводе «хлебных крошек»

    Исходный код Что не так в исходном коде Здесь легко видеть дублирование реализации: зачем-то много раз повторяется вывод одних и тех же строк — это ни к чему. Также не очень понятна логика, когда проверяется наличие переменной, но после проверки она сама не используется (внутри ветки if(isset($title5)) не упоминается переменная $title5). Подозреваю, что в этой неиспользуемой переменной содержится заголовок…

  • Пример рефакторинга «извлечение метода» при поиске и выводе типа пакета

    Исходный код Какой рефакторинг применить к исходному коду В этом цикле смешаны две ответственности: найти подходящий элемент и предпринять соответствующие действия при успешном поиске. Рекомендую рефакторинг «извлечение метода», извлечённый метод будет искать пакет с именем str. Для обхода списка пакетов применён цикл while, тогда как по смыслу больше подходит for. Стоит избавиться от избыточной переменной bFound. Для получения указателя…

  • Рефакторинг возврата true и false из ветвления

    Исходный код Что не так в исходном коде Всегда нужно помнить, что логические операции сравнения уже сами по себе дают результат в виде true или false. Поэтому не следует устраивать ветвление только для того, чтобы явно указать, что результатом будет true или false — нужно использовать само логическое выражение без ветвления. Примеры рефакторинга исходного кода Чуть-чуть поменяв проверку distKey и убрав ненужное ветвление, получаем:…

  • Рефакторинг «извлечение метода» для устранения дублирования кода

    Исходный код Анализ недостатков исходного кода Первое, что сразу бросается в глаза — многократное дублирование реализации создания элемента XItem и сопутствующего прописывания неких значений. Вижу, что тут есть две сущности: Label и Value, сильно связанные между собой, при этом хранящиеся в двух разных массивах. При наличии такой тесной связи есть смысл эту связь выразить в явном виде путём…

  • Рефакторинг длинного оператора switch с символами латинского алфавита

    Исходный код Что не так в этом коде Здесь проигнорированы сразу несколько типовых подходов. После оператора return нет смысла добавлять оператор break — после первого сразу произойдёт выход из функции, соответственно, проход по операторам case тоже прервётся: Нет смысла ставить return после каждого case: несколько подряд case могут сопровождаться одним на всех действием, именно поэтому обычно case работает в паре с break. Обычно при выяснении принадлежности символа к некоему…