我在Swift写作,但问题实际上与语言无关。
我有两个变量,每个变量可能有多个但是离散的值。两个值的各种组合导致不同的行为。
我需要考虑所有组合并执行适当的代码。什么是最干净/最容易维护的方法?
从图形上看,它看起来像这样:
var2 / var1 | A | B | C |
------------|---------|---------|---------|
Z |(A && Z) |(B && Z) |(C && Z) |
------------|---------|---------|---------|
Y |(A && Y) |(B && Y) |(C && Y) |
------------|---------|---------|---------|
X |(A && X) |(B && X) |(C && X) |
-------------------------------------------
您可以想象,使用第三个变量,矩阵变为三维等等,这就是我对一般化解决方案感兴趣的原因,而不一定是我特定项目的特定解决方案。
我可以去多个if / else:
if (var1 == A && var2 == Z) {}
else if (var1 == B && var2 == Z) {}
else if ...
但这听起来很糟糕。
目前,我一遍又一遍地使用一个if / else和相同的开关:
if var1 == A {
switch var2 {
case Z:
case Y:
case X:
}
} else if var1 == B {
switch var2 {
case Z:
case Y:
case X:
}
} ...
但重复使用相同的开关告诉我,我做错了。
这是多态的情况吗?这个概念对我来说有点模糊,而且我没有在哲学上得到它。还有更好的方法吗?
我的真实案例是一个计算器类型的应用程序,其行为不仅取决于按下的按钮,还取决于按下的上一个按钮,即按下' ='在'#'之后不同于按下' ='在' +'之后不同于按下' +'在' ='之后不同于按下#'#'在'#'等之后...所以我将按下的当前按钮与按下的前一个按钮进行比较,以确定计算器的行为。
答案 0 :(得分:1)
如果您有复杂的条件,一个好方法是尽可能地将规则的定义与实际工作流程分开(条件评估,调用动作函数)。
我将按如下方式定义映射:
(var1, var2, ...) -> ActionFunction
这可以作为一个函数实现,它将所有变量作为输入,并返回对在这种情况下应该调用的另一个函数的引用。
实际的映射规则可以定义为n维数组,其中n是输入变量的数量。该数组可以作为常量存储在程序中,但是为此可以使用外部文件或数据库也是有意义的。