【发布时间】:2010-09-25 01:24:20
【问题描述】:
在某些情况下 switch(case) 是一个很好的设计选择(除了简单性)而不是策略或类似模式......
【问题讨论】:
-
在 Perl 中是
given/when
标签: language-agnostic design-patterns switch-statement
在某些情况下 switch(case) 是一个很好的设计选择(除了简单性)而不是策略或类似模式......
【问题讨论】:
given / when
标签: language-agnostic design-patterns switch-statement
一方面,可读性。
【讨论】:
通常没问题,只要您在 one 位置只有 one 开关即可。当您拥有多个(或多个)时,是时候考虑替代方案了。
【讨论】:
“策略”可以通过一个开关来创建。
这可能是一个起点,然后让多态性完成这项工作。
想到的其他需要以灵活性为代价的额外速度。有案例。
【讨论】:
是的,当然。很多时候,您的切换只与您的整体逻辑的一小部分相关,并且仅仅为了这个微小的影响而创建全新的类是错误的。
例如,假设您有一个单词数据库,用户输入了另一个单词,并且您希望在数据库中找到该单词,但包括可能的复数形式。你可能会写类似 (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/case 的偏见。是的,它可以被滥用,但是,几乎所有其他编程结构也可以。
切换类型通常是错误的,可能应该由多态性代替。开启其他东西通常没问题。
【讨论】:
否,switch 语句可能只是简单情况下的一个不错的设计选择。
一旦你通过一个简单的情况 switch 语句就变得非常痛苦,要不断更新和维护。这是设计模式出现的部分原因。
【讨论】:
在测试原语的值时使用开关。 (即整数或字符)。
在不同的类型之间进行选择时使用多态性。
例子: 测试用户输入的字符是否是“a”、“b”或“c”之一是开关的工作。
测试你正在处理的对象是狗还是猫是多态调度的工作。
在许多语言中,如果您有更复杂的值,您可能无论如何都无法使用 Switch。
【讨论】:
我的观点是switch总是错的:
案例主体是代码,是行为, 因此,案例中的事物(“价值”)具有行为类型, 因此,多态性将是更好的选择。
这意味着值实际上是类型,例如数字 1 是一种在某种程度上等于 1 的所有事物的类型。剩下的就是我们将 1-ness 映射到特定情况下的行为,并且我们对所有其他类型都具有多态性(一件好事)。
这在某些语言中比其他语言更容易做到,不幸的是,大多数常用语言都非常糟糕,因此阻力最小的路径是错误的,人们最终会编写 switch 或 if 语句(同样的事情)。
【讨论】: