38

我最近遇到了一个术语“上帝对象”,它被描述为“反模式”。我听说过糟糕的编码实践,但我从未听说过这样描述它们。

所以我前往 Wikipedia 了解更多信息,我发现有一种称为“馄饨代码”的反模式,它被描述为“以许多小型且(理想情况下)松散耦合的软件组件为特征”。

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

4

8 回答 8

36

意大利面:

Spaghetti code 是源代码的贬义词

馄饨:

馄饨代码是一种计算机程序结构,其特点是许多小的(理想情况下)松散耦合的软件组件。该术语与意大利面条代码相比,将程序结构与意大利面进行比较

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

但我同意。这篇文章很混乱。问题不在于馄饨类比,而在于维基百科文章结构本身。它开始称意大利面条是一种不好的做法,然后说一些例子,然后说一些关于馄饨代码的事情。

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

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

于 2010-01-12T20:18:41.863 回答
18

我想说很明显,馄饨代码和千层面代码都是贬义词——故意放在他们的意大利面比喻“意大利面条代码”旁边——这两个术语都描述了现实世界的反模式。有些代码维护起来非常耗时,而且很容易失败,因为它被分解成许多独立的子流程——那就是馄饨代码。某些代码具有如此多的抽象层,以至于很难对其进行更改和/或理解发生故障的级别 - 这就是千层面代码。更改千层面代码的唯一实用方法通常是简单地绕过这些层并编写完成这项工作的简单代码。我必须维护一些馄饨代码,但一般来说,这样的代码会受到卷积的影响,无法广泛使用,所以很少有我们都熟悉的例子。相比之下,千层面代码目前无处不在。我喜欢认为我自己不会编写任何意大利面代码,但您至少可以遵循一串意大利面条......

于 2015-12-07T12:53:58.667 回答
16

它列在意大利面条代码页面中,但这并不意味着它是一件坏事。它在那里是因为这是一个相关术语,并且不够重要,无法拥有自己的页面。

关于不好的一面,谷歌搜索在http://developers.slashdot.org/comments.pl?sid=236721&cid=19330355中给出了评论:

问题是它往往会导致函数(方法等)没有真正的连贯性,而且它经常让代码实现即使是相当简单的东西,分散在非常多的函数中。任何必须维护代码的人都必须了解所有位之间的所有调用是如何工作的,除了使用函数调用而不是 GOTO 之外,几乎重现了 Spaghetti Code 的所有缺点。...

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

于 2010-01-12T20:21:24.200 回答
8

“馄饨代码”作为一个短语幸存下来的唯一原因几乎是因为程序员具有与生俱来的幽默感。尽我所能尝试——相信我,我已经尝试过了——真的很难想出一个面向对象代码的例子,它既(a)被打包,所以很难以相同的元意义进行导航,“意大利面条代码”很难导航,并且 (b) 反映了编码实践中经常出现的反模式。

我能想到的“馄饨代码”的最佳示例是大量的类,每个类都紧密打包,但是很难挖掘出主要的执行流程在哪里。神经网络应用程序可能会表现出这一点,但这就是重点。一个更普通的例子是非常面向事件的 UI 代码,但同样,这很难过分——如果有的话,大多数 UI 代码都不够事件驱动

于 2010-01-12T20:27:44.170 回答
5

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

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

松散耦合的组件是好的。为了看起来松散耦合而隐藏它们的相互依赖关系的组件并不是那么好。

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

不过,大多数代码库都有相反的问题,因此转向更多的模块化通常是一件好事。我希望大多数人甚至从未见过所谓的“馄饨代码”。在实践中,它看起来更像是切碎的馄饨(应该是一个模块被拆分为多个“模块”——这些模块本身没有任何意义,但只能与它们相应的其他部分结合使用),或者像馄饨没有足够的水煮熟(所以你最终会得到一大块“模块”全部粘在一起)。

TODO:将“Hello world”程序编写为大约 100 个模块来展示过度模块化。

TODO2:尝试用一卡车的馄饨搭建一座桥梁,以展示次优的结构特征。

于 2016-07-28T21:49:53.107 回答
4

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

你可以转动你的轮子,试图制作一个越来越松散耦合的完美应用程序,而实际上却没有为它增加任何价值。

不过,让我赶紧补充一下,我认为我们都应该针对松散耦合的类、组件等

于 2010-01-12T20:21:52.810 回答
3

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

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

于 2010-01-12T20:16:43.103 回答
2

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

于 2010-01-12T20:18:48.807 回答