【问题标题】:Trying to avoid "spaghetti code", why is multiple if-else bad?试图避免“意大利面条代码”,为什么多个 if-else 不好?
【发布时间】:2013-08-30 08:46:47
【问题描述】:

我刚刚在阅读top 100 signs of spaghetti code 时遇到了第 4 条,它简单地说:

if ($status == "awake"){ 
    $actitivity = "Writing spaghetti code"; 
} else if ($healthstatus == "OK"){ 
    $activity = "Sleep"; 
} else { 
    print "CALL 911 IMMEDIATELY!"; 
}

我在other spaghetti discussions 中看到了这种多重 if-else 模式。我有点困惑为什么会这样,即使它适用于这个例子。

上面的例子不好是因为

  • 第一个变量是actitivity,表示编码器需要一些睡眠,所以这是个玩笑,或者

  • 不应在逻辑期间输出视图,或者

  • if/else 太多的原因


编辑不要介意第二部分,因为嵌套条件和多次返回,这很糟糕

other spaghetti discussions链接中,是不是很糟糕,因为

- 逻辑中有return,这会中断流程,或者

- 太多if/else 堆积在彼此之上...?

【问题讨论】:

  • 最终,大部分都可以归结为Cyclomatic Complexity旗下的正式计算机科学。
  • 啊,谢谢你的链接!这是每个人都试图描述的非常清晰的模型。更多节点或更改 -> 更复杂 -> 更难阅读 -> 意大利面条。
  • 是的,就是这样。但这不仅难以阅读,而且也难以预测。每增加一个节点,代码块的维护和测试就会变得更加困难。

标签: php coding-style


【解决方案1】:

If/else 语句经常中断Open-closed principle。 (Java 示例,但在 PHP 中也有效)

解决方案 => 支持多态性。

此外,多次分配临时变量确实容易出错并降低可读性。特别是在 PHP 中,因为它不是静态类型的语言。 确实,如果有人先分配$actitivity = "Writing spaghetti code"; 然后分配$actitivity = 1; 怎么办? ...在同一个容器中混合苹果和橙子。看看这个:http://sourcemaking.com/refactoring/split-temporary-variable

此外,仅当其中一个条件得到验证时,逻辑才允许产生副作用 (print) => 方法不具有凝聚力,因此违反了 SRP。

【讨论】:

  • 像我这样的人:SRP states that every object should have a single responsibility, and that responsibility should be entirely encapsulated by the class.
  • SRP 也适用于方法 .. 不仅是整个对象本身。您如何命名在一种情况下打印并在其他情况下执行其他操作的方法:printPerhaps? .. 倾向于使您的方法具有高内聚性是拥有干净代码的最佳方法之一。在这种情况下,拆分方法。
  • 欲了解更多信息,请查看:codebork.com/2011/02/02/…。显示的第二张图片有一个错误(因为与第一张相同),但在相关的 github 中,有很好的示例 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多