Coding style 处理2个以上可能的返回值?
当函数返回布尔值时,您可以轻松地Coding style 处理2个以上可能的返回值?,coding-style,boolean,if-statement,Coding Style,Boolean,If Statement,当函数返回布尔值时,您可以轻松地 if (task()){ // it worked! }else{ // it failed. } 但当它返回多个不同的值时,它会变得更混乱 var status = task(); if (status == 1){ // hmm }else if (status == 2){ // hmmmmm }else if (status == 3){ // hmmmmmmmm! } 有没有更整洁的处理方法 编辑:对于建议切换语句的答
if (task()){
// it worked!
}else{
// it failed.
}
但当它返回多个不同的值时,它会变得更混乱
var status = task();
if (status == 1){
// hmm
}else if (status == 2){
// hmmmmm
}else if (status == 3){
// hmmmmmmmm!
}
有没有更整洁的处理方法
编辑:对于建议切换语句的答案,是的,我知道这些。我要求的是比这更简洁的东西?大多数语言都有一个,比如:
switch (task()) {
case 1: // do stuff
break;
case 2: // other stuff
break;
/// etc.
default: // what?!
Error("Unhandleable status code");
}
我不知道您使用的是什么语言(JavaScript?),但我通常编写如下代码:
var result = task();
switch (result)
{
case 1:
handleStatus1();
break;
case 2:
handleStatus2();
break;
default:
handleEverythingElse();
break;
}
如果您谈论的是整数或其他基本返回类型,我所知道的最佳方法是switch语句
switch (status)
{
case 1:
// hmm
break;
case 2:
// hmmm
break;
}
但是,如果您返回一个定义方法调用后的行为的对象,事情就会变得更加整洁
假设您有一个接口ISomething和两个(或更多)实现该接口的对象(ASomething和BSomething)。如果方法的返回类型为ISomething,则代码变为:
ISomething result = task();
result.DoSomething();
取决于语言的可能性,但我会在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"])();
如果你有很多链式IF命令,每个都执行一个唯一的代码块,你可以考虑使用简单的函子类的映射。理想情况下,应用程序的启动将填充该映射,您可以从该映射的实例调用操作
代码如下所示Action action = (Action) contextMap.get(task());
action.do();
这样做的好处是,添加新任务只需要为该任务定义一个新类,并在启动时将其添加到contextMap
这种方法还有其他一些优点
然后,对于成功的情况,您不需要将代码弄得乱七八糟,对于各种错误情况,您可以根据需要抛出不同的异常。如果语言支持,您应该使用枚举,或者其他什么-除了幻数以外的任何东西。显然,我这样写是为了清楚。这是非常脆弱的代码-需要Task()与外部静态序列保持同步。如果希望Task()生成其结果操作,那么最好让它返回handle_Task函数。如果不是,则switch语句更合适,因为它将两者解耦。+1-根据task()的返回值查找函数对象,然后调用返回的函数。简直太棒了!“保持与外部静态序列的同步”——有人在乎吗?@Rex M与switch语句类似,只是它没有默认分支。这是它唯一缺少的东西。其他一切都只是代码格式:)注意,这通常是在Python中完成的,Python没有switch语句。不是
task()
依赖于tasks
,而是tasks
依赖于task()
。一种新颖的解决方案。从来没想过这个:)