Рефакторинг: параметризация метода

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

Понимаю, что сложнопонимаемый пример :) Но если потратить на него чуток времени, то разобраться можно. Как вы уже наверно поняли, самое сложное в этом приеме - выявить повторяемый код и выделить его в отдельную функцию.





Читайте также:




© Copyright. . I-Novice. All Rights Reserved. Terms | Site Map