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