-
Пример рефакторинга «извлечение метода» для устранение дублирования при формировании массива информации
Исходный код Как улучшить исходный код Тут дважды повторяется реализация алгоритма для получения LIST_PAGE_URL. Это одновременно и дублирование реализации, и отдельное знание о деталях формирования LIST_PAGE_URL. Как извлечь этот алгоритм в отдельную функцию, я уже показывал в рефакторинге за 14 июля. Для начала перепишу исходный код с применением функции interpolateURL. В целом, на этом можно и остановиться, так как…
-
Рефакторинг «извлечение функции» при рендеринге почтового сообщения
Исходный код Что не так в исходном коде Функция знает, как делать три не связанные между собой вещи: как получить нужный локализованный текст; как убрать лишние символы из текста сообщения; как отформатировать сообщение. Причём, что особенно плохо, реализации этих знаний перемешаны между собой: третья строка функции касается локализации, потом алгоритм переключается на очистку спецсимволов, потом…
-
Устранение дублирования реализации и рефакторинг «извлечение функции» при рендеринге картинки
Исходный код Что не так с исходным кодом Когда я изучаю этот исходный код, по мере чтения приходится постоянно возвращаться назад, чтобы уточнить какую-то деталь. Условно, мне пришлось это сделать 30 раз. Я люблю другой исходный код, который легко читается сверху вниз почти без необходимости возвращаться наверх. Почти — это условные два-три раза. Три возвращения…
-
Пример рефакторинга «извлечение функции» для алгоритма перезаписи прав доступа
Исходный код Как можно улучшить исходный код При виде столь длинной функции у каждого программиста должна рефлекторно возникать мысль: «О, да здесь много ответственностей, сейчас я их поделю!». Для выполнения рефакторинга воспользуюсь методом составления плана. После напряжённого анализа кода я выявил в коде функции следующие ответственности: сформировать путь к файлу с закешированными правами доступа $DOC_ROOT.$path_dir.”/.access.php”; сформировать…
-
Устранение дублирования в функции сравнения версий
Исходный код Что не так в исходном коде Нет смысла самостоятельно реализовывать алгоритмы, которые уже реализованы в стандартных библиотеках. В PHP для сравнения версий уже существует функция version_compare. Подход, когда вместо библиотечных функций применяются собственные многословные реализации, традиционно называется велосипедом. Это решение максимально тривиальное, тут не о чем рассуждать. Допустим, оно меня по какой-то причине не…
-
Устранение дублирования реализации при рендеринге звёздочек
Исходный код Что не так в исходном коде Легко видеть, что имеет место дублирование. Не следует воспринимать его как абстактное дублирование участков кода, очень важно вдумчиво ответить на вопрос: что именно дублируется? Здесь дублируется реализация алгоритма рендеринга одиночной звёздочки. Даже если бы тег звёздочки состоял из простой строки символов — это уже самостоятельное знание, знание…
-
Пример рефакторинга «извлечение метода» при формировании объекта критериев
Исходный код Что не так в исходном коде Основной цикл загромождён подробностями реализаций формирования критериев для каждого оператора plus, minus, less, less_eq — такие вещи всегда нужно убирать в отдельные методы. В идеале, каждое условие должно представлять собой экземпляр соответствующего класса ConditionPlus, ConditionMinus, ConditionLess, ConditionLessEq, у которых есть метод getCriterion. Непонятным мне образом критерии, формируемые в цикле, могут затираться на последующих…
-
Возвращение рекурсии и разделение ответственностей алгоритма удаления директорий
Исходный код Что не так в исходном коде Очевидно, что тут имеет место линейная реализация рекурсивного по сути алгоритма удаления узлов дерева. Исправление алгоритма будет заключаться в возвращении ему рекурсивности. Второй недочёт реализации — смешение двух ответственностей: получение идентификаторов всех директорий, вложенных в данную, и собственно удаление. Вариант рефакторинга исходного кода В алгоритме рекурсивного получения…
-
Пример оптимизации оператора switch при подстройке пользовательского интерфейса
Исходный код Что так в исходном коде Разделение ответственностей между методами OnRdbDatesCheckedChanged и MakeDateViewVisible просто идеально! Первый по сути выполняет функции контроллера, откликаясь на внешние воздействия. Второй подстраивает вид пользовательского интерфейса, не владея информацией об источнике команды: потребность изменить интерфейс может возникнуть не только как реакция на действия пользователя, но и как ответ на некие…
-
Пример рефакторинга для устранения дублирования кода при плюрализации
Исходный код Что не так в исходном коде Беглый взгляд на исходный код позволяет увидеть повторяющийся трижды алгоритм получения нужной формы слова в соответствии с количеством. Такое дублирование нельзя допускать, алгоритм должен быть перенесён в отдельную функцию. Само собой разумеется, что знание о получении нужной формы слова — это отдельное самостоятельное знание, которое должно быть…