目的
「リファクタリング」を理解するためにサンプルコードを 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";