Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 开关(箱)总是错的吗?_Language Agnostic_Design Patterns_Switch Statement - Fatal编程技术网

Language agnostic 开关(箱)总是错的吗?

Language agnostic 开关(箱)总是错的吗?,language-agnostic,design-patterns,switch-statement,Language Agnostic,Design Patterns,Switch Statement,是否存在切换(case)是优于策略或类似模式的良好设计选择(简单性除外)的实例 一个是可读性。只要一个地方只有一个开关,通常就可以了。当你有一个以上(或许多),那么是时候考虑其他的选择了。 可以用一个开关创建“策略”。 这可能是一个起点,然后让多态性完成这项工作 另一个让人想到的是,需要以牺牲灵活性为代价提高速度。有案例。是的,肯定有。很多时候,您的切换只与整体逻辑的一小部分相关,仅仅为了这个小影响而创建全新的类是错误的 例如,假设您有一个单词数据库,用户输入另一个单词,您希望在数据库中查找该单

是否存在切换(case)是优于策略或类似模式的良好设计选择(简单性除外)的实例

一个是可读性。

只要一个地方只有一个开关,通常就可以了。当你有一个以上(或许多),那么是时候考虑其他的选择了。

可以用一个开关创建“策略”。 这可能是一个起点,然后让多态性完成这项工作


另一个让人想到的是,需要以牺牲灵活性为代价提高速度。有案例。

是的,肯定有。很多时候,您的切换只与整体逻辑的一小部分相关,仅仅为了这个小影响而创建全新的类是错误的

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


可能的向量形式;
可能的形式。推回(word);
char last_letter=word[word.size()-1];
开关(最后一个字母){
案例s:
案例“i”:
案例“z”:
可能的形式。推回(单词+“es”);
打破
案例“y”:
可能的形式。向后推(word.substr(0,word.size()-1)+“ies”);
打破
违约:
可能的形式。向后推(word+“s”);
}

使用策略来实现这一点会有点过头。

首先,简单性通常是一个很好的设计选择

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


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

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


一旦传递了一个简单的情况切换语句,要不断更新和维护它就变得非常痛苦。这是设计模式产生的部分原因。

在测试原语的值时使用开关。(即整数或字符)

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

示例: 测试用户输入的字符是否为“a”、“b”或“c”之一是开关的任务

测试您处理的对象是狗还是猫是多态分派的任务


在许多语言中,如果您有更复杂的值,则可能无法使用Switch。

我认为Switch总是错误的:

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

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


有些语言比其他语言更容易做到这一点,不幸的是,大多数常用语言都非常糟糕,因此阻力最小的路径是错误的,人们最终会编写开关或if语句(同样的事情)。

那么“人”、“羊”或已经是复数的单词呢?复数形式是给定单词类型的一部分。使用多态性,我们很好,我们可以在以后添加这些,而无需更改代码。使用开关,您必须修改和扩展代码。英语有这么多的规则,如果上面的开关的“次要影响”变成了“主要维护问题”,一个1000多行的问题,我不会感到惊讶。很久以前,我在别人的代码中看到过近3000行的单开关。所以,不,总有比使用switch更好的选择。这段代码目前有15行。如果其他人将其重写为1000多行,同时将其作为单个开关语句保存,则这是他们的错误,而不是初始开关语句的错误。开关选择行为-因此,这意味着涉及到一种行为类型,即打开的任何东西“是”或“有”一组可区分的类型,否则就不可能使用开关。因此,我们总是打开一个类型,我同意您的观点,打开一个类型是“错误的”(因为很难维护和重用该行为)。与匿名块相比,具有有意义命名方法的有意义命名类对其他程序员来说更具可读性,匿名块必须复制,因为它们嵌套在交换机或其他任何地方。If语句同样糟糕。开关总是涉及行为类型,因为它们选择的是行为。价值观没有行为。用户没有输入“a”、“b”或“c”,而是做出了选择,程序的行为取决于选择的类型。他们按下的键只是该类型的临时引用,就像指针可以引用类一样。多态性将是一种更清晰的建模方法。在Perl中,当

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");
}