处理超过2个可能的返回值?

时间:2009-08-31 04:14:07

标签: 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!
}

..有一种更简洁的处理方法吗?

编辑:为了回应推荐切换语句的答案,是的,我知道这些。我要求的东西比那更整洁?

6 个答案:

答案 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。

这种方法还有其他一些好处

  1. taskA()和taskB()可以共享相同的contextMap甚至一些相同的Actions,因此您可以减少代码重复。
  2. 行动可以更容易(通常)进行单元测试
  3. 操作之间的代码共享将很容易,而不会结束意大利面条代码或复杂if(状态> 2&& status!= 7)语句
  4. 当然,接口,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

然后,您不需要为成功案例混乱代码,对于各种错误情况,您可以根据需要抛出不同的异常。