メソッドの移動 (リファクタリング-p142)
リファクタリング
Published: 2018-11-17

目的

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

今回は「メソッドの移動」について書きます。

「メソッドの移動」 について

私は、クラスの振る舞いが多すぎる場合や、クラス間のやり取りが多く、結合度が高すぎる場合にメソッドを移動します

変更前

<?php

class AccountType
{
    public function isPremium()
    {
        return true;
    }
}

class Account
{
    private $_type;
    private $_daysOverdrawn;

    public function __construct($type, $daysOverdrawn)
    {
        $this->_type = $type;
        $this->_daysOverdrawn = $daysOverdrawn;
    }

    public function overdraftCharge()
    {
        if ($this->_type->isPremium()) {
            $result = 10;
            if ($this->_daysOverdrawn > 7) {
                $result += ($this->_daysOverdrawn - 7) * 0.05;
                return $result;
            }

            return $result;
        }

        return $this->_daysOverdrawn * 1.75;
    }

    public function bankCharge()
    {
        $result = 4.5;
        if ($this->_daysOverdrawn > 0) {
            $result += $this->overdraftCharge();
        }

        return $result;
    }
}

$at = new AccountType();
$a = new Account($at, 10);
echo $a->bankCharge() . "\n";

変更後

<?php

class AccountType2
{
    public function isPremium()
    {
        return true;
    }

    public function overdraftCharge($daysOverdrawn)
    {
        if ($this->isPremium()) {
            $result = 10;
            if ($daysOverdrawn > 7) {
                $result += ($daysOverdrawn - 7) * 0.05;
                return $result;
            }

            return $result;
        }

        return $daysOverdrawn * 1.75;
    }
}

class Account2
{
    private $_type;
    private $_daysOverdrawn;

    public function __construct($type, $daysOverdrawn)
    {
        $this->_type = $type;
        $this->_daysOverdrawn = $daysOverdrawn;
    }

    public function bankCharge()
    {
        $result = 4.5;
        if ($this->_daysOverdrawn > 0) {
            $result += $this->_type->overdraftCharge($this->_daysOverdrawn);
        }

        return $result;
    }
}

$at = new AccountType2();
$a = new Account2($at, 10);
echo $a->bankCharge() . "\n";