フィールドの移動 (リファクタリング-p146)
リファクタリング
Published: 2018-11-18

目的

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

今回は「フィールドの移動」について書きます。

「フィールドの移動」 について

クラス間で状態や振る舞いを移動するのは、リファクタリングの本質です。

フィールドを移動することを考えるのは、そのクラスのメソッドよりも別クラスのメソッドの方がそのフィールドを多く使っているのがわかったときです。

変更前

<?php

class AccountType
{
}

class Account
{
    private $_type;
    private $_interestRate;

    public function __construct(AccountType $type, $interestRate)
    {
        $this->_type = $type;
        $this->_interestRate = $interestRate;
    }

    public function interestForAmountDays($amount, $days)
    {
        return $this->_interestRate * $amount * $days / 365;
    }
}

$at = new AccountType();
$a = new Account($at, 0.03);
echo $a->interestForAmountDays(20000, 120) . "\n";

変更後

<?php

class AccountType2
{
    private $_interestRate;

    public function setInterestRate($arg)
    {
        $this->_interestRate = $arg;
    }

    public function getInterestRate()
    {
        return $this->_interestRate;
    }
}

class Account2
{
    private $_type;

    public function __construct(AccountType2 $type)
    {
        $this->_type = $type;
    }

    public function interestForAmountDays($amount, $days)
    {
        return $this->_type->getInterestRate() * $amount * $days / 365;
    }
}

$at = new AccountType2();
$at->setInterestRate(0.03);
$a = new Account2($at);
echo $a->interestForAmountDays(20000, 120) . "\n";