下面是一种方法:

  private RiskFactor calculateMotoristRiskFactor()
    {

        if (motorist.PointsOnLicense > 3
        || motorist.Age < 25)

            return RiskFactor.HighRisk;
        if (motorist.PointsOnLicense > 0)
            return RiskFactor.ModerateRisk;

        return RiskFactor.LowRisk;
    }

我不要那些if语句。

我可以使用策略模式来解决这个问题吗?
如果是,那么我也不希望不同的多态类中的每个方法都应在其中包含一个 If语句

RiskFactor是一个枚举

还有什么更好的方法可以使它更加面向对象而不是程序化?

最佳答案

好吧,你可以有一个List<Tuple<Func<Motorist, bool>, RiskFactor>:

var filters = new List<Tuple<Func<Motorist, bool>, RiskFactor>
{
    Tuple.Create(m => m.PointsOnLicense > 3, RiskFactor.HIGH_RISK),
    Tuple.Create(m => m.Age < 25, RiskFactor.HIGH_RISK),
    Tuple.Create(m => m.PointsOnLicense > 0, RiskFactor.MODERATE_RISK),
};

然后:
var risk = filters.Where(filter => filter.Item1(motorist))
                  .Select(filter => filter.Item2)
                  .DefaultIfEmpty(RiskFactor.LOW_RISK)
                  .First();

至少这使得添加额外的支票变得容易,而且只是按顺序运行它们。这有点奇怪-我可能会创建一个自定义的Filter类型而不是例如Tuple-但它应该可以工作...

09-05 03:24