我有这门课,我们称之为退款(因为这就是它的名字)。我想验证一些关于这个退款和它所附的客户的事情,我想重新订购这些验证,因为第一个行程将被存储为退款的拒绝原因,而且其中一些可能比其他的资源更密集,更可能被绊倒,所以我想不能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;
}
}