问题标签 [switch-statement]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
8293 浏览

python - 在 Python 中选择不同的 switch-case 替换 - 字典还是 if-elif-else?

我最近阅读了建议不要在支持它的语言中使用 switch-case 语句的问题。就 Python 而言,我已经看到了许多 switch case 替换,例如:

  1. 使用字典(许多变体)
  2. 使用元组
  3. 使用函数装饰器(http://code.activestate.com/recipes/440499/
  4. 使用多态(推荐方法而不是类型检查对象)
  5. 使用 if-elif-else 阶梯
  6. 甚至有人推荐了访客模式(可能是外部的)

鉴于有多种选择,我在决定对特定代码段执行什么操作时有些困难。我想了解在一般情况下选择其中一种方法而不是另一种方法的标准。此外,如果我无法做出决定(附上选择的解释),我将不胜感激有关在特定情况下该怎么做的建议。

这是具体问题:
(1)

此方法由qt-slot调用,以响应选择从菜单中绘制曲线。一旦申请完成,上述方法将包含总共 4-7 条曲线。在这种情况下使用一次性字典是否合理?由于最明显的方法是 if-elif-else,我应该坚持吗?我还考虑在这里使用 **kargs(在朋友的帮助下),因为所有曲线类都使用 **kargs...

(2)
第二段代码是一个qt-slot,当用户更改曲线的属性时会调用它。基本上,插槽从 gui (spinBox) 中获取数据并将其放入适当曲线类的实例变量中。在这种情况下,我又遇到了同样的问题——我应该使用字典吗?

这是前面提到的插槽-

作为参考,这里是连接到上述插槽的代码 -

注意- self.endAngle 等在构造函数中初始化。

据我所知,选择 dict 的原因是为了快速查找。什么时候有保证?当我有 100 个或更多案例时?每次调用函数时继续构建和丢弃字典是个好主意吗?如果我在函数之外为此目的构建一个字典,我应该检查是否在其他地方需要它?如果其他地方不需要它会发生什么?

我的问题是如果有最好的做法是什么?做事最好/最优雅的方式是什么?换句话说,何时使用if-elif-else,何时使用其他选项?

0 投票
5 回答
8146 浏览

c# - C#:如何将 switch 与 if 语句结合使用?

我需要将开关与 if 语句结合起来。

我怎样才能做到这一点?我想做这样的事情:

0 投票
4 回答
124 浏览

c# - 我应该假设两元素枚举将保持这种方式吗?

我有两个成员 enum 发生了很多事情:

假设我想根据我的枚举值为 i 分配一个不同的值。

我应该写这个:

或这个 :

或者这个:

我通常选择第一个选项,因为它写起来更快,但我总是觉得有点不对劲。你平常都做什么?

我在 c# 中发布了代码,但这个问题与语言无关。

我真的不知道应该如何标记它,如果需要,请不要犹豫重新标记它。

编辑:也许我的问题还不够清楚:我真正想知道的是:我应该假设我的枚举永远不会改变并采用快速的方式,还是应该考虑它可能会改变(尽管我没有改变它然而),并添加一些错误处理代码,这样我就不用花费数周的时间来跟踪错误的位置(如果它发生了变化)

0 投票
8 回答
52157 浏览

java - Java switch 案例:带或不带大括号?

考虑以下两个带有大括号的片段:

不带大括号:

我知道,在带有大括号的代码段中,通过将每个案例括在大括号中来创建一个新的范围。但是,如果每个案例都不需要新的范围(即没有变量名被重用),那么在案例中使用大括号是否会降低性能?

0 投票
22 回答
474685 浏览

c++ - 为什么 switch 语句不能应用于字符串?

编译以下代码并得到错误type illegal

您不能在switch或中使用字符串case。为什么?是否有任何解决方案可以很好地支持类似于打开字符串的逻辑?

0 投票
6 回答
4421 浏览

c++ - 用什么替换巨大的 switch 语句?

我有一个解析一些模板文件的代码,当它找到一个占位符时,它用一个值替换它。就像是:

在代码中,解析器找到那些,调用这个函数:

然后用返回值替换原来的占位符。

在实际情况下,它不是一个虚拟网页,并且可能出现许多 (50+) 个不同的占位符。

我的代码是 C++,但我猜任何语言都存在这个问题。我猜这更多是关于算法和面向对象设计的。唯一重要的是必须编译它,即使我想要我不能有任何动态/评估代码。

我虽然关于实施责任链模式,但它似乎不会改善这种情况。

更新:我也担心另一个线程中的这个评论。我应该关心它吗?

0 投票
4 回答
2232 浏览

language-agnostic - 什么是(或应该是)虚函数调用的圈复杂度?

圈复杂度为理解给定函数的难易程度或包含错误的潜力提供了一个粗略的衡量标准。在我读过的实现中,通常所有基本的控制流构造(if、case、while、for 等)都会将函数的复杂度增加 1。在我看来,圈复杂度旨在确定“通过程序源代码的线性独立路径的数量”虚拟函数调用也应该增加函数的圈复杂度,因为在运行时将调用哪个实现的模糊性(调用在路径中创建另一个分支执行)。

但是,如果函数包含等效的 switch 语句(每个“case”关键字一个点,实现相关虚函数的层次结构中的每个类一个 case 关键字),对函数进行相同的惩罚,感觉过于苛刻,因为虚函数调用通常被认为是更好的编程实践。

虚函数调用的圈复杂度成本应该是多少?我不确定我的推理是反对将圈复杂度作为度量的效用,还是反对使用虚函数或不同的东西。

编辑:在人们的回应之后,我意识到它不应该增加圈复杂性,因为我们可以认为虚函数调用等同于对包含大量 switch 语句的全局函数的调用。即使该函数会得到一个坏分数,它在程序中只存在一次,而直接用 switch 语句替换每个虚拟函数调用会导致多次成本。

0 投票
4 回答
9403 浏览

javascript - 如何避免嵌套开关?

我正在为 Web 应用程序在 JavaScript 中创建上下文菜单。菜单可以出现在许多上下文中,并且有不同的选择。对于每个上下文/选择,我可以有不同的功能:

并在构建菜单时对其进行硬编码。我不喜欢的是可能会有很多重复的代码。所以我正在考虑使用调度程序函数,但它可能会导致可能很长的嵌套 switch 语句:

呸。一定有更好的方法。也许调度员的麻烦多于它的价值。我查看了一些相关 帖子,但我不太了解如何将它们应用于这种确切的情况。

0 投票
7 回答
104422 浏览

language-agnostic - IF-ELSE 和 SWITCH 有什么区别?

有人可以向我解释一下吗?

0 投票
10 回答
1979 浏览

c# - 这个 switch 语句闻起来很臭吗?

在我看来:

假设这个 switch 语句是合理的,return 和 break 看起来不正确或感觉不正确。

中断显然是多余的,但遗漏是糟糕的风格(还是这种糟糕的风格开始?)?


我个人不这样做,但是代码库中有一些在工作。不,我不会自以为是并纠正代码库。