switch
ステートメントとポリモーフィズムの両方に用途があります。ただし、3番目のオプションも存在することに注意してください(関数ポインター/ラムダ、および高階関数をサポートする言語):問題の識別子をハンドラー関数にマッピングします。これは、例えば、OO言語ではないC、*であるC#で利用可能ですが、Javaでも(まだ)OOではありません*。
いくつかの手続き型言語(何の多型や高次機能を有していない)でswitch
/ if-else
ステートメントは、問題のクラスを解決する唯一の方法でした。この考え方に慣れている多くの開発者は、switch
多態性が多くの場合より優れたソリューションであるオブジェクト指向言語でも使用し続けています。これがswitch
、ポリモーフィズムを支持してステートメントを回避/リファクタリングすることがしばしば推奨される理由です。
とにかく、最適なソリューションは常に大文字と小文字に依存します。質問は次のとおりです。長期的に見て、どのオプションがよりクリーンで、簡潔で、保守しやすいコードを提供しますか
多くの場合、Switchステートメントは扱いにくくなり、多数のケースが発生し、メンテナンスが難しくなります。それらを単一の関数に保持する必要があるため、その関数は巨大になる可能性があります。このような場合は、マップベースのソリューションやポリモーフィックソリューションに向けたリファクタリングを検討する必要があります。
同じswitch
ことが複数の場所でポップアップし始めた場合、多態性はおそらくこれらすべてのケースを統一し、コードを簡素化する最良のオプションです。特に、今後さらにケースが追加されると予想される場合。毎回更新する必要がある場所が多いほど、エラーの可能性が高くなります。ただし、多くの場合、個々のケースハンドラーは非常に単純であるか、非常に多数あるか、相互に関連しているため、それらを完全なポリモーフィッククラス階層にリファクタリングするのはやり過ぎです。クラス階層を維持するのが難しい。この場合、代わりに関数/ラムダを使用する方が簡単かもしれません(言語で許可されている場合)。
ただし、switch
単一の場所にいて、ごく少数のケースで簡単なことをしている場合は、そのままにしておくのが最善のソリューションです。
* ここでは「OO」という用語を大まかに使用します。「本当の」オブジェクト指向または「純粋な」オブジェクト指向についての概念的な議論には興味がありません。