我有一个算法,它返回一个分类列表(字符串),这取决于给算法的两个参数:一个类型变量和一个额外的类别字符串,它允许将某些特殊分类添加到结果列表中。
当前的实现,由于 ifs 和 switch 语句的规则表达,是不可读和不可扩展的。规则也是硬编码的。
代码的简化版本:
private static List<string> DetermineTypes(Type x, object category) {
List<string> Types = new List<string>();
if (category is DateTime) {
types.Add("1");
types.Add("2");
types.Add("3");
} else if (category is string) {
switch ((string)category) {
case "A":
Types.Add("4");
break;
case "B":
case "C":
case "D":
Types.Add("5");
break;
case "":
Types = DetermineTypesFromX(Types, x);
break;
default:
Types.Add("6");
break;
}
}
return graphTypes;
}
private static List<string> DetermineTypesFromX(List<string> Types, Type x) {
if (x.Equals(typeof(int))) {
Types.Add("7");
} else if (x.Equals(typeof(double))) {
Types.Add("8");
} else if (x.Equals(typeof(System.DateTime))) {
Types.Add("9");
Types.Add("10");
}
return Types;
}
我在想也许用 xml 指定这些会很好,这样新类型/规则就不需要更改代码,但这很可能对这种情况来说太重了。基本上,我正在尝试解决可能随时添加新“类型”的问题:常见情况是它是上述“规则”之一,而不太可能的边缘情况是新的“规则”分支可能必须被添加。
与极端情况发生的可能性和业务环境(时间表等)相比,我仍然要确定使用 xml 定义的规则(或任何其他方式)使其完全动态化的工作是否值得。
但我的主要问题是如何优雅地简化上面的嵌套条件代码?也许在设计中加入更多的灵活性以提高可扩展性?
我想知道使用 F# 模式匹配的组合是否是一个合适的解决方案?(注意:以前从未使用过 F#,最近一直很好奇,所以这就是我问的原因)