私はアプリケーションに取り組んでおり、そのモジュールは次の財務操作を順番に実行します:
ユーザーが特定の金額を自分の銀行口座に送金するように要求すると、次のようになります。
上記のすべてのアクションの結果がログに記録されます。
上記のすべての条件が満たされる場合、トランザクションが実行されます。将来的には、いくつかのチェックが追加される可能性があります。
上記のケースに最適なオブジェクト指向のデザインパターンはどれですか。
探しているのは Chain of Responsibility のようです。この場合、次のクラスを使用できます。
TransactionValidatorBase
抽象基本クラスTransactionTimeValidator
TransactionAmountValidator
TransactionAccountValidator
これはチェーンされて、指定した多くのルールが適用されます。
さらに読む
ここでの正しいパターンは、実際にはコンテキストに依存します。固執する特定のパターンを選択する前に、これらの質問に対する答えを見つけようとします。
直感に基づいて、エラーコードの集約パラメーターを持つプレーンメソッドとしてコーディングします。
public void DoTransaction(IErrorAgregator error, TransactionRequest request)
{
if(!IsTransactionInCertainTimePeriod(request, error)) return;
if(!IsTransactionAmountInUserBounds(request, error)) return;
if(!UserHaveDefaultAccount(request, error)) return;
bankingTransactor.PerformTransaction(request);
}
DoTransactionを "ITransactionValidationStragegy"インターフェイスに配置して、検証ボイラープレートコードを含むレイヤーのスーパータイプを作成することをお勧めします。
ただし、この設計では、検証ロジックはコンパイル時に決定されると想定しています。
@ p.s.w.gの回答で説明されているように、入力シーケンスを変更せずに、一連のステップで主に検証作業を行っている場合は、入力を変更することなく、「Chain of Responsibility」パターンを考えます。
しかし、あなたの質問はもう少し一般的であるため、「パイプライン処理」も追加したいと思います。これにより、ステップは次のステップの入力になる出力を生成します(したがって、元の入力を変更します)。 。
これに関する2つの記事を次に示します。
Martin Fowlerによるパイプラインコレクション
パターンに関するより理論的な議論
ここではすでにパターンについて説明していますが、使用しているフレームワークに基づいて、アプリケーションで同じように使用する方法を検討することをお勧めします。
たとえば、実行する検証は、時間の経過とともに変化し続ける可能性が高いです(トランザクションを1日10に制限する新しい検証を将来追加したい場合があります)。また、実際のビジネスサービスまたは統合コードが実行される前に検証を実行したくない場合もあります。検証を構成可能な検証として追加できると便利です。
Strutsを使用している場合は、インターセプターを使用することをお勧めします。春の場合、依存関係としての豆の注入により、柔軟性が向上します。私の提案は、パターン/イディオムだけでなく、アプリケーションを構築するために使用するフレームワークを見て、未来的な観点から要件にどのように最適に適合できるかを確認することです。