オブジェクトそのものの受け渡し (リファクタリング-p288)
リファクタリング
Published: 2019-03-05

目的

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

今回は「オブジェクトそのものの受け渡し」について書きます。

「オブジェクトそのものの受け渡し 」 について

あるオブジェクトから複数の値を取得し、それらの値をメソッド呼び出しの引数として渡している。

「オブジェクトそのものの受け渡し」は、引数リストを変更に対して頑強にするだけでなく、しばしばコードを読みやすくします。

変更前

<?php

class TempRange
{
    private $_low;
    private $_high;

    public function __construct($low, $high)
    {
        $this->_low = $low;
        $this->_high = $high;
    }

    public function getLow()
    {
        return $this->_low;
    }

    public function getHigh()
    {
        return $this->_high;
    }
}

class Room
{
    public function withinPlan(HeatingPlan $plan)
    {
        $low = $this->daysTempRange()->getLow();
        $high = $this->daysTempRange()->getHigh();

        return $plan->withinRange($low, $high);
    }

    // 現在までの気温範囲
    private function daysTempRange()
    {
        return new TempRange(10, 50);
    }
}

class HeatingPlan
{
    /* @var TempRange */
    private $_range;

    public function __construct($range)
    {
        $this->_range = $range;
    }

    public function withinRange($low, $high)
    {
        return (
            $low >= $this->_range->getLow() &&
            $high <= $this->_range->getHigh()
        );
    }
}

// 暖房計画の気温範囲
$temp_range = new TempRange(10, 70);
$hp = new HeatingPlan($temp_range);

$r = new Room();
echo (int)$r->withinPlan($hp) . "\n";

変更後

<?php

class TempRange2
{
    private $_low;
    private $_high;

    public function __construct($low, $high)
    {
        $this->_low = $low;
        $this->_high = $high;
    }

    public function getLow()
    {
        return $this->_low;
    }

    public function getHigh()
    {
        return $this->_high;
    }

    public function includes(TempRange2 $arg)
    {
        return (
            $arg->getLow() >= $this->getLow() &&
            $arg->getHigh() <= $this->getHigh()
        );
    }
}
class Room2
{
    public function withinPlan(HeatingPlan2 $plan)
    {
        return $plan->withinRange($this->daysTempRange());
    }

    // 現在までの気温範囲
    private function daysTempRange()
    {
        return new TempRange2(10, 50);
    }
}

class HeatingPlan2
{
    /* @var TempRange2 */
    private $_range;

    public function __construct($range)
    {
        $this->_range = $range;
    }

    public function withinRange(TempRange2 $room_range)
    {
        return $this->_range->includes($room_range);
    }
}

// 暖房計画の気温範囲
$temp_range = new TempRange2(10, 70);
$hp2 = new HeatingPlan2($temp_range);

$r2 = new Room2();
echo (int)$r2->withinPlan($hp2) . "\n";