メソッドによる引数の置き換え (リファクタリング-p292)
リファクタリング
Published: 2019-03-07

目的

「リファクタリング」を理解するためにサンプルコードを PHP で書き換えてみました。

今回は「メソッドによる引数の置き換え」について書きます。

「メソッドによる引数の置き換え」 について

あるオブジェクトがメソッドを呼び出し、その戻り値を別のメソッドの引数として渡している。受信側は、そのメソッドを呼び出し可能である。

もしメソッドが、引数で渡される値を別の方法で取得できるならば、そのように修正すべきです。

変更前

<?php

class Sample
{
    private $_quantity;
    private $_itemPrice;

    public function __construct($quantity, $itemPrice)
    {
        $this->_quantity = $quantity;
        $this->_itemPrice = $itemPrice;
    }

    public function getPrice()
    {
        $basePrice = $this->_quantity * $this->_itemPrice;
        $discountLevel = 1;
        if ($this->_quantity > 100) {
            $discountLevel = 2;
        }

        return $this->discountedPrice($basePrice, $discountLevel);
    }

    private function discountedPrice($basePrice, $discountLevel)
    {
        if ($discountLevel === 2) {
            return $basePrice * 0.1;
        }

        return $basePrice * 0.05;
    }
}

$s = new Sample(10, 2000);
echo $s->getPrice() . "\n";

変更後

<?php

class Sample2
{
    private $_quantity;
    private $_itemPrice;

    public function __construct($quantity, $itemPrice)
    {
        $this->_quantity = $quantity;
        $this->_itemPrice = $itemPrice;
    }

    public function getPrice()
    {
        return $this->discountedPrice();
    }

    private function getBasePrice()
    {
        return $this->_quantity * $this->_itemPrice;
    }
    private function getDiscountLevel()
    {
        $discountLevel = 1;
        if ($this->_quantity > 100) {
            $discountLevel = 2;
        }

        return $discountLevel;
    }

    private function discountedPrice()
    {
        $basePrice = $this->getBasePrice();
        if ($this->getDiscountLevel() === 2) {
            return $basePrice * 0.1;
        }

        return $basePrice * 0.05;
    }
}

$s = new Sample2(10, 2000);
echo $s->getPrice() . "\n";