Содержание
Рефакторинг по методу "heavy clay refactoring"
Цель: исправлении ошибок с минимизацией временных затрат.
Симпомы: метод написан в процедурном стиле, очень длинный, код запутан, переменные проблемного участка используются далее по скрипту во включаемых файлах. Отсутствуют тесты контроля и проверки.
Решение: техника «heavy clay refactoring», результаты рефакторинга сравниваются с оригиналом запуском всего приложения.
Выявлен проблемный участок кода
Копирование «Bad code» в origin.php и modify.php (для удобства).
- Теперь переключение осуществляется в переменной
$way. - Вынос в отдельный файл позволяет четко выделить границы метода. Невозможно случайно внести исправления «не там», особенно когда код на несколько экранов.
 - Удобно перемещаться по тексту в файле, ощущая его перерождение в метод.
 
Работа с файлом ''modify.php''
Выявление зависимостей
Выявляем все «внешние» переменные, которые будут далее использоваться по коду. Для этого смотрим их далее по всем файлам.
get_defined_vars()
Также возможно сделать варварским способом unset($var1, $var2) после include в bad.php - если ничего не сломалось, переменная «локальна» для этого участка кода.
Но необходимо осознавать потенциальную неточность такого способа, учитывая цикломатическую сложность.
Переписываем «внутренние» переменные по принципу $var1 => $_var1 или иным способом. Это делаем временно, или так и оставим в дальнейшем.
По ходу выявления роли переменных вносим в файл изменения:
Оформление кода в метод
Поздравляем: после этих манипуляций файл modify.php теперь возможно оформить в отдельный метод!
IN - аргументы метода, OUT - результат его работы.
Так как на выходе 2 параметра, то на выбор:
- будем возвращать массив совместно с конструкцией
list() - оформим 2 метода, что лучше, но не всегда так легко
 
Оформление кода в два метода (и более)
Вместо возвращения массива значений надо подумать о возможности использования двух (в нашем случае) или более методов, каждый из которых возвращает одно значение:
- bad.php
 $existsTags = $this->heavyClayMethodTags($getParms, $seriesAll); $series = $this->heavyClayMethodSeries($getParms, $seriesAll);
- bad.php
 private function heavyClayMethodTags($getParms, $seriesAll) { include('legacy/modify.php'); return $existsTags; } private function heavyClayMethodSeries($getParms, $seriesAll) { include('legacy/modify.php'); return $series; }
Оба метода эксплуатируют один и тот же код, но возвращают по одной переменной. Это - временное решение. В дальнейшем необходимо подумать о разделении их общего кода на две части.
При этом скорее всего выявляется переменные, которые используются и в первом, и во втором, их лучше вынести на уровень объекта $this->var.
В итоге мы как минимум избавились от «месева» и встали на путь ООП.
Окончательно рефакторим код, избавляемся от файлов modify.php и origin.php.