1. ホーム
  2. c#

大きなSwitchステートメント。悪いOOP?

2023-08-16 06:35:44

質問

私はいつも、大きな switch 文は悪い OOP 設計の症状であるという意見を持っています。 過去に、私はこのトピックを議論する記事を読み、彼らはケースを処理するために適切なオブジェクトをインスタンス化するためのポリモーフィズムに基づく典型的な代替の OOP ベースのアプローチを提供してきました。

私は今、TCP ソケットからのデータ ストリームに基づく巨大な switch ステートメントを持つ状況にいます。 コマンドは100の異なるコマンドのうちの1つである可能性があるので、このモンスタースイッチ文をより管理しやすいものに減らす方法を見つけたいのです。

思い出した解決策を見つけるためにいくつかググってみましたが、悲しいことに、最近の Google は多くの種類のクエリに対して無関係な結果の荒れ地になっています。

この種の問題に対する何らかのパターンはありますか? 可能な実装について何か提案はありますか?

私が持っていた 1 つの考えは、インスタンス化するオブジェクト タイプにコマンド テキストをマッチングする、辞書のルックアップを使用することでした。 これには、単に新しいオブジェクトを作成し、新しいコマンドのテーブルに新しいコマンド/タイプを挿入するという素晴らしい利点があります。

しかしながら、これには型の爆発という問題もあります。 100 の新しいクラスが必要になり、さらに、それらをデータモデルにきれいにインターフェイスする方法を見つけなければなりません。 1 つの真のスイッチ文は、本当に行くべき道なのでしょうか?

あなたの考え、意見、コメントをお待ちしています。

どのように解決するのですか?

を使用すると、何らかの効果が得られるかもしれません。 コマンドパターン .

OOPの場合、動作のバリエーションが十分小さければ、いくつかの似たようなコマンドをそれぞれ1つのクラスにまとめて、クラスの完全な爆発を避けることができるかもしれません(そう、もうOOPの達人がそれについて悲鳴をあげているのが聞こえてきます)。しかし、システムがすでに OOP であり、100 以上のコマンドのそれぞれが本当にユニークである場合、それらをユニークなクラスにして、共通のものを統合するために継承を利用するだけです。

システムが OOP でない場合、このためだけに OOP を追加することはありません。単純な辞書検索と関数ポインタ、あるいは言語によってはコマンド名に基づいて動的に生成される関数呼び出しで、簡単にコマンドパターンを使用することができます。そして、論理的に関連づけられた関数を、似たようなコマンドの集まりを表すライブラリにまとめるだけで、管理しやすい分離を実現できる。このような実装を表す良い言葉があるかどうか分かりませんが...。私はいつも、URL を処理するための MVC アプローチに基づいた、ディスパッチャのスタイルだと考えています。