【问题标题】:Definition of spaghetti php?意大利面条php的定义?
【发布时间】:2009-06-03 10:30:10
【问题描述】:

我经常看到“意大利面条”被抛出,我只是想清楚地解释什么是意大利面条代码以及什么不是。只是因为我不想这样做。

PHP 中的引用会有所帮助,因为这是我选择的语言。

【问题讨论】:

标签: php coding-style


【解决方案1】:

不同之处在于意大利面条代码是由其他开发人员编写的。您的代码绝不是意大利面条代码。

【讨论】:

  • 如此真实。 :D
  • 我真的不明白这个答案有什么帮助!
  • @Noldorin 这不是,只是好笑。
  • 但确实如此!真的,这个答案就是这个问题的答案:P
  • 这是为数不多的另一个答案值得比被接受的答案更多的投票之一,而不是被接受的答案。
【解决方案2】:

术语“意大利面条代码”根本不是 PHP 特有的——它适用于所有编程语言,并且在大多数语言中应该看起来非常相似(至少具有相同的范式)。不过,也许你明白这一点,只是想要一个 PHP 示例。

Wikipedia article 关于这个主题似乎很清楚:

意大利面条代码是一个贬义词 对于复杂的源代码 和纠结的控制结构, 尤其是一个使用许多 GOTO 的, 异常、线程或其他 “非结构化”分支结构。 之所以这样命名是因为程序流程 看起来像一碗 意大利面,即扭曲和缠结。 意大利面条代码可能是由 几个因素,包括 没有经验的程序员和一个 复杂的程序 在较长的使用寿命内不断修改 循环。结构化编程大大 减少意大利面的发生率 代码。

这个论坛帖子 Top 100 Signs That I Am Writing Spaghetti Code in PHP 可能对您有些用处,因为它专门与 PHP 相关。

【讨论】:

    【解决方案3】:

    这是spaghetti code 的一个相当不错的定义。

    这是一个主观术语,用于描述过于复杂、结构不良、难以遵循、不一致、依赖副作用(尤其是全局副作用)或这些情况的某种组合的代码。

    与大多数脚本语言一样,PHP 是松散类型的。您不需要在使用变量之前声明它们。许多变量在“全局”范围内使用,并且有隐式包含文件的规定(自动加载),仅举几例。这些都不是不好的功能,但是如果使用不当,它们很容易导致意大利面条式代码。

    【讨论】:

    • +1 表示依赖全局变量和环境条件。在我看来,这也总是一大碗意大利面。
    【解决方案4】:

    在编写良好的代码中,您应该能够清楚地遵循流程,不仅从开始到结束,而且从结束到开始(除非存在致命错误情况,在这种情况下,您的处理程序应该有回溯输出)。 每个功能都遵循一出一出的规则

    避免意大利面条式代码的一种方法是确保 return 语句是您在函数中编写的最后一件事,并且在此之前您永远不会有 return。

    如果一个函数返回一个意外的值,干净的代码将允许您从 return 语句开始,然后向后工作以查看它从哪里得到它的值。但是,如果代码是意大利面条,那么大约有一半的时间你会浪费几个小时来困惑函数如何返回该值,直到你碰巧发现埋在函数中间的第二个 return 语句。

    我强烈不同意 cletus 和 Andomar 声称这所有都是主观的。函数中间的 return 语句显然是意大利面条代码。

    【讨论】:

      【解决方案5】:

      意大利面条代码的classical definition 是“由于使用了非结构化分支而难以遵循控制流的代码”。由于 PHP 与 1970 年代以来发明的大多数语言一样不支持 GOTO,因此理论上您无法编写意大利面条式代码。(更新:自 5.3 以来,PHP 确实有 goto 语句,但它的破坏性潜力仍然有所限制)

      但是,可以通过大量使用全局变量的长脚本和函数来实现良好的近似。 deeply nested if/elseif/else cascades 和错误格式的奖励积分。添加一些 HTML、JavaScript、PHP、生成 HTML 的 PHP 和 PHP which generates JavaScript which generates HTML 的疯狂混合,确保没有人能够理解代码,甚至是编写代码的人。

      【讨论】:

      • 从 5.3.0 开始,PHP 确实包含 Goto。
      • @mjsa:嗯,至少这是一个有限的。
      猜你喜欢
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多