我必须获取一条数据,并对其应用大量可能的变量。我真的不喜欢使用庞大的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];
    }
}

10-01 06:53