ポリモフィズムによる条件分岐の置き換え
リファクタリング前のソース
リファクタリング後のソース1
リファクタリング後のソース2
(ここまでが「リファクタリング後のソース1」)
if (hoge == A){ A; } else if (hoge == B){ B; } else if (hoge == C){ C; } |
-> |
if (hoge == A){ X; } else if (hoge == B){ X; } else if (hoge == C){ X; } |
-> | X |
(以下、if文を無くす処理)
Figure figure = new Figure(); assertEquals(100.0,figure.getArea(10,"Square")); assertEquals(314.1592653589793,figure.getArea(10,"Circle")); assertEquals(43.30127018922193,figure.getArea(10,"EquilateralTriangle")); ↓ assertEquals(100.0,new Square(10).getArea()); assertEquals(314.1592653589793,new Circle(10).getArea()); assertEquals(43.30127018922193,new EquilateralTriangle(10).getArea());
polymorphism(多態性)とは?
getArea は Shape に対して呼び出しているが、
- 一つのメッセージに多くの異なるオブジェクトが答えられること
- あるオブジェクトへの操作が呼び出し側(sender)ではなく、受け手のオブジェクト(receiver)によって定まる特性のこと
実際の処理は Shape ではなく、受け手のオブジェクト(SquareやRectangleやEquilateralTriangle)で行われる
意図の伝わりやすい、詳細レベルが揃った小さなステップ群にロジックを変換する
リファクタリング前のソース
リファクタリング後のソース
インタフェース(または抽象クラス)を使ってプログラミングすることで、クラス間の結合度を下げる!
リファクタリング前のソース
リファクタリング後のソース(001)
リファクタリング後のソース(002)
リファクタリング後のソース(003)
リファクタリング後のソース(004)
リファクタリング後のソース(005)
(P217)
メソッドを汎用化し、それから汎用メソッドを引き上げて Template Method を形成する。
前提知識
リファクタリング前のソース
リファクタリング後のソース(001)
リファクタリング後のソース(002)
リファクタリング後のソース(003)
リファクタリング後のソース(004)