大きなSwitchステートメント。悪いOOP?
質問
私はいつも、大きな switch 文は悪い OOP 設計の症状であるという意見を持っています。 過去に、私はこのトピックを議論する記事を読み、彼らはケースを処理するために適切なオブジェクトをインスタンス化するためのポリモーフィズムに基づく典型的な代替の OOP ベースのアプローチを提供してきました。
私は今、TCP ソケットからのデータ ストリームに基づく巨大な switch ステートメントを持つ状況にいます。 コマンドは100の異なるコマンドのうちの1つである可能性があるので、このモンスタースイッチ文をより管理しやすいものに減らす方法を見つけたいのです。
思い出した解決策を見つけるためにいくつかググってみましたが、悲しいことに、最近の Google は多くの種類のクエリに対して無関係な結果の荒れ地になっています。
この種の問題に対する何らかのパターンはありますか? 可能な実装について何か提案はありますか?
私が持っていた 1 つの考えは、インスタンス化するオブジェクト タイプにコマンド テキストをマッチングする、辞書のルックアップを使用することでした。 これには、単に新しいオブジェクトを作成し、新しいコマンドのテーブルに新しいコマンド/タイプを挿入するという素晴らしい利点があります。
しかしながら、これには型の爆発という問題もあります。 100 の新しいクラスが必要になり、さらに、それらをデータモデルにきれいにインターフェイスする方法を見つけなければなりません。 1 つの真のスイッチ文は、本当に行くべき道なのでしょうか?
あなたの考え、意見、コメントをお待ちしています。
どのように解決するのですか?
を使用すると、何らかの効果が得られるかもしれません。 コマンドパターン .
OOPの場合、動作のバリエーションが十分小さければ、いくつかの似たようなコマンドをそれぞれ1つのクラスにまとめて、クラスの完全な爆発を避けることができるかもしれません(そう、もうOOPの達人がそれについて悲鳴をあげているのが聞こえてきます)。しかし、システムがすでに OOP であり、100 以上のコマンドのそれぞれが本当にユニークである場合、それらをユニークなクラスにして、共通のものを統合するために継承を利用するだけです。
システムが OOP でない場合、このためだけに OOP を追加することはありません。単純な辞書検索と関数ポインタ、あるいは言語によってはコマンド名に基づいて動的に生成される関数呼び出しで、簡単にコマンドパターンを使用することができます。そして、論理的に関連づけられた関数を、似たようなコマンドの集まりを表すライブラリにまとめるだけで、管理しやすい分離を実現できる。このような実装を表す良い言葉があるかどうか分かりませんが...。私はいつも、URL を処理するための MVC アプローチに基づいた、ディスパッチャのスタイルだと考えています。
関連
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み] 関数を終了するには?
-
[解決済み] switch文の複数ケース
-
[解決済み】セッターが "this "を返すのはバッドプラクティスか?
-
[解決済み] Visual Studio(またはReSharper)を使って、クラスのフィールドからコンストラクタを生成するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。
-
[解決済み] Javaのハッシュマップ検索は本当にO(1)なのか?
-
[解決済み] C# 関数を辞書に格納する