ノートの再構築
2619 ワード
【再構成例】
1.抽出関数(Extract Methods)コードセグメントを関数に入れ、関数名にその関数の用途を説明させる
2.関数をインライン化する(Inline Method)
関数の論理が単純すぎる場合は、呼び出されたコードに移動し、この関数をキャンセルします.
3.一時変数をインライン化する
変数が単純な式で1回付与されると、変数がその式に置き換えられます.
4.一時変数の代わりにクエリーを使用する(Replace Tempwith Query)
5.解釈変数の導入(Introduce Explaining Variable)
複雑な式の結果を一時変数に挿入し、式の用途を変数名で説明します.
6.解剖暫定変数(Split Temporary Variable)
1つの一時変数は複数回割り当てられ(ループ内ではない)、各割り当てに対して独立した一時変数を作成する必要があります.
再構築:
7.ネスト条件文の代わりにガード文を使用する(Replace Nested Conditional with Guard Clauses)
関数の条件文は正常な実行パスを見るのが難しく、ネストされた条件を衛文で置き換えます.
8.分解条件式(Decompose Conditional)複雑な条件文分岐から個別の関数を抽出する
【不良コード】
=========================================
1.重複コード(Duplicated Code)
2.長すぎる関数(Long Method)
3.大きすぎるクラス(Large Class)
4.長すぎるパラメータ列(Long Parameter List)
5.発散変化(Divergent Change):クラスが異なる理由で変更されます.クラスを複数に分割し、各クラスは1つの変更によってのみ変更されます.
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つの変更によってのみ変更されます.