Рефакторинг: параметризация метода
Бывают такие ситуации, когда несколько методов выполняют одни и те же действия, но с разными значениями внутри. Например, один метод увеличивает значение стоимости товара на 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; }
Понимаю, что сложнопонимаемый пример Но если потратить на него чуток времени, то разобраться можно. Как вы уже наверно поняли, самое сложное в этом приеме - выявить повторяемый код и выделить его в отдельную функцию.