目的
「リファクタリング」を理解するためにサンプルコードを PHP で書き換えてみました。
今回は「ガード節による入れ子条件記述の置き換え」について書きます。
「ガード節による入れ子条件記述の置き換え」 について
メソッドに正常ルールが不明確な条件つき振る舞いがある。
逆にガード節は「めったに起きないが、起きたときには、何もしないで出て行く」ことを伝えます。
例
変更前
<?php
class Sample
{
private $_isDead;
private $_isSeparated;
private $_isRetired;
public function __construct($isDead, $isSeparated, $isRetired)
{
$this->_isDead = $isDead;
$this->_isSeparated = $isSeparated;
$this->_isRetired = $isRetired;
}
public function getPayAmount()
{
$result = 0;
if ($this->_isDead) {
$result = $this->deadAmount();
} else {
if ($this->_isSeparated) {
$result = $this->separatedAmount();
} else {
if ($this->_isRetired) {
$result = $this->retiredAmount();
} else {
$result = $this->normalPayAmount();
}
}
}
return $result;
}
private function deadAmount()
{
return 9000;
}
private function separatedAmount()
{
return 8000;
}
private function retiredAmount()
{
return 7000;
}
private function normalPayAmount()
{
return 6000;
}
}
$s = new Sample(false, false, false);
echo $s->getPayAmount() . "\n";
変更後
<?php
class Sample2
{
private $_isDead;
private $_isSeparated;
private $_isRetired;
public function __construct($isDead, $isSeparated, $isRetired)
{
$this->_isDead = $isDead;
$this->_isSeparated = $isSeparated;
$this->_isRetired = $isRetired;
}
public function getPayAmount()
{
if ($this->_isDead) {
return $this->deadAmount();
}
if ($this->_isSeparated) {
return $this->separatedAmount();
}
if ($this->_isRetired) {
return $this->retiredAmount();
}
return $this->normalPayAmount();
}
private function deadAmount()
{
return 9000;
}
private function separatedAmount()
{
return 8000;
}
private function retiredAmount()
{
return 7000;
}
private function normalPayAmount()
{
return 6000;
}
}
$s2 = new Sample2(false, false, false);
echo $s2->getPayAmount() . "\n";