ここでの正しいパターンは、実際にはコンテキストによって異なります。固執する特定のパターンを選択する前に、それらの質問に対する答えを見つけようとします。
- 実行時に(1,2,3)チェックのさまざまな組み合わせを作成する必要がありますか?
- アクションを実行するために同じ変数が必要ですか、それとも大きく異なりますか?
- エラーメッセージはどの程度正確でなければなりませんか?
- 失敗した場合、ユーザーは常に(1)の最初のステップから再試行しますか?
- 並行性はどのように処理されますか?
- 各メソッドはリクエストに何かを追加しますか、それとも単に検証しますか?(デフォルトのアカウントIDと言いますか?)
直感に基づいて、エラーコードの集約パラメーターを持つプレーンメソッドとしてコーディングします。
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"インターフェイスに配置して、検証ボイラープレートコードを含むレイヤーのスーパータイプを作成することをお勧めします。
ただし、この設計では、検証ロジックはコンパイル時に決定されると想定しています。