Автор: Сергей Галанин

  • Пример рефакторинга мелких недочётов в методе формирования параметров запроса

    Исходный код Что не так в исходном коде Метод _buildParamsUrl возвращает массив параметров, а не URL, поэтому я бы назвал его просто _buildParams. Сейчас у метода две ответственности: очистить массив параметров от ненужных и смёржить его с переданным извне массивом дополнительных параметров. Также метод заключает в себе знание о том, откуда берётся исходный список параметров. Желательно эти знания…

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

    Исходный код Что не так в исходном коде Самое главное — это, конечно, смешение двух ответственностей: собственно выполнение внешнего кода и показ результатов выполнения. Второй момент — неясные названия переменных, не очень точно отражающие смысла хранящихся в них значений. Третий момент, больше субъективный, связан с вёрсткой блоков, в которых выводится результат выполнения. Я бы отвел…

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

    Исходный код Что не так в этом коде В этом коде смешаны две разных ответственности (два разных знания): создать новый элемент добавить новый элемент в список существующих Рецепт, как обычно — рефакторинг «извлечение метода». Второй сомнительный момент в коде — хак с вставкой элемента внутрь существующего массива. Его можно спокойно заменить на array_splice. Пример рефакторинга Теория Принцип…

  • Пример рефакторинга избыточных проверок при хордкоде идентификаторов

    Исходный код Что не так в исходном коде Очевидно, что первая проверка идентификаторов является избыточной, так как следом выполнятеся та же самая проверка. Соответственно, первый оператор if можно просто убрать. Чтобы подчеркнуть альтернативность каждого сравнения, можно использовать else или вовсе перейти на оператор switch:

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

    Исходный код Что не так в исходном коде Первое, что бросается в глаза — это, конечно, адская лесенка из операторов if, хотя она здесь не причина, а следствие других проблем с кодом. Второй момент, не столь очевидный — это то, как устроена запись ACL: это массив с пронумерованными элементами, в котором у каждого элемента есть собственный…

  • Пример рефакторинга функции с излишней логикой для проверки существования таблицы

    Исходный код Очень здорово, что проверка существования таблицы убрана в отдельный метод, а не заинлайнена в код, где она необходима, — это позволяет менять реализацию проверки произвольным образом. Например, если проверки выполняются часто, мы можем захотеть добавить кеширование, чтобы уменьшить количество запросов к БД. Рефакторинг логики проверки существования таблицы Когда я принимаюсь за реализацию какой-то…

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

    Исходный код Как можно отрефакторить и улучшить исходный код Разделение ответственностей Здесь один фрагмент кода выполняет сразу много обязанностей (судя по операторам return это код функции): получает введённое пользователем значение даты применяет валидацию к введённым датам проверяет валидность даты выводит сообщения об ошибках сопоставляет машинное и человеческое названия полей Под большинство обязанностей нужно отвести отдельные функции. Желательно…

  • Неоднозначное использование переменных и слишком много знаний при формировании SVG

    Исходный код Что не так в исходном коде Неоднозначное использование переменных Переменные labels, colors, shapes, edge_colors используются в двух смыслах: как массив значений некоего свойства, либо как строковый ключ в хранилище, из которого этот массив извлекается. Такая двусмысленность не годится: она затрудняет понимание алгоритма, резко повышает вероятность багов и затрудняет их устранение. Для каждого свойства нужно завести пару переменных: отдельную…

  • Загадочный алгоритм и мёртвый код при чтении настроек из БД

    Исходный код Что не так в этом коде Мёртвый код. Код первых двух строк фактически не нужен, так как результаты его работы перезатираются в последующих строках. Нетипичная инициализация переменной. Здесь присвоение $i=” используется в смысле $i=0, так как последующий код за счёт неявного приведения типа работает с $i как с числом. Так не нужно строить алгоритмы: всегда прописывай все вещи…

  • Нарушение принципов структурного кода

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