フィールドによるサブクラスの置き換え (リファクタリング-p232)
リファクタリング
Published: 2018-12-23

目的

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

今回は「フィールドによるサブクラスの置き換え」について書きます。

「フィールドによるサブクラスの置き換え」 について

定数データを返すメソッドだけが異なるサブクラスがある。

変更前

<?php

abstract class Person
{
    abstract function isMale();
    abstract function getCode();
}

class Male extends Person
{
    public function isMale()
    {
        return true;
    }

    public function getCode()
    {
        return 'M';
    }
}

class Female extends Person
{
    public function isMale()
    {
        return false;
    }

    public function getCode()
    {
        return 'F';
    }
}

変更後

<?php

class Person2
{
    private $_isMale;
    private $_code;

    protected function __construct($isMale, $code)
    {
        $this->_isMale = $isMale;
        $this->_code = $code;
    }

    public static function createMale()
    {
        return new self(true, 'M');
    }

    public static function createFemale()
    {
        return new self(false, 'F');
    }

    public function isMale()
    {
        return $this->_isMale;
    }

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

$kent = Person2::createMale();
echo (int)$kent->isMale() . "\n";
echo $kent->getCode() . "\n";

$ann = Person2::createFemale();
echo (int)$ann->isMale() . "\n";
echo $ann->getCode() . "\n";