有建筑气味吗?


37

Web上有大量参考和列出代码气味的资源。但是,我从未见过有关建筑异味的信息。这是在某处定义的,并且有可用的列表吗?是否已对架构缺陷及其对项目速度,缺陷等的影响进行了正式研究?

编辑:我并不是真正在答案中寻找清单,而是有关建筑气味的文档(在网络上或书籍中)。


4
仅当建筑师的个人卫生习惯较差时……
FrustratedWithFormsDesigner

我真的不是要你们在这里列出气味。也许链接到列表?
C. Ross,

罗斯抱歉,我没意识到。我刚刚添加了一些经验。
阿米尔·雷扎伊

@Amir Rezaei是您最好的,至少您将列表合并为一个帖子。
C. Ross,

Answers:


33
  • 多层体系结构 当您在各层上各有各层时...在您的应用程序中,您会看到我的观点。我称它为“分层架构”
  • 过分抽象,以至于您迷失了代码。
  • 未来派体系结构当解决方案过于未来派时,就会发生这种情况。实际上,没有人可以预测新的需求。因此,大多数未来的实现方式都是浪费时间和资源。
  • 技术热情的架构师 建筑师喜欢这项新技术,并投入了生产。不知道以前是否被证明过。
  • 过度破坏架构通过架构技能和技术的指数因素解决了一个简单的问题。
  • 云架构 我将其称为云架构,因为架构与真正的架构没有任何联系。这只是一些不错的Visio图。

完全相反的情况也是如此。

这是十大软件体系结构错误的链接。


1
我同意这一点,我已经看到了荒谬的分层应用程序(最多9层)

7
果仁蜜饼的建筑?
Andrew Arnold

15
啊,相对于意大利面条代码,我喜欢称之为“烤宽面条代码”
GSto

6
Ooh @GSto-宽面条体系结构中的意大利面代码。完整的合奏可以称为“小意大利”。
glenatron

2
在某些地方,application_layers ==(developers_assigned-1),因为有人最终成为PM。
sal

20

一切都是可配置的。当架构师告诉您他的系统由于广泛的可配置性而具有防更改性或高度可定制性时,这就是体系结构的味道。

问题在于,您实际上只能为您认为现在需要配置的内容提供配置机制,但是一旦您的应用程序开始运行,这将是不够的。然后,配置机制不断扩展,最终您将获得内部平台效应。

然后您陷入软件地狱。


但是,有趣的是,内部平台效应令人毛骨悚然,但是许多人正在将面向DSL的开发视为下一个大事,我认为这在设计上有点内在地。
glenatron 2011年

@glenatron:也许这就是重点?为什么不就把毛巾扔掉并假设它会发生呢?然后,您可以使用DSL进行开发并修改实现以处理更多配置。
Jeremy Heiler 2011年

我会说DSL就像DSL一样。那是实现的好方法和坏方法。当我想到如何正确完成时,我会想到构成Ruby on Rails的许多DSL。他们并没有实现自己的语言,它们只是Ruby程序中的构造,但是他们巧妙而有益地抽象了它们所用语言的许多细节。凡IPE真正开始臭气熏天是当你从域特定语言转向日益广义Lanuage是开始看起来很像它在实现的语言。
亚当克罗斯兰

我最近在阅读有关DSL的文章,Jetbrains的MPS看起来很有趣,但是我还不能考虑使用它。他们声称会在某些产品上使用它,所以我可能会询问看看哪些以及如何使用。
伊恩

如果可以的话,我将对此投票1亿次。如果您曾经使用过名为Clarity的项目管理工具,那么您会理解为什么这是一个糟糕的架构选择!
HLGEM 2011年

9

由ORM设计的数据库!或者是非关系数据库后端,应该是关系数据库。或您打算使用视图调用视图的视图的数据库,不仅它们太慢(必须从一开始就为性能而设计数据库),而且当您需要进行更改时,它们很难追踪(@AmirResaei说过抽象,当您需要修复所有这些层底部的内容时,很容易在代码中迷失方向。)


