关于语言不可知:Switch(Case)总是错误的吗?

Is Switch (Case) always wrong?

是否有这样的例子,开关(案例)是一个好的设计选择(除了简单性)而不是战略或类似的模式…


在测试基元值时使用开关。(即整数或字符)。

在不同类型之间进行选择时,请使用多态性。

实例:测试用户输入的字符是否为"a"、"b"或"c"中的一个字符是交换机的作业。

测试你要处理的对象是狗还是猫是多态分派的工作。

在许多语言中,如果您有更复杂的值,那么您可能无论如何都不能使用switch。


首先,简单往往是一个好的设计选择。

我从来没有理解过这种对开关/外壳的偏见。是的,它可以被滥用,但是,几乎所有其他编程构造都可以。

打开类型通常是错误的,可能应该用多态性来代替。打开其他东西通常是可以的。


是的,当然。很多时候,您的开关只与整个逻辑的一个非常小的部分相关,仅仅为了这个小的影响而创建整个新类是一个错误。

例如,假设您有一个单词数据库,用户输入另一个单词,您希望在数据库中找到该单词,但包含可能的复数。你可以写一些类似的东西(C++)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vector<string> possible_forms;
possible_forms.push_back(word);
char last_letter = word[word.size() - 1];
switch (last_letter) {
  case 's':
  case 'i':
  case 'z':
    possible_forms.push_back(word +"es");
    break;
  case 'y':
    possible_forms.push_back(word.substr(0, word.size() - 1) +"ies");
    break;
  default:
    possible_forms.push_back(word +"s");
}

用策略来做这件事太过分了。


首先,可读性。


只要你在一个地方只有一个开关,通常都可以。当你有不止一个(或多个)的时候,也应该考虑其他选择。


"战略"可以通过一个开关来创建。

这可能是起点,从那里开始让多态性完成工作。

另一个需要以灵活性为代价的额外速度。有些情况。


不,switch语句可能只是简单情况下的一个好的设计选择。

一旦您通过了一个简单的情况切换语句,就很难继续更新和维护。这就是设计模式产生的部分原因。


我的观点是,开关总是错误的:

案件的主体是代码和行为,因此,案例中的事物("价值")具有行为类型,因此,多态性将是更好的选择。

这意味着值实际上是类型,例如,数字1是在某种程度上等于1的所有类型。剩下的就是我们将1-性映射到特定情况下的行为,并且我们与所有其他类型都具有多态性(一件好事)。

这在某些语言中比其他语言更容易做到,不幸的是,大多数常用语言都相当糟糕,所以阻力最小的路径是错误的,人们最终会编写开关或if语句(同样的事情)。