ノートの再構築

2619 ワード

【再構成例】
1.抽出関数(Extract Methods)コードセグメントを関数に入れ、関数名にその関数の用途を説明させる
String name = request.getParameter("Name");
if(!isNullOrEmpty(name)){
	......
}
String age = request.getParamter("Age");
if(!isNullOrEmpty(name)){
	......
}
private boolean isNullOrEmpty(final String string){
	if(string!=null && string.length()>0){
		return true;
	}else{
		return false;
	}
}

2.関数をインライン化する(Inline Method)
関数の論理が単純すぎる場合は、呼び出されたコードに移動し、この関数をキャンセルします.
int getRating(){
	return (_numberOfLateDeliveries>5) ? 2 : 1;
}

3.一時変数をインライン化する
変数が単純な式で1回付与されると、変数がその式に置き換えられます.
return (anOrder.basePrice()>1000);

4.一時変数の代わりにクエリーを使用する(Replace Tempwith Query)
if(basePrice()>1000)
	return basePrice()*0.95;
else
	return basePrice()*0.98;
...
double basePrice(){
	return _quantity*_itemPrice;
}

5.解釈変数の導入(Introduce Explaining Variable)
複雑な式の結果を一時変数に挿入し、式の用途を変数名で説明します.
boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1;
boolean isIEBrower = browser.toUpperCase().indexOf("IE") > -1;
boolean wasResized = resize > 0;
if(isMacOs && isIEBrowser && wasInitialized() && wasResized){
	....
}

6.解剖暫定変数(Split Temporary Variable)
1つの一時変数は複数回割り当てられ(ループ内ではない)、各割り当てに対して独立した一時変数を作成する必要があります.
double temp = 2(_height+_width);
System.out.println(temp);
temp=_height*_width;
System.out.println(temp);

再構築:
double perimeter = 2*(_height+_width);
System.out.println(perimeter);
double area = _height*_width;
Sytem.out.println(area);

7.ネスト条件文の代わりにガード文を使用する(Replace Nested Conditional with Guard Clauses)
関数の条件文は正常な実行パスを見るのが難しく、ネストされた条件を衛文で置き換えます.
double getPayAmount(){
	if(...) return deadAmount();
	if(...) return separatedAmount();
	if(...) return retiredAmount();
	return normalPayAmount();
}

8.分解条件式(Decompose Conditional)複雑な条件文分岐から個別の関数を抽出する
if(date.before(SUMMER_START) || date.after(SUMMER_END))
	charge = quantity * _winterRate + _winterServiceCharge;
else
	charge = quantity * _summerRate;
----------------------------------------
if(notSummer(date))
	charge = winterCharge(quantity);
else
	charge = summerCharge(quantity);

【不良コード】
=========================================
1.重複コード(Duplicated Code)
2.長すぎる関数(Long Method)
3.大きすぎるクラス(Large Class)
4.長すぎるパラメータ列(Long Parameter List)
5.発散変化(Divergent Change):クラスが異なる理由で変更されます.クラスを複数に分割し、各クラスは1つの変更によってのみ変更されます.