クラスによるタイプコードの置き換え (リファクタリング-p218)
リファクタリング
Published: 2018-12-16

目的

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

今回は「クラスによるタイプコードの置き換え」について書きます。

「クラスによるタイプコードの置き換え」 について

振る舞いに影響しない数字のタイプコードを持つクラスがある。

この数字をクラスで置き換えれば、コンパイラはそのクラスについて型チェックができます。

変更前

<?php

class Person
{
    private $_bloodGroup;

    public function __construct($bloodGroup)
    {
        $this->_bloodGroup = $bloodGroup;
    }

    public function getBloodGroup()
    {
        return $this->_bloodGroup;
    }
}

// 呼び出し
$person = new Person(0);
echo $person->getBloodGroup() . "\n";

$person = new Person(2);
echo $person->getBloodGroup() . "\n";

変更後

<?php

class BloodGroup
{
    const O = 0;
    const A = 1;
    const B = 2;
    const AB = 3;

    private static $_values = [
        self::O,
        self::A,
        self::B,
        self::AB,
    ];

    private $_code;

    public function __construct($code)
    {
        $this->_code = $code;
    }

    public function getCode()
    {
        return $this->_code;
    }

    private static function code($arg)
    {
        return $this->_values[$arg];
    }
}

class Person2
{
    private $_bloodGroup;

    public function __construct(BloodGroup $bloodGroup)
    {
        $this->_bloodGroup = $bloodGroup;
    }

    public function setBloodGroup(BloodGroup $arg)
    {
        $this->_bloodGroup = $arg;
    }

    public function getBloodGroupCode()
    {
        return $this->_bloodGroup->getCode();
    }
}

// 呼び出し
// PHP ではメンバ変数にクラスを設定できない
// BloodGroup クラスの呼び出し方を検討する
//
// Person クラスに BloodGroup クラスを注入する
$blood = new BloodGroup(BloodGroup::A);
$person = new Person2($blood);
echo $person->getBloodGroupCode() . "\n";

$blood = new BloodGroup(BloodGroup::B);
$person = new Person2($blood);
echo $person->getBloodGroupCode() . "\n";
<?php