馄饨代码 - 为什么反模式?

时间:2010-01-12 20:12:42

标签: anti-patterns

我最近遇到了一个术语“God object”,被称为“反模式”。我听说过不好的编码习惯,但我从来没有听过他们的描述。

所以我前往维基百科了解更多内容,我发现有一种名为'Ravioli code'的反模式被描述为“以一些小的(理想的)松耦合软件为特征组件“。

我很困惑 - 为什么这是件坏事?

8 个答案:

答案 0 :(得分:29)

Spaghhetti:

  

Spaghetti代码是一个贬义术语   源代码

馄饨:

  

馄饨代码是一种计算机   程序结构,特点是   小和(理想情况下)的数量   松散耦合的软件组件。   术语比较   意大利面条代码,比较程序   面食的结构;

正在比较它们。这并不是说它是一种反模式。

但我同意。这篇文章令人困惑。问题不在于馄饨类比,而在于wikipedia文章结构本身。它开始称Spaghetti是一种不好的做法,然后说了一些例子,然后说了一些关于Ravioli代码的事情。

编辑:他们改进了文章。是一种反模式,因为

  

虽然从耦合和内聚的角度来看通常是理想的,但过度分离和封装代码会使调用堆栈膨胀并使代码导航更难以进行维护。

答案 1 :(得分:14)

它列在Spaghetti代码页面中,但这并不意味着它是一件坏事。它就在那里,因为这是一个相关的术语,并不足以拥有自己的页面。

关于它的坏处,谷歌搜索在http://developers.slashdot.org/comments.pl?sid=236721&cid=19330355中发表评论:

  

问题在于它往往导致函数(方法等)没有真正的一致性,并且它经常使代码实现甚至分散在大量函数上的相当简单的东西。任何必须维护代码的人必须了解所有位之间的所有调用是如何工作的,重新创建几乎所有Spaghetti Code的坏处,除了函数调用而不是GOTO。 ...

你必须判断它是否合理:)。

答案 2 :(得分:9)

我说它非常明显的Ravioli代码和Lasagna代码都是贬义词 - 被故意放在他们的意大利面食比较法和意大利面条代码中。 - 这两个术语都描述了现实世界的反模式。有些代码维护非常耗时,而且很容易出现故障,因为它被分解为许多单独的子流程 - 即馄饨代码。有些代码有很多抽象层,很难实现对它的更改和/或理解发生故障的级别 - 即宽幅代码。改变宽面条代码的唯一实用方法通常是简单地绕过层并编写完成工作的简单代码。我必须保留一些馄饨代码,但一般来说这样的代码会受到卷积的影响而无法找到广泛的用途,所以我们都很熟悉它的例子。相比之下,烤宽面条代码目前无处不在。 我想我自己不会写任何面食代码,但你至少可以跟着一串意大利面条......

答案 3 :(得分:6)

“馄饨代码”作为短语存活的唯一原因是因为程序员具有天生的幽默感。尽我所能 - 相信我,我已经尝试过 - 很难想出一个面向对象代码的例子,这些代码都是(a)打包的,因此很难在相同的元感觉中导航“意大利面条代码“难以导航,(b)反映了编码实践中经常出现的反模式。

我能想出的“馄饨代码”的最好例子是大量的类,每个类都紧密打包,但是很难找到主要执行流程的位置。神经网络应用程序可能会展示这一点,但这就是重点。一个更平凡的例子是面向事件的UI代码,但同样,很难超越它 - 如果有的话,大多数UI代码都不是事件驱动的足够的

答案 4 :(得分:4)

如果你应用一个教条规则,所有项目中的所有类都必须松散耦合,无论出于何种原因,那么我可以看到存在很多潜在的问题。

你可以旋转你的轮子试图制作一个非常精细的应用程序越来越松散耦合,而不是实际上添加任何值。

但是,我要赶紧补充说,我认为我们都应该针对松散耦合的类,组件等

答案 5 :(得分:3)

不一定,不是吗?维基百科的文章没有描述它是坏的。许多松散耦合的软件组件,其中这些组件的大小和数量与问题域相关是合理的,对我来说听起来非常理想。

事实上,如果你查找馄饨代码的其他定义,你会发现它被描述为理想的软件设计模式 - 我仍然更喜欢需要大小和数量的警告。

答案 6 :(得分:3)

问题是不同的人使用“馄饨代码”这个词来表示不同的东西。

合理数量的相当小的组件是好的。一大堆没有明显整体结构的小部件并不是那么好。

松散耦合的组件很好。隐藏其相互依赖性以便看起来松散耦合的组件并不是那么好。

能够看到不同组件之间的关系实际上是一件好事。

大多数代码库都存在相反的问题,因此向更多模块化方向发展通常是件好事。我希望大多数人从来没有在坏的意义上看过“馄饨代码”。在实践中,它看起来更像是切碎的馄饨(其中应该是一个模块被分成多个“模块” - 没有一个是自己有意义的,但只与其相应的其他部分组合),或者像馄饨在没有足够水的情况下煮熟(所以你最终会把一大块“模块”粘在一起)。

TODO:写一个“Hello world”程序作为~100个模块来演示过模。

TODO2:尝试用卡车装载馄饨来展示桥梁以显示次优的结构特征。

答案 7 :(得分:2)

阅读文章,Spaghetti是一种反模式;但是馄饨和烤宽面条不是反模式。