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

目的

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