意大利面条代码有什么特点?

时间:2010-04-04 05:54:38

标签: php wordpress coding-style

有人说当你的PHP代码和应用程​​序使用全局变量时,它必须是意大利面条代码(我假设这一点)。我经常使用WordPress。据我所知,这是伟大的PHP软件附近最好的事情。它使用许多全局变量在其组件之间进行交互。

但是忘记这一点,因为坦率地说,这是我唯一知道的事情。所以它完全有偏见; D

所以,我只是好奇,意大利面条代码的特点是什么?

PS:我唯一知道的是WordPress。所以,希望这可能有助于某些人在PHP上开发完整的Web应用程序(例如,Stack Overflow网站)上几乎没有经验的人给出一个很好的答案。

4 个答案:

答案 0 :(得分:21)

  • 没有模块化(一个文件,类,模块,命名空间,包或任何语言用于提供模块化的东西),
  • 很多goto
  • 组织不好,
  • 没有明确的功能和目的分离。 (即,无所不包的类或功能)
  • 功能齐全。
  • 命名不佳。
  • 始终没有一致的编码风格。
  • 实现与代码客户端之间没有明确的接口契约。 (也就是说,没有规定功能的输入,输出,前后条件)
  • 过度依赖数据结构的内部,几乎没有抽象。
  • 函数随机置换/修改全局状态,而不在文档中提及它。
  • 缺少关于非平凡代码的评论或文档。
  • 比需要的更复杂的代码。
  • 缺乏重用。 (大量重复的代码,a.k.a。copypasta
  • 没有验证或单元测试(它可以用于信仰)。
  • 魔术数字。

从本质上讲,缺乏设计和 事先考虑,只是一个混蛋 黑客一起打耳光。这适用于任何语言,而不仅仅是PHP。

  

对于在PHP上开发完整Web应用程序的经验不足的人(例如,Stack Overflow网站)

仅供参考,但Stack Overflow不是用PHP开发的。

答案 1 :(得分:7)

好吧,谈到您发布的评论,解释非常简单。 使用global运算符使变量的来源未知,就像意大利面条的另一端。它可以在任何地方定义。所以,当你调用你的函数时,你不知道这个变量有什么价值。而不是直接传递变量使它变得简单明了:

function hello_testing($conditional_random) {
  if ($conditional_random)) {
      echo "foo is inside";  
  }
}

P.S。 http://en.wikipedia.org/wiki/Spaghetti_code

答案 2 :(得分:5)

Spaghetti代码具有特定的特征,可以将其与普通的差代码区分开来。 Spaghetti极其复杂且非结构化,因此很难跟踪整个程序的流程。这就像试图在一碗 bolognese 中解开面条。

这就是为什么在这种情况下经常引用GOTO语句(恐惧词!)的原因:GOTO语句将控制转移到代码库中另一个任意定义的位置。大多数编程语言都有可以滥用的命令来模拟goto样式行为;例如,使用异常来实现常规业务逻辑而不是处理错误。

全局变量对意大利面条代码有贡献,因为这些值是在当前程序单元范围之外分配的。这可能使得难以确定变量设置为给定值的代码库中的位置(或者实际上是否将其设置为任何值)。

顺便说一下,使用goto语句并不意味着程序是意大利面条。使用goto编写清晰,结构良好的代码是完全可能的,只需要很多自律就不要滥用它的灵活性。现代编程语言使其使用不必要,并且是不可取的。

答案 3 :(得分:2)

WordPress是我见过的最大的意大利面条代码。 PHP,HTML,JavaScript以及介于所有内容之间的所有东西都集中在同一个文件中。如果您想要另一个意大利面条代码示例,请查看osCommerceZen Cart

事实上,我敢说绝大多数开源PHP应用程序都是如何用PHP编程的令人震惊的例子。如果你想看一个好的结构化例子(即非意大利面),那么看看Yii框架或Zend Framework。像CodeIgniterKohana这样的框架虽然不是意大利面条,但它们并不是很好的例子,说明如何在PHP 5中构建东西,因为它们使用了PHP 4中使用的许多功能,因为没有更好的方法。这样做直到PHP 5(例如,使用基于路径的继承而不是真正的对象继承)。

如果您想要一个合理的程序编程示例,请查看Drupal。它可能不是性能最好的PHP应用程序,因为它的复杂性,但肯定胜过WordPress,你可以用它做很多相同的事情。