一个case语句有多个break是一种不好的编程实践吗?

6

这只是我正在做的事情的一个超级简化版本,但是想象一下需要在 switch 语句中对一个对象执行多个验证。在验证的任何时刻,我们可能会决定不继续使用该对象。

愚蠢的例子:

var yummies = [
  {name: 'apples', quantity: 3},
  {name: 'apples', quantity: 4}
];

var purchases = [];

for (var i = 0; i < yummies.length; i++) {
  var yummy = yummies[i];
  switch (yummy.name) {
      case 'apples':
        if (purchases.indexOf(yummy.name) > -1) {
          break;
        }

        //A ton of other code including, possibly other breaks

        purchases.push(yummy.name);
        break;
  }
}

由于我仍然希望继续执行循环,因此return无法起作用。我认为我可以使用continue语句来实现,但在switch/case中看到continue看起来确实很奇怪。

无论如何,在单个case中使用两个break。有没有不这样做的原因呢?


只有在switch语句是循环中的最后一条语句时,continuebreak才是等效的。 - Barmar
你可以在中间使用 if/else 来代替 break。这只是个人样式偏好罢了。 - Barmar
这些情况很复杂。我不想要太多的if/else语句。continue很有趣! - KJ Price
你可以反转函数中的条件并将 purchases.push 放在里面,这样它就有一个在 if(){} 后的单个 break - Spencer Wieczorek
1
这与昨天有关于函数中的return语句的问题类似。总体思路是一样的:如果你不喜欢深度嵌套的控制结构,使用多个returnbreak可以使代码更易于理解。http://stackoverflow.com/questions/32773065/should-we-use-early-return-for-a-simple-function - Barmar
1个回答

6
当然,这只是一种观点,但我认为它本身并不糟糕。然而,嵌套的情况、if语句和其他控制结构会使你的代码难以阅读。在这种情况下,你可以考虑将代码片段移动到单独的函数中。
因此,你的代码可能看起来像这样:
function purchaseApple(yummyName) {
  if (purchases.indexOf(yummyName) == -1) {
    purchases.push(yummyName);
  }
}

for (var i = 0; i < yummies.length; i++) {
  var yummy = yummies[i];
  switch (yummy.name) {
      case 'apples':
        purchaseApples(yummy.name);
        break;
  }
}

或者甚至将条件移动到函数内部:
function tryPurchaseApple(yummyName) {
  if (yummyName == 'apples' && purchases.indexOf(yummyName) == -1) {
    purchases.push(yummyName);
  }
}

for (var i = 0; i < yummies.length; i++) {
  var yummy = yummies[i];
  tryPurchaseApple(yummy.name);
  tryPurchasePears(yummy.name);
}

当然,这些只是建议。在这种情况下很难做出一个合理的例子,不要介意。


关于将代码移动到多个函数中的建议很好。不幸的是,我的项目只能创建私有方法,有些受限;否则我肯定会采用这种方式。 - KJ Price
你为什么决定不在purchaseApple()函数中使用早期返回? - undefined
@Toskan 嗯,这个答案已经有8年了,所以我记不太清楚了,但我不认为它会有很大的改进。你仍然需要条件,并且需要3行代码而不是2行。但我认为这对于这个例子来说并不是很相关。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接