私はリクエストを処理するプロジェクトに取り組んでおり、リクエストにはコマンドとパラメーターの2つのコンポーネントがあります。各コマンドのハンドラーは非常にシンプルです(<10行、多くの場合<5)。少なくとも20のコマンドがあり、50を超える可能性があります。
私はいくつかの解決策を考え出しました:
- コマンド上の1つの大きなスイッチ/ if-else
- 機能へのコマンドのマップ
- 静的クラス/シングルトンへのコマンドのマップ
各コマンドは少しエラーチェックを行い、抽象化できるビットは、各コマンドに定義されているパラメーターの数をチェックすることだけです。
この問題の最善の解決策は何ですか?また、その理由は何ですか?また、私が見逃したかもしれないデザインパターンにもオープンです。
それぞれについて、次の賛否両論のリストを作成しました。
スイッチ
- 長所
- すべてのコマンドを1つの関数に保持します。シンプルなので、これは視覚的なルックアップテーブルになります
- 1か所でしか使用されない大量の小さな関数/クラスでソースを乱雑にする必要はありません。
- 短所
- とても長い
- プログラムでコマンドを追加するのが難しい(デフォルトのケースを使用してチェーンする必要がある)
マップコマンド->関数
- 長所
- 小さい一口サイズのチャンク
- プログラムでコマンドを追加/削除できる
- 短所
- インラインで行う場合、スイッチと視覚的に同じ
- インラインで行われない場合、多くの機能が1か所でのみ使用されます
マップコマンド->静的クラス/シングルトン
- 長所
- ポリモーフィズムを使用して単純なエラーチェックを処理できます(3行だけですが、それでも)
- マップと同様のメリット->機能ソリューション
- 短所
- 多くの非常に小さなクラスがプロジェクトを混乱させます
- 実装がすべて同じ場所にあるわけではないため、実装をスキャンするのは簡単ではありません
追加のメモ:
私はGoでこれを書いていますが、ソリューションは言語固有のものではないと思います。他の言語でも非常に似たようなことをする必要があるかもしれないので、私はより一般的な解決策を探しています。
コマンドは文字列ですが、便利であれば、これを簡単に数値にマップできます。関数のシグネチャは次のようなものです。
Reply Command(List<String> params)
Goにはトップレベルの機能があり、私が検討している他のプラットフォームにもトップレベルの機能があるため、2番目と3番目のオプションの違いがあります。