目的
「リファクタリング」を理解するためにサンプルコードを 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";