局所的拡張の導入 (リファクタリング-p164)
リファクタリング
Published: 2018-12-01

目的

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

今回は「局所的拡張の導入」について書きます。

「局所的拡張の導入」 について

それらの追加されるメソッドを備えた新たなクラスを作る。この拡張クラスは、元のクラスのサブクラスまたはラッパーである。

変更前

<?php
date_default_timezone_set('Asia/Tokyo');

class Client
{
    public static function test()
    {
        $dt = new DateTime('2018/10/14');
        $nextDay = self::nextDay($dt);
        echo $nextDay->format('Y/m/d') . "\n";
    }

    private static function nextDay(DateTime $datetime)
    {
        return $datetime->modify('+1 days');
    }
}

Client::test();

変更後

<?php
date_default_timezone_set('Asia/Tokyo');

// サブクラスを使う場合
class MfDateSub2 extends DateTime
{
    public function nextDay()
    {
        return $this->modify('+1 days');
    }
}

class Client2
{
    public static function test()
    {
        $dt = new MfDateSub2('2018/10/14');
        echo $dt->nextDay()->format('Y/m/d') . "\n";
    }
}

Client2::test();
echo '---' . "\n";

// 委譲を使う場合
class Client3
{
    public static function test()
    {
        $dt = new DateTime('2018/10/14');
        $mdw = new MfDateWrap3($dt);
        echo $mdw->nextDay()->format('Y/m/d') . "\n";
    }
}

class MfDateWrap3
{
    /* @var DateTime */
    private $_original;

    public function __construct(DateTime $arg)
    {
        $this->_original = $arg;
    }

    public function nextDay()
    {
        return $this->_original->modify('+1 days');
    }
}

Client3::test();