パンくず
リファクタリング-プログラマーの体質改善テクニック
データの再編成
クラスによるタイプコードの置き換え
内容
リファクタリング名
クラスによるタイプコードの置き換え
適用ケース要約
振る舞いに影響しない数字のタイプコードを持つクラスがある
適用内容要約
その数字を新しいクラスで置き換える
適用詳細
「シンボリック定数によるマジックナンバーの置き換え」で行ったシンボル化の次の段階。
定数のシンボル化によって何を意味する値なのかは分かりやすくなりましたが、
別名を付けたにすぎず特定の状況でその定数の利用をチェックすることができません。
そこで、これらの変数の集まりをクラス化することで上記の内容をチェックすることが可能になります。
サンプルコード
# 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