目的
「リファクタリング」を理解するためにサンプルコードを PHP で書き換えてみました。
今回は「条件判定による例外の置き換え」について書きます。
「条件判定による例外の置き換え」 について
例外を発生させているが、本来は呼び出し側が先にチェックすべきである。
例外は、例外的な振る舞い、すなわち予期しないエラーに対して使用すべきです。
条件判定の代わりとして使うべきではありません。
例
変更前
<?php
class ResourcePool
{
private $_available = [];
private $_allocated = [];
public function getResource()
{
$result = [];
try {
// null が返却されてもエラーにならない
$result = array_pop($this->_available);
array_push($this->_allocated, $result);
return $result;
} catch (Exception $ex) {
array_push($this->_allocated, 'resource');
return $result;
}
}
}
$rp = new ResourcePool();
var_dump($rp->getResource());
変更後 (その1)
<?php
class ResourcePool2
{
private $_available = [];
private $_allocated = [];
public function getResource()
{
$result = [];
if (empty($this->_available)) {
$result = ['resource'];
array_push($this->_allocated, $result);
return $result;
}
try {
$result = array_pop($this->_available);
array_push($this->_allocated, $result);
return $result;
} catch (Exception $ex) {
array_push($this->_allocated, 'resource');
return $result;
}
}
}
$rp2 = new ResourcePool2();
var_dump($rp2->getResource());
変更後 (その2)
<?php
class ResourcePool3
{
private $_available = [];
private $_allocated = [];
public function getResource()
{
$result = [];
if (empty($this->_available)) {
$result = ['resource'];
} else {
$result = array_pop($this->_available);
}
array_push($this->_allocated, $result);
return $result;
}
}
$rp3 = new ResourcePool3();
var_dump($rp3->getResource());