【问题标题】:Is Switch (Case) always wrong?Switch(Case)总是错的吗?
【发布时间】:2010-09-25 01:24:20
【问题描述】:

在某些情况下 switch(case) 是一个很好的设计选择(除了简单性)而不是策略或类似模式......

【问题讨论】:

  • 在 Perl 中是 given / when

标签: language-agnostic design-patterns switch-statement


【解决方案1】:

一方面,可读性。

【讨论】:

  • 具有有意义命名方法的有意义命名类对于其他程序员来说比必须复制的匿名块更具可读性,因为它们嵌套在开关或其他任何公平的地方。 if 语句同样糟糕。
【解决方案2】:

通常没问题,只要您在 one 位置只有 one 开关即可。当您拥有多个(或多个)时,是时候考虑替代方案了。

【讨论】:

    【解决方案3】:

    “策略”可以通过一个开关来创建。

    这可能是一个起点,然后让多态性完成这项工作。

    想到的其他需要以灵活性为代价的额外速度。有案例。

    【讨论】:

      【解决方案4】:

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

      例如,假设您有一个单词数据库,用户输入了另一个单词,并且您希望在数据库中找到该单词,但包括可能的复数形式。你可能会写类似 (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");
      }
      

      用策略来做这件事有点过头了。

      【讨论】:

      • “人”、“羊”或已经是复数的词怎么办?复数构成给定单词类型的一部分。有了多态,我们就可以了,我们可以在以后添加这些无需更改代码。使用开关,您必须修改和扩展您的代码。英语有这么多规则,如果上面开关的“次要影响”发展成“主要维护问题”,我不会感到惊讶,长达 1000 多行。很久以前,我已经在其他人的代码中看到了近 3000 行的单个开关。所以,不,总有比使用 switch 更好的选择。
      • 这段代码目前有 15 行。如果其他人将其重写为 1000 多行而将其保留为单个 switch 语句,那是他们的错,而不是初始 switch 语句的错。
      【解决方案5】:

      首先,简单通常是一个不错的设计选择。

      我从来不理解这种对 switch/case 的偏见。是的,它可以被滥用,但是,几乎所有其他编程结构也可以。

      切换类型通常是错误的,可能应该由多态性代替。开启其他东西通常没问题。

      【讨论】:

      • 开关选择行为 - 因此暗示涉及行为类型,即打开的任何东西“是”或“具有”一组可区分的类型,否则将无法使用一个开关。因此,我们总是打开一种类型,我同意你的观点,即打开一种类型是“错误的”(因为难以维护和重用该行为)。
      【解决方案6】:

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

      一旦你通过一个简单的情况 switch 语句就变得非常痛苦,要不断更新和维护。这是设计模式出现的部分原因。

      【讨论】:

        【解决方案7】:

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

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

        例子: 测试用户输入的字符是否是“a”、“b”或“c”之一是开关的工作。

        测试你正在处理的对象是狗还是猫是多态调度的工作。

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

        【讨论】:

        • 切换总是涉及行为类型,因为它们正在选择行为。价值观没有行为。用户没有输入“a”、“b”或“c”,他们做出了选择,程序的行为取决于该选择的类型。他们按下的键只是该类型的临时引用,就像指针可以引用一个类一样。多态性将是一种更清晰的建模方式。
        【解决方案8】:

        我的观点是switch总是错的:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-11-09
          • 2021-12-08
          • 2021-09-14
          • 1970-01-01
          • 1970-01-01
          • 2013-12-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多