2009-07-10 6 views
1

私はこのクラスを持っています、それを払い戻し(それはそれが呼ばれているので)と呼ぶことにしましょう。この払い戻しとそれが添付されている顧客に関するいくつかの事実を検証したいと思います。その妥当性確認を再注文可能にしたいのですが、その最初のものは拒否理由として払い戻しに保存されます。他の人よりもリソースを大量に消費する可能性が高くなり、必要に応じていくつかのパフォーマンスを絞り込めるように、その実行を簡単に並べ替えることができるようにしたいと考えています。クラスのデータ検証用のこのデザインは良いアイデアですか?

妥当性検査メソッドはすべて払い戻しオブジェクトを取り、検証が合格したか失敗したかを示すブール値を返します。だから、私は思っていた、なぜ検証メソッドを表すデリゲート/ラムダ/匿名関数を保持するキュー(または他のデータ構造)を作成しないでください?次に、払い戻しをいくつかの種類のValidator(Refund refundToValidate)メソッドに渡します。このメソッドは、デリゲートの配列を順番に呼び出すとともに、それぞれがfalseを返す場合はfalseを返します。

これは良い考えですか、ばかげた考えですか?それが良い考えであれば、どこかのリソースに私を指摘できますか、または私が意図せず実装しているパターンの名前を付けることができますか?それが愚かな考えであれば、なぜ、どうすれば違うやり方をするのだろうか?

編集:ここで私が遠

public static class Validator 
    { 


     delegate REFUNDDENIALREASONS validationHandler(BatchRefund refundToValidate); 

     public static List<REFUNDDENIALREASONS> ValidateRefund(BatchRefund refundToValidate) 
     { 
      List<Delegate> Validations = new List<Delegate>(); 
      List<REFUNDDENIALREASONS> DenialReasons = new List<REFUNDDENIALREASONS>(); 

      Validations = new List<Delegate>(); 

      validationHandler blockHandler = ValidateBlocks; 
      Validations.Add(blockHandler); 

      validationHandler accountHandler = ValidateCustomerAccountStatus; 
      Validations.Add(accountHandler); 

      foreach (validationHandler v in Validations) 
      { 
       DenialReasons.Add(v(refundToValidate)); 
      } 

      return DenialReasons; 
     } 

     public static REFUNDDENIALREASONS ValidateCustomerAccountStatus(BatchRefund refundToHandle) 
     { 
      REFUNDDENIALREASONS denialReason; 

      switch (refundToHandle.RefundCustomer.CustStatus) 
      { 

       case "C": 
        denialReason = REFUNDDENIALREASONS.None; 
        break; 
       case "Y": 
        denialReason = REFUNDDENIALREASONS.AccounthasrecentChargebackNSF; 
        break; 
       default: 
        denialReason = REFUNDDENIALREASONS.Fraud; 
        break; 
      } 

      return denialReason; 

     } 

     public static REFUNDDENIALREASONS ValidateBlocks(BatchRefund refundToHandle) 
     { 
      List<CustomerBlock> blocks = refundToHandle.RefundCustomer.Blocks; 
      //add new codes to block here 
      string[] illegalblockcodes = new string[] { "L1", "C1" }; 

      foreach (string code in illegalblockcodes) 
       if (blocks.Exists(b => b.BkClassCode == code)) 
       { 
        return REFUNDDENIALREASONS.Fraud; 
       } 

      return REFUNDDENIALREASONS.None; 

     } 
    } 
+0

私はバリデーターの1つから複数のリターンが出てきたことを知っています!先制的な "私の背中から降りてください!" –

答えて

1

基本的には、Chain-of-responsibilityデザインパターンの微調整について説明しています。これには長所と短所がありますが、任意の時点でキューに他の操作を追加する柔軟性が必要な場合は、良い選択です。

0

必ずしもそう悪い考えを持っているものです。どの検証に失敗したかを把握していますか?キューを介して実行する静的メソッドを使用している場合、どのように伝えるつもりですか?

+0

よろしくお願いします。おそらく、私はブール値よりも面白い何かを返すことができます。 –

+0

おそらく、一般的なValidationFailed項目のリストです。 –

+0

私はList でREFUNDDENIALREASONSが明白な列挙型であることを決めました。 –

関連する問題