0

私は、かなり単純な問題に対して 2 つの異なる設計アプローチに取り組んでいます。

私は(Web/SOAPなどではなく、一般的な意味で)サービスを持っています:

  • Inputクラスを受ける
  • 基本的に単なるデータであり、すべて入力データに依存するクラスInputを処理および作成するために使用します。Output

2 つの異なる設計アプローチは次のとおりです。

  • OutputCreatorを作成および設定する方法を知っているクラスを使用し、基本的に POCOOutputのままにします。OutputOutputCreatorはすべての処理ロジックがあり、Output非常に単純で悪用することはできません。
  • または、 を特定のタイプのクラスInputに直接渡します。Outputの各タイプはOutputを処理する方法を知っているInputため、動作もサポートします。キーOutputデータは、それぞれ異なるタイプOutputが実装するインターフェースによって定義されます。

最初のアプローチは、すべての処理ロジックをサービスの内部にできることを意味します。2 つ目は、そのロジックがカプセル化されているクラスは必要ないことを意味しますが、Creatorより多くのロジックを公開する可能性があります (さらに、SRP に違反する可能性があります)。

ベストプラクティスに近いアプローチはどれですか?

ありがとう

4

1 に答える 1

0

これは、何を達成したいかによって大きく異なります。

サービスの応答性がある程度必要な場合は、一種のキューで十分と思われます。

これの意味は:

あなたのサービスはInputそれを受け取り、InputQueue.

次に、OutputCreator定期的に別のスレッドからそのキューを読み取り、作成してOutputに配置しますOutputQueue。これが可能で、結果を非同期に、つまりメッセージを介して渡すことができる場合は、完了です。

Queue への追加と削除はスレッドで実行できるため、対応するキューがブロックされている場合に InputThread または OutputThread をブロックしません。

Input結果として期待する場合Outputは、Proactor パターンがこれを解決します。これは実装がより複雑ですが、次の PDF で詳しく説明されています。Doug Schmidt on Proactor パターン Proactor の例は WebServer です。

ディスパッチだけが必要な場合は、Reactor パターン (ほぼ上記で説明したとおり) が最適なソリューションです。 Doug Schmidt on Reactor パターン Reactor を C# や Java で実装するのはそれほど難しくありません。Reactor の例として、さまざまなクライアントからの Logentries をサーバー側のログに書き込む中央ログ サーバーがあります。

最も柔軟なのはアクティブ オブジェクト パターンですが、実装が最も困難です。メソッドの実行からメソッドの呼び出しを切り離すことさえできます。詳細はこちら: Doug Schmidt on Active Object Active オブジェクト の例は CORBA ORB です。

于 2012-07-31T13:37:47.210 に答える