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