達人プログラマー演習問題38

リファクタリングについての本はまだ読んでないんやけど、今読んでるamazon:達人プログラマーリファクタリングの問題が載っていたからやってみた。

問題

以下のコードは何年もかけて幾度と無く修正されてきたものですが、その構造にまで遡ることなく変更されてきたことは明らかです。リファクタリングしてください。

if (state == TEXAS) {
  rate = TX_RATE;
  amt = base * TX_RATE;
  calc = 2 * basis(amt) + extra(amt) *1.05;
}
else if ( (state == OHIO) ||  (state ==NAINE) ) {
  rate = (state == OHIO) ? OH_RATE : MN_RATE;
  amt  = base * rate;
  calc = 2 * basis(amt) + extra(amt) *1.05;
  if (state == OHIO)
    points = 2;
}
else{
  rate == 1;
  amt = base;
  calc = 2 * basis(amt) + extra(amt) *1.05;
}

俺の回答

switch(state){
 case TEXAS:
   rate = TX_RATE; break;
 case OHIO:
   rate = OH_RATE; break;
 case MAINE:
   rate = MN_RATE; break;
 default:
   rate = 1;
   points = 2;
}
amt = base * rate;
calc = 2 * basis(amt) + extra(amt) * 1.05;

ってな感じでどうでしょう?だいぶ読み易くはなったと思うし、今後stateが増えてもcase文を増やせばいいだけになってます。
rubyとかで書くんやったらstateとrateをハッシュ配列を使って2次元テーブルにするのもありかも。