ポリモフィズムによる条件分岐の置き換え
リファクタリング前のソース
リファクタリング後のソース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)で行われる
意図の伝わりやすい、詳細レベルが揃った小さなステップ群にロジックを変換する
リファクタリング前のソース
疑似コード1
疑似コード2
疑似コード3
リファクタリング後のソース