代码之家  ›  专栏  ›  技术社区  ›  Chris McCall

这个类的数据验证设计是个好主意吗?

  •  1
  • Chris McCall  · 技术社区  · 15 年前

    我有这门课,我们称之为退款(因为这就是它的名字)。我想验证一些关于这个退款和它所附的客户的事情,我想重新订购这些验证,因为第一个行程将被存储为退款的拒绝原因,而且其中一些可能比其他的资源更密集,更可能被绊倒,所以我想不能o轻松地重新排列它们的执行顺序,以便在需要时挤出一些性能。

    所有验证方法都将接受一个退款对象,并返回一个布尔值,指示验证是否通过。所以,我在想,为什么不创建一个队列(或其他数据结构)来存放委托/lambda/匿名函数,每个函数都表示一个验证方法?然后,只需将退款传递到某个验证器类上的某种静态验证(restaundrestorttovalidate)方法。此方法将遍历委托数组,依次调用每个委托,如果其中一个委托产生了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;
    
            }
        }
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   Reed Copsey    15 年前

    你基本上是在描述 Chain-of-responsibility 设计模式。这有一些优点和缺点,但是如果您希望在任何时间点灵活地将其他操作添加到队列中,这是一个不错的选择。

        2
  •  0
  •   Spencer Ruport    15 年前

    不一定是个坏主意。是否要跟踪哪些验证失败?如果您使用的是一个静态方法,通过一个队列运行它,那么您将如何判断呢?