Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反向可访问逻辑更改的模式?_C#_Design Patterns - Fatal编程技术网

C# 反向可访问逻辑更改的模式?

C# 反向可访问逻辑更改的模式?,c#,design-patterns,C#,Design Patterns,我试图找到一种设计模式或最佳实践,或者其他解决方案来解决在我的应用程序中保留业务逻辑版本的问题。具体来说,我希望找到一种方法来确定签发保险单时使用了哪种逻辑 我目前有如下代码: public double FixedDeductibleSurchageAmount() { double percent = FixedDeductibleSurchargePercent(); double base_premium = CollisionPremium() + TheftPremi

我试图找到一种设计模式或最佳实践,或者其他解决方案来解决在我的应用程序中保留业务逻辑版本的问题。具体来说,我希望找到一种方法来确定签发保险单时使用了哪种逻辑

我目前有如下代码:

public double FixedDeductibleSurchageAmount()
{
    double percent = FixedDeductibleSurchargePercent();
    double base_premium = CollisionPremium() + TheftPremium();
    return (base_premium * percent);
}
我需要对业务逻辑进行更改,使此函数看起来更像:

public double FixedDeductibleSurchageAmount()
{
    double percent = FixedDeductibleSurchargePercent();
    double base_premium = CollisionPremium() + TheftPremium() + MedicalPremium();
    return (base_premium * percent);
}

我遇到的麻烦是,现有的政策应该与前面的逻辑一致。这个有设计模式吗?如果没有,有什么好的方法来实现它吗?

您将不得不使用某种形式的附加数据来精确跟踪用于获取数据的算法;您可能需要更改持久性表示,以维护用于导出结果的算法的版本信息。

BTW,您可以考虑将MealPaldPosie或THFExcel作为仅获得属性,而不是无参数的函数。他们非常适合这种模式

有很多方法可以解决这个问题。一些例子:

1) 切换到新代码并向用户数据添加标志,以便MedicalPremium自动为旧用户返回0。如果您将数据存储在XML中,这将特别容易;旧数据只是没有标记,而且不会影响数据的反序列化,因为XML是灵活的

2) 将包含函数MedicalPremium的类设为基类,并将MedicalPremium设为虚拟类。在派生类(新版本)中重写它。较新的用户是派生类。旧用户被创建为基类。对于旧用户,它总是返回0。属性也可以像函数一样是虚拟的。

是的,有:。您可以使用它来扩展具有其他包装器类的类的行为。在下面的示例中,我将其与模板方法模式相结合,以实现我相信您正在寻找的目标

public class BaseSurchargePolicy {
    protected abstract double BasePremium { get; }
    protected abstract double FixedDeductibleSurchargePercent { get; }
    public double FixedDeductibleSurchageAmount{
      get
      {
        return (BasePremium * FixedDeductibleSurchargePercent);
      }
    }

    protected ICollection<string> _ProcessorsUsed;
    public IEnumerable<string> ProcessorsUsed 
    { 
      get { return ProcessorsUsed; }
    }
}

public class OldSurchargePolicy : BaseSurchargePolicy 
{

    protected double BasePremium 
    { 
        _ProcessorsUsed.Add(GetType().Name);
        return CollisionPremium + TheftPremium; 
    }
    protected double FixedDeductibleSurchargePercent { get; set; }

    public double CollisionPremium { get; set; }
    public double TheftPremium { get; set; }
}

public class MedicalSurchargeDecorator: BaseSurchargePolicy
{
    private BaseSurchargePolicy _wrapped;
    private double _medicalPremium;
    public MedicalSurchargeDecorator(BaseSurchargePolicy wrapped, double medicalPremium) 
    {
        _wrapped = wrapped;
        _medicalPremium = medicalPremium;
    }

    protected double BasePremium 
    { 
      get 
      {
        _ProcessorsUsed.Add(GetType().Name);
        return _wrapped.BasePremium + _medicalPremium; 
      }
    }
    protected double FixedDeductibleSurchargePercent { 
      get { return _wrapped.FixedDeductibleSurchargePercent }
    }

}
公共类基本附加费政策{
受保护的抽象双基Premium{get;}
受保护的抽象双固定可导出资源百分比{get;}
公共双固定可导出资源量{
得到
{
退货(基本保费*固定可扣除的采购百分比);
}
}
使用受保护的ICollection\u处理器;
使用公共IEnumerable处理器
{ 
获取{return processorused;}
}
}
公共类旧附加费政策:基本附加费政策
{
受保护双基保费
{ 
_ProcessorUsed.Add(GetType().Name);
退货碰撞溢价+盗窃溢价;
}
受保护的双固定可导出资源百分比{get;set;}
公共双冲突Premium{get;set;}
公开双重盗窃{get;set;}
}
公共类医疗资源协调员:基本附加费政策
{
私人基础附加费政策;
私人双联医疗;
公共医疗资源协调员(基本附加费政策包装,双医疗保险)
{
_包裹的=包裹的;
_medicalPremium=medicalPremium;
}
受保护双基保费
{ 
得到
{
_ProcessorUsed.Add(GetType().Name);
退货_wrapped.BasePremium+_medicalPremium;
}
}
受保护的双固定可导出资源{
获取{return\u wrapped.fixeddedEducibleSourcePercent}
}
}

如果你有机会看看Martin Fowler的企业架构模式,他会谈论单个实例方法,这与你所拥有的并不完全相同,但非常相似。无论如何,这是一本好书


同时,我认为您可能必须开始将函数视为数据,并将使用的函数存储在数据库中。您不需要(但可能希望)存储函数文本,但确实需要足够的信息来确定在运行时调用哪个方法。你问了关于模式的问题,很明显你有一个战略模式,你可以参考,但我不知道它是否特别有用

策略模式听起来最适用。可能您需要一个factory方法或类似的方法来返回适当的策略。

实际上,
MedicalPremium()
适用于所有用户,我只是将其添加到这个特殊的附加费中,因此它不能为较老的用户返回0。它们被引用为方法,因为我正处于重新设计的白板阶段,所以我只是把它们放在那里作为例子。因此,制作一个函数MedicalPremiumNew,只为新用户返回MedicalPremium,为老用户返回0,我所说的其余内容仍然适用;或者干脆把FixedDeducatibleSourceAmount变成虚拟的。我知道如何使用decorator,但我不知道它们如何在这里应用。