Рефакторинг: группировка кода в отдельную функцию. Часть 1
Вот и настал черед рассмотрения такого приема, как «Группировка кода в отдельную функцию». Или, его можно еще назвать «Выделение метода».
Я решил разбить этот пост на две части, чтобы не перегружать читателя информацией. Вторая часть выйдет завтра.
Суть этого приема заключается в выделении какого-то участка кода в отдельный метод, чтобы улучшить понимабельность кода. Приведу пример:
function showOwing($amount) { showBanner(); // show details echo "name: ".$this->_name; echo "amount: ".$amount; }
Выделим нижний участок кода в отдельный метод:
function showOwing($amount) { showBanner(); showDetails($amount); } function showDetails($amount) { echo "name: ".$this->_name; echo "amount: ".$amount; }
Это один из самых распространенных приемов в рефакторинге. Зачастую, когда смотришь на код, он кажется слишком длинным или некоторые участки - непонятными, которые нужно комментировать. В этом случае мы выделяем непонятный участок в отдельный метод, имя котороого отражает цель, им преследуемую.
Методы, по идее, вообще должны быть хорошо именованы, чтобы у читателя кода не возникало вопросов. А еще, я думаю, каждый метод должен выполнять определенную функцию и ничего более. Если выделение уясняет код, который Вы рефакторите, то это выделение конечно стоит делать, даже если имя нового метода длиннее кода, который Вы в него выделяете.
Порядок применения этого приема
- Создайте новый метод и назовите его так, чтобы имя соответствовало тому, ЧТО он делает, а не КАК он это делает. Если код, который Вы хотите выделить, очень прост (например, вызов одной функции), то его стоит выделять только в том случае, когда имя нового метода лучше объяснит читателю исходного текста смысл выделяемого кода. А если Вы не можете придумать более ясное имя для выделяемого кода, то его выделять в отдельный метод не стоит.
- Скопируйте выделяемый код из исходного метода в новый метод.
- Просмотрите выделенный код на наличие ссылок на локальные переменные исходного метода и добавьте эти переменные в качестве аргументов нового метода.
- Просмотрите, не изменяются ли значения этих локальных переменных внутри выделенного кода. Если изменяется значение только одной переменной, посмотрите, можно ли сделать выделяемый метод функцией-запросом (при этом вернуть значение этой переменной через return). Если это затруднительно или таких переменных несколько, Вы не сможете выделить этот код в новый метод. Нужно сперва применить прием разделения временных переменных, а затем повторить этот шаг. Можно устранить временные переменные приемом выделения временной переменной в метод.
- Замените выделенный код в исходном методе вызовом созданного метода.
- Протестируйте работу программы.
А примеры я приведу завтра
Полезный прием