这是死的。可悲的是,随着硬件变得越来越快,这已经成为一个更大的问题。它可以快速处理10条记录,为什么100,000,000条记录不起作用?
杰夫·戴维斯

4
对我来说,ORM是建筑的味道。
Christopher Mahan

3

代码气味和建筑气味是相同的。由于架构欠佳,代码开始“闻”。

在Martin Fowler的主题为Refactoring的开创性著作中,他介绍了一系列Code Smells,并确定了将它们重构到系统之外的方法。Joshua Kerievsky的“ 模式重构”通过提供特定的架构模式来修复各种代码异味(以及如何逐步重构它们),进一步强调了这一思想。

大多数重构都是通过增强的体系结构来减轻次优代码的。有人可能会争辩说,唯一自然产生的“建筑气味”(除了“泥浆大球”之外)将是BDUF(前大设计)架构。在编写第一行代码之前,尝试容纳所有需要的内容。一个按需完成设计的敏捷软件项目(即使我敢说代码也视为design),它的体系结构也会有机地增长。


1
有趣的是,您能举个例子吗?
特拉维斯·克里斯蒂安

聪明的编码就是代码的味道。
Christopher Mahan

在没有事实根据的情况下做出陈述的答案。回答气味?
伊万·普赖斯

@EvanPlaice我很抱歉。希望我的编辑能够对我如何得出答案提供更多的见解。
迈克尔·布朗

@MikeBrown +1我一直在玩,但是进步很大。
伊万·普赖斯

2

(很多)耦合(无论以哪种形式)是使建筑散发出气味的原因。耦合越多,闻起来越香。

就是说:根本没有耦合通常会闻到性能问题。


1
我必须不同意这一点。如果您正在谈论业务应用程序,那么将其耦合到极不可能更改的数据库是明智而又愚蠢的。您可以使用特定于数据库的性能更高的功能。
HLGEM 2011年

+1,但YMMV。请谨慎使用。
Michael K'2

1
这就是为什么我添加了“根本没有耦合通常会闻到性能问题”的原因。我同意您必须使用耦合来提高性能。到处都有很多耦合(在不同模块/类/应用程序之间),这是一个体系结构问题。
Klaim

2

这是我一直遇到的一种具体的体系结构/设计气味:直接从事务数据库进行分析和报告。

在某些情况下(即少量报告),这当然是可以的,但在许多情况下,报告和事务处理要求存在冲突。但是,由于这是一件简单/便宜的事情,因此报表直接从事务数据库运行。这在等式两边都引起了各种各样的麻烦。

顺便说一句,这在Enterprise LOB应用程序中很常见。我知道许多SMB都没有创建仓库和数据集市的资源或专业知识(忘记多维数据集或减少地图的设置),但是与我合作的许多大型组织都遇到了同样的问题。

在设计系统时,架构师确实应该意识到,报告(尤其是分析报告)和事务需求最好被视为单独的问题,而不仅仅是在数据库级别上结合在一起。


0

我不确定这是否正确地适合于体系结构级别,但是如果我在应该是面向对象的设计中看到一堆管理器类/模块,那么这可以保证唯一会理解体系结构/设计的人是建筑师/设计师本人,没有别人做很多解释/学习。


0

社区记录了许多建筑气味。常见的集合如下。

  • 循环依赖性:当两个或多个体系结构组件直接或间接相互依赖时,会产生这种气味。
  • 不稳定的依赖关系:当某个组件依赖于其自身不那么稳定的其他组件时,就会出现这种气味。
  • 上帝成分:当成分在LOC或类别数方面过大时,就会出现这种气味。
  • 特征集中:当一个组件实现了一个以上的建筑关注/特征时,就会出现这种气味。
  • 分散的功能:当多个组件负责实现同一高级关注时,会出现这种气味。
  • 密集结构:当组件具有过多且密集的依赖性而没有任何特定结构时,会出现这种气味。

我最近准备了一种气味分类法。目前,它记录了38种体系结构气味和260多种总代码气味。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.