ガード節による入れ子条件記述の置き換え (リファクタリング-p250)
リファクタリング
Published: 2019-02-14

目的

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