目的
「リファクタリング」を理解するためにサンプルコードを PHP で書き換えてみました。
今回は「サブクラスによるタイプコードの置き換え」について書きます。
「サブクラスによるタイプコードの置き換え」 について
クラスの振る舞いに影響を与える不変のタイプコードがある。
例
変更前
<?php
class Employee1
{
private $_type;
const ENGINEER = 0;
const SALESMAN = 1;
const MANAGER = 2;
public function __construct($type)
{
$this->_type = $type;
}
}
変更後
<?php
abstract class Employee2
{
const ENGINEER = 0;
const SALESMAN = 1;
const MANAGER = 2;
abstract public function getType();
public static function create($type)
{
switch ($type) {
case self::ENGINEER:
return new Engineer();
case self::SALESMAN:
return new Salesman();
case self::MANAGER:
return new Manager();
default:
throw new Exception('タイプコードの値が不正');
}
}
}
class Engineer extends Employee2
{
public function getType()
{
return Employee2::ENGINEER;
}
}
class Salesman extends Employee2
{
public function getType()
{
return Employee2::SALESMAN;
}
}
class Manager extends Employee2
{
public function getType()
{
return Employee2::MANAGER;
}
}
$e2 = Employee2::create(1);
echo $e2->getType() . "\n";