Рефакторинг: параметризация метода
Бывают такие ситуации, когда несколько методов выполняют одни и те же действия, но с разными значениями внутри. Например, один метод увеличивает значение стоимости товара на 10, а другой – на 30 единиц. И тут конечно лучше было бы создать просто один метод, но для разных значений, который принимал бы параметр, сколько прибавлять единиц к стоимости – 10 или 30, а может и 50 и т.д. Отсюда и название приема – параметризация метода.
Тем самым мы устраним дублированный код и добавим гибкость в объект, т.к. он сможет обрабатывать другие ситуации, нежели 10 и 30. Т.е. любое число, разумеется.
Вот пример:
class Product {
var $price;
…
function addPriceTen() {
$this->price += 10;
}
function addPriceThirty {
$this->price += 30;
}
…
}
Превратим этот класс в следующий:
class Product {
var $price;
…
function addPrice($value) {
$this->price += $value;
}
…
}
Теперь вызовы addPriceTen() и addPriceThirty() мы можем заменить на addPrice(10) и addPrice(30).
Но это мы рассмотрели простейший случай. А теперь случай менее очевидный:
function someMethod() {
$result = min(queryMethod(), 200) * 0.4;
if (queryMethod() > 200) {
$result += (min(queryMethod(), 300) - 200) * 0.6;
}
if (queryMethod() > 400) {
$result += (queryMethod() - 400) * 0.8;
}
return $result;
}
Заменим этот код следующим:
function someMethod() {
$result = newMethod(0, 200) * 0.4;
$result += newMethod(200, 300) * 0.6;
$result += newMethod(400, PHP_INT_MAX) * 0.8;
return $result;
}
function newMethod($start, $end) {
if (queryMethod() > $start) {
return min(queryMethod(), $end) - $start;
}
return 0;
}
Понимаю, что сложнопонимаемый пример
Но если потратить на него чуток времени, то разобраться можно. Как вы уже наверно поняли, самое сложное в этом приеме – выявить повторяемый код и выделить его в отдельную функцию.