Switch Statements
兆候と症状
複雑なswitch文またはif文の連続がこのCode Smellの兆候です。
問題の理由
switch/case演算子の比較的まれな使用は、オブジェクト指向コードの特徴の1つです。多くの場合、同じようなswitch文はプログラム内のさまざまな場所に散在します。新しい条件が追加されたら、すべてのスイッチコードを見つけて変更する必要があります。
経験則として、switch文が使われている場所ではポリモルフィズムを検討する必要があります。
対処
- switch文を分離して適切なクラスに配置するには、「Extract Method」と「Move Method」が必要になる場合があります。
- プログラムのランタイムモードが切り替えられるときなどにように、switch文がtype codeに基づいている場合は、「Replace Type Code with Subclasses」か、「Replace Type Code with State/Strategy」を使用します。
- 継承構造を指定した後、「Replace Conditional with Polymorphism」を使います。
- 演算子にあまり多くの条件がなく、それらがすべて異なるパラメーターで同じメソッドを呼び出す場合、ポリモルフィズムはでは問題を解決できません。この場合、「Replace Parameter with Explicit Methods」の手法でそのメソッドを複数の小さなメソッドに分割し、それに応じてswitch文を変更できます。
- 条件オプションの1つがnullの場合、「Introduce Null Object」を使います。
効果
- ソースコードの構成を改善することができます。
When to Ignore
以下のような場合はswitch文をリファクタリングする必要はありません。
- switch文がシンプルなものである場合。
- GoFのデザインパターンである Factory Method や Abstract Factory パターンを実装する場合。