当函数返回布尔值时,您可以轻松地
if (task()){
// it worked!
}else{
// it failed.
}
但是当它返回多个不同的值时会变得更加混乱
var status = task();
if (status == 1){
// hmm
}else if (status == 2){
// hmmmmm
}else if (status == 3){
// hmmmmmmmm!
}
..有一种更简洁的处理方法吗?
编辑:为了回应推荐切换语句的答案,是的,我知道这些。我要求的东西比那更整洁?
答案 0 :(得分:5)
我不知道你使用的是哪种语言(JavaScript?)但我通常会编写这样的代码:
var result = task();
switch (result)
{
case 1:
handleStatus1();
break;
case 2:
handleStatus2();
break;
default:
handleEverythingElse();
break;
}
答案 1 :(得分:2)
取决于语言的可能性,但我会在JavaScript中执行类似的操作:
var handle_task_1 = function () {
// handle task 1
};
var handle_task_2 = function () {
// handle task 2
};
var tasks = {
1: handle_task_1,
2: handle_task_2,
"default": function() {},
};
tasks[task()]();
// Or, with a default action. But it may be too much for some people :)
(tasks[task()] || tasks["default"])();
答案 2 :(得分:1)
大多数语言都有switch statement,类似于:
switch (task()) {
case 1: // do stuff
break;
case 2: // other stuff
break;
/// etc.
default: // what?!
Error("Unhandleable status code");
}
答案 3 :(得分:1)
如果你有很多链接的if命令,每个命令都执行一个独特的代码块,你可以考虑使用简单仿函数类的映射。理想情况下,应用程序的启动会填充该地图,您只需从该地图的实例调用操作
代码看起来像这样
Action action = (Action) contextMap.get(task());
action.do();
这样做的好处是,添加新任务只需要为该任务定义一个新类,并在启动时将其添加到contextMap。
这种方法还有其他一些好处
当然,接口,varargs和其他语法糖在这里有所帮助。
答案 4 :(得分:0)
如果你在谈论整数或其他原始返回类型,我所知道的最好的方法是switch语句。
switch (status)
{
case 1:
// hmm
break;
case 2:
// hmmm
break;
}
但是,如果你要返回一个定义方法调用之后行为的对象,事情会变得更加整洁。
假设您有一个接口ISomething和两个(或更多)实现该接口的对象(ASomething和BSomething)。如果方法的返回类型是ISomething,则代码变为:
ISomething result = task();
result.DoSomething();
答案 5 :(得分:0)
也许您正在寻找exceptions?
然后,您不需要为成功案例混乱代码,对于各种错误情况,您可以根据需要抛出不同的异常。