オブジェクト間の移動機能


📌 移動方法


良いソフトウェアの核心はモジュール化です!
したがって,メソッドが属するクラスよりも他のクラスの機能をより多く使用する場合,メソッド移動技術を用いて依存性を低減しなければならない.
メソッドで最も一般的なクラスに類似したコンテンツを持つ新しいメソッドを作成し、プロキシメソッドとして既存のメソッドを切り替えまたは削除します.

再包装前のソース

class Account{
	private AccountType type;
    private int daysOverdrawn;
    double overdraftCharge() {
    	if(type.isPremium()) {
        	double result = 10;
            if(daysOverdrawn > 7) {
            	result += (daysOverdrawn -7) * 0.85;
            }
            return result;
        }
        else{
        	return daysOverdrawn * 1.75;
        }
        
    }
    
    double bankCharge() {
    	double result = 4.5;
        if(daysOverdrawn > 0) {
        	result += overdraftCharge();
        }
        return result;
    }
}
Accountクラスには、各勘定科目タイプの貸越金額を計算する機能があり、後で新しい勘定科目タイプを追加すると、各タイプの計算方法が異なります.
したがって、この計算を行うoverraftChargeはAccountTypeクラスに移動します.

再包装したソース

class Account{
	private AccountType type;
    private int daysOverdrawn;
    
    double bankCharge() {
    	double result = 4.5;
        if(daysOverdrawn > 0) {
        	result += type.overdraftCharge(daysOverdrawn);
        }
        return result;
    }
}
class AccountType(){
	double overdraftCharge(int daysOverdrawn) {
    	if(isPremium()) {
        	double result = 10;
            if(daysOverdrawn > 7) {
            	result += (daysOverdrawn -7) * 0.85;
            }
            return result;
        }
        else{
        	return daysOverdrawn * 1.75;
        }
	}
}
再パッケージ後、bankChargeメソッドはAccountTypeクラスのoverraftChargeメソッドを呼び出します.

📌 仲介者の削除


クライアントが委任オブジェクトの別の機能を使用するたびに、サーバに委任メソッドを追加する必要があります.
このように追加すると、伝達のみの委任方法が面倒になります.
また、サーバクラスは仲介者にすぎません
この場合、クライアントは仲介者削除テクノロジーを使用して直接呼び出すことができます.

再包装前のソース

manager = aPerson.manager

class Person {
	get manager(){
    	return this.department.manager
    }
}

再包装したソース

manager = aPerson.department.manager

📑 References


https://armadillo-dev.github.io/book/refactoring-07-moving-features-between-objects/