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

这种方法还有其他一些优点

  • taskA()和taskB()可以共享相同的contextMap,甚至可以共享一些相同的操作,因此代码重复更少
  • 操作可以更容易地进行单元测试(通常)
  • 在操作之间共享代码将很容易,而不会以意大利面代码或复杂的if(status>2&&status!=7)语句结束
  • 当然,接口、varargs和其他语法糖在这里也有帮助。

    也许你在寻找


    然后,对于成功的情况,您不需要将代码弄得乱七八糟,对于各种错误情况,您可以根据需要抛出不同的异常。

    如果语言支持,您应该使用枚举,或者其他什么-除了幻数以外的任何东西。显然,我这样写是为了清楚。这是非常脆弱的代码-需要Task()与外部静态序列保持同步。如果希望Task()生成其结果操作,那么最好让它返回handle_Task函数。如果不是,则switch语句更合适,因为它将两者解耦。+1-根据task()的返回值查找函数对象,然后调用返回的函数。简直太棒了!“保持与外部静态序列的同步”——有人在乎吗?@Rex M与switch语句类似,只是它没有默认分支。这是它唯一缺少的东西。其他一切都只是代码格式:)注意,这通常是在Python中完成的,Python没有switch语句。不是
    task()
    依赖于
    tasks
    ,而是
    tasks
    依赖于
    task()
    。一种新颖的解决方案。从来没想过这个:)