c# - 编写高度复杂的业务/数学规则的最佳方法

标签 c# math business-logic

我必须获取一段数据,并对其应用大量可能的变量。我真的不喜欢使用大量 if 语句的想法,所以我正在寻求帮助以简化并使其更易于维护的方法。

举个例子:

if (isSoccer)
    val = soccerBaseVal;
else if (isFootball)
    val = footballBaseVal;
.... // 20 different sports

if (isMale)
   val += 1;
else
    val += 5;

switch(dayOfWeek)
{
    case DayOfWeek.Monday:
       val += 12;
    ...
}

等.. 等.. 等..可能有 100-200 种不同的测试和公式变化。

这看起来就像一场维护噩梦。有什么建议吗?

编辑:

更糟糕的是,许多变量仅在特定情况下使用,因此它不仅仅是一组具有不同值的固定逻辑。逻辑本身必须根据条件进行更改,可能是从先前变量应用的条件(例如,如果 val > threshold)。

所以是的,我同意对许多值使用查找,但我还必须具有可变逻辑。

最佳答案

避免大型交换结构的常用方法是将信息放入数据结构中。创建一个枚举 SportType和一个 Dictionary<SportType, Int32>包含关联的值。你可以简单地写 val += sportTypeScoreMap[sportType]你就完成了。

此模式的变体将在许多类似情况下为您提供帮助。

public enum SportType
{
    Soccer, Football, ...
}

public sealed class Foo
{
    private static readonly IDictionary<SportType, Int32> sportTypeScoreMap =
        new Dictionary<SportType, Int32>
        {
            { Soccer, 30 },
            { Football, 20 },
            ...
        }

    private static readonly IDictionary<DayOfWeek, Int32> dayOfWeekScoreMap =
        new Dictionary<DayOfWeek, Int32>
        {
            { DayOfWeek.Monday, 12 },
            { DayOfWeek.Tuesday, 20 },
            ...
        }

    public Int32 GetScore(SportType sportType, DayOfWeek dayOfWeek)
    {
        return Foo.sportTypeScoreMap[sportType]
             + Foo.dayOfWeekScoreMap[dayOfWeek];
    }
}

关于c# - 编写高度复杂的业务/数学规则的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3143607/

相关文章:

c# - 当用户不活动时如何结束 session

java的synchronized关键字的C#版本?

c# - SQLite 连接在 C# 中不起作用

algorithm - 反复消除完美平方后剩下多少?

html - 您认为模板代表了将表示逻辑与业务逻辑分离的最佳方式吗?

ruby-on-rails - Rails 中的业务逻辑在哪里?

c# - 给定一个自动化元素,我如何模拟对它的一次左键单击

c++ - 相交三角形的面积

algorithm - 算法的递归方程

sql - 我如何着手处理新闻文章在主要、特色和类别区域方面的转移?