Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

書籍 リファクタリング−プログラマーの体質改善 | データの再編成 | クラスによるタイプコードの置き換え

パンくず

リファクタリング-プログラマーの体質改善テクニック
データの再編成
クラスによるタイプコードの置き換え

内容

リファクタリング

クラスによるタイプコードの置き換え

適用ケース要約

振る舞いに影響しない数字のタイプコードを持つクラスがある

適用内容要約

その数字を新しいクラスで置き換える

適用詳細

「シンボリック定数によるマジックナンバーの置き換え」で行ったシンボル化の次の段階。
定数のシンボル化によって何を意味する値なのかは分かりやすくなりましたが、
別名を付けたにすぎず特定の状況でその定数の利用をチェックすることができません。

そこで、これらの変数の集まりをクラス化することで上記の内容をチェックすることが可能になります。

サンプル

黄金比白銀比を算出する機能を実装します

サンプルコード

リファクタリング

# encoding: Shift_JIS

class RatioCalculator
  GOLDEN_RATIO = 1.618
  SILVER_RATIO = 1.4142
  RATIO_TYPE_GOLDEN = 1
  RATIO_TYPE_SILVER = 2

  def self.calculate_ratio(base_length, ratio_type)
    ratio = nil
    case ratio_type
    when RATIO_TYPE_GOLDEN
      ratio = GOLDEN_RATIO
    when RATIO_TYPE_SILVER
      ratio = SILVER_RATIO
    else
      raise "uncorrect ratio type #{ratio_type}"
    end
    return base_length*ratio
  end
end

(1..2).each {|base_length|
  print "黄金比 @@@base=",base_length,":result=",RatioCalculator.calculate_ratio(base_length,RatioCalculator::RATIO_TYPE_GOLDEN),"\n"
  print "白銀比 @@@base=",base_length,":result=",RatioCalculator.calculate_ratio(base_length,RatioCalculator::RATIO_TYPE_SILVER),"\n"
}

リファクタリング

# encoding: Shift_JIS

class RatioCalculator
  def self.calculate_ratio(base_length, ratio_type)
    return base_length*RatioType::get_ratio(ratio_type)
  end
end

class RatioType
  @@ratio_type={:golden_ratio_type=>1,:silver_ratio_type=>2}
  @@ratio={:golden_ratio=>1.618,:silver_ratio=>1.4142}
  
  def self.get_golden_ratio_type()
    return @@ratio_type[:golden_ratio_type]
  end
  
  def self.get_silver_ratio_type()
    return @@ratio_type[:silver_ratio_type]
  end
  
  def self.get_golden_ratio()
    return @@ratio[:golden_ratio]
  end
  
  def self.get_silver_ratio()
    return @@ratio[:silver_ratio]
  end
  
  def self.get_ratio(ratio_type)
    ratio = nil
    case ratio_type
    when RatioType::get_golden_ratio_type
      ratio = get_golden_ratio
    when RatioType::get_silver_ratio_type
      ratio = get_silver_ratio
    else
      raise "uncorrect ratio type #{ratio_type}"
    end
    return ratio
  end
end
(1..2).each {|base_length|
  print "黄金比 @@@base=",base_length,":result=",RatioCalculator.calculate_ratio(base_length,RatioType::get_golden_ratio_type),"\n"
  print "白銀比 @@@base=",base_length,":result=",RatioCalculator.calculate_ratio(base_length,RatioType::get_silver_ratio_type),"\n"
}

出力(共通)

黄金比 @@@base=1:result=1.618
白銀比 @@@base=1:result=1.4142
黄金比 @@@base=2:result=3.236
白銀比 @@@base=2:result=2.8284