外部メソッドの導入 (リファクタリング-p162)
リファクタリング
Published: 2018-11-25

目的

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

今回は「外部メソッドの導入」について書きます。

変更前

<?php

date_default_timezone_set('Asia/Tokyo');
// サーバー側のコードという想定
class PreviousEnd
{
    private $_year;
    private $_month;
    private $_date;

    public function __construct($datetime)
    {
        $this->_year = $datetime->format('Y');
        $this->_month = $datetime->format('m');
        $this->_date = $datetime->format('d');
    }

    public function getYear()
    {
        return $this->_year;
    }

    public function getMonth()
    {
        return $this->_month;
    }

    public function getDate()
    {
        return $this->_date;
    }
}

// クライアント側
$targetDate = '2018/10/11';
$previousEnd = new PreviousEnd(new DateTime($targetDate));
$newStart = (new DateTime($targetDate))->setDate(
    $previousEnd->getYear(),
    $previousEnd->getMonth(),
    $previousEnd->getDate() + 1
);

echo $newStart->format('Y/m/d') . "\n";
// 本来はサーバー側のコードを修正したい

変更後

<?php

date_default_timezone_set('Asia/Tokyo');

// サーバー側のコードという想定
class PreviousEnd
{
    private $_year;
    private $_month;
    private $_date;

    public function __construct($datetime)
    {
        $this->_year = $datetime->format('Y');
        $this->_month = $datetime->format('m');
        $this->_date = $datetime->format('d');
    }

    public function getYear()
    {
        return $this->_year;
    }

    public function getMonth()
    {
        return $this->_month;
    }

    public function getDate()
    {
        return $this->_date;
    }
}

$targetDate = '2018/10/11';
$previousEnd = new PreviousEnd(new DateTime($targetDate));
$newStart = nextDay($targetDate, $previousEnd);

function nextDay($targetDate, $arg)
{
    return (new DateTime($targetDate))->setDate(
        $arg->getYear(),
        $arg->getMonth(),
        $arg->getDate() + 1
    );
}

echo $newStart->format('Y/m/d') . "\n";