条件判定による例外の置き換え (リファクタリング-p315)
リファクタリング
Published: 2019-03-13

目的

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