编写如下算法的最佳方法是什么:
if (a) {
doA();
done();
}
else if (b) {
doB();
done();
}
else if (c) {
doC();
done();
}
我想到的另一种方法:
done = true;
if (a) {
doA();
}
else if (b) {
doB();
}
else if (c) {
doC();
}
else {
done = false;
}
if (done) {
done();
}
哪个更好?还有另一种最好的方法吗?
答案 0 :(得分:3)
没有任何背景,对我来说最自然的方式是:
bool do_it(int condition)
{
switch (condition)
{
case a: doA(); return true;
case b: doB(); return true;
case c: doC(); return true;
default: return false;
}
}
// ...
if (do_it) done();
因为它抽象了“如果整个事情成功,那么请调用done()
”的逻辑。
但还有很多其他方法可以做到这一点。特别是,如果将来可能会增加条件的数量,我根本不会这样做。
答案 1 :(得分:1)
取决于您使用的条件/操作数量以及您正在使用的语言类型。
OOP和polymorphysm可以很好地工作。
答案 2 :(得分:0)
使用switch
语句,沿途设置isDone
标志,并根据标志调用done()。
答案 3 :(得分:0)
如果a,b和c是不同的复杂条件表达式,那么你的第一个解决方案是最好的。如果此代码在函数内部,也许你可以避免使用“else if”元素,例如:
private void doit() {
if (a) {
doA();
done();
return;
}
if (b) {
doB();
done();
return;
}
if (c) {
doC();
done();
return;
}
}
所以对我而言,它更像是一个代码风格的问题。
答案 4 :(得分:0)
我会把它写成
var failed = false;
if (a) doA();
else if (b) doB();
else if (c) doC();
else failed = true;
if (!failed) done();
我不喜欢首先将done
这样的变量设置为true然后撤消它,因为在条件启动之前没有完成工作,所以它看起来不合逻辑。
我也不喜欢switch case选项,因为条件'a','b','c'不一定是互斥的; if ... else if ... else cascade支持非独占条件,但switch()可能不依赖于语言。例如。你不能转换级联if ... else来切换C ++。
我认为将多个呼叫点移除到done()是非常重要的,因为这是冗余,如果完成,则后来出现维护问题(例如,得到参数。
答案 5 :(得分:0)
首先,有一个条件变量,而不是三个。其次,我使用函数指针的映射,条件变量作为键。这是一个例子:
#!/usr/bin/env python
def doA():
pass
def doB():
pass
def doC():
pass
def done():
pass
a = 3
b = 6
c = 8
doers = {}
doers[a] = doA
doers[b] = doB
doers[c] = doC
condition = a
# this is now the entire "algorithm":
if condition in doers:
doers[condition]()
done()