除了简单性之外,是否有switch(case)是更好的设计选择(例如策略或类似模式)的情况...
除了简单性之外,是否有switch(case)是更好的设计选择(例如策略或类似模式)的情况...
在测试基本类型的值(如整数或字符)时,请使用 Switches。
在不同类型之间进行选择时,请使用 polymorphism。
例如: 测试用户输入的字符是否为“a”、“b”或“c”应使用 switch。 测试您正在处理的对象是 Dog 还是 Cat 应使用多态分派。
在许多语言中,如果您有更复杂的值,可能无法使用 Switch。
首先,简单通常是一个很好的设计选择。
我从来没有理解过反对switch/case的偏见。是的,它可能会被滥用,但是几乎每种其他编程结构也可能被滥用。
在类型上使用switch通常是错误的,可能应该被多态所取代。对其他事物进行switch通常是可以的。
首先,可读性。
是的,绝对可以这样做。很多时候,你的开关只与你整体逻辑的一小部分相关,为此创建全新的类可能会是一个错误。
例如,假设你有一个单词数据库,用户输入另一个单词,你想在数据库中查找该单词,但要包括可能的复数形式。你可以编写类似以下的代码(C++):
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 创建“策略”。
这可能是起点,然后让多态性发挥作用。
其他需要在灵活性成本上获得额外速度的情况也值得考虑。
一旦你超越了简单的情况,switch语句变得非常痛苦,需要不断更新和维护。这也是设计模式产生的部分原因。
我认为switch语句始终是错误的:
case语句体是代码,代表着行为,因此,case中的值('value')具有行为类型,因此,多态性会是更好的选择。
这意味着值实际上是类型,例如数字1是一切等于1的东西的类型。我们只需要将“1”的特质映射到我们特定情况下的行为中,就可以得到所有其他类型的多态性(这是一个好事情)。
在某些语言中,这样做很容易,但不幸的是,大多数常用的语言都非常糟糕,所以最少阻力的路线是错误的选择,人们最终只能编写switch或if语句(本质相同)。
given
/when
。 - Brad Gilbert