例外によるエラーコードの置き換え (リファクタリング-p310)
リファクタリング
Published: 2019-03-11

目的

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

今回は「例外によるエラーコードの置き換え」について書きます。

「例外によるエラーコードの置き換え」 について

メソッドがエラーを示す特別なコードをリターンしている。

代わりに例外を発生させる

変更前

<?php

class Account
{
    private $_balance;

    public function __construct($balance)
    {
        $this->_balance = $balance;
    }

    public function withdraw($amount)
    {
        if ($amount > $this->_balance) {
            return -1;
        } else {
            $this->_balance -= $amount;
            return 0;
        }
    }
}

$a1 = new Account(1000);
echo $a1->withdraw(500) . "\n";
echo $a1->withdraw(1500) . "\n";

変更後 (チェックされない例外)

<?php

// 呼び出し側でチェック
class Account2
{
    private $_balance;

    public function __construct($balance)
    {
        $this->_balance = $balance;
    }

    public function withdraw($amount)
    {
        if ($amount > $this->_balance) {
            throw new Exception('出金額が多すぎる');
        }

        $this->_balance -= $amount;
    }

    public function getBalance()
    {
        return $this->_balance;
    }
}

$a2 = new Account2(1000);
$a2->withdraw(500);
echo $a2->getBalance() . "\n";

// 例外発生
// $a2->withdraw(1500);

変更後 (チェックされる例外)

<?php

class BalanceException extends Exception {}

class Account3
{
    private $_balance;

    public function __construct($balance)
    {
        $this->_balance = $balance;
    }

    public function withdraw($amount)
    {
        if ($amount > $this->_balance) {
            throw new BalanceException();
        }

        $this->_balance -= $amount;
    }

    public function getBalance()
    {
        return $this->_balance;
    }
}

$a3 = new Account3(1000);
$a3->withdraw(300);
echo $a3->getBalance() . "\n";

try {
    $a3->withdraw(800);

    // doTheUsualThin();
} catch (BalanceException $ex) {
    echo '例外発生: BalanceException' . "\n";
    // handleOverdrawn();
}