【问题标题】:Why are there different ways to describe same design pattern using UML? What to trust?为什么使用 UML 有不同的方法来描述相同的设计模式?信任什么?
【发布时间】:2021-08-30 20:49:18
【问题描述】:

我发现同时学习设计模式和 UML 很困难,因为有不同的方式来描述相同的模式,这让我不确定什么是唯一的事实来源。

以迭代器模式为例,这里只是我在知名网站上看到的一些图表:

1 维基百科

https://en.wikipedia.org/wiki/Iterator_pattern

2 教程要点

https://www.tutorialspoint.com/design_pattern/iterator_pattern.htm

3 重构大师

https://refactoring.guru/design-patterns/iterator

4 OODESIGN

https://www.oodesign.com/iterator-pattern.html

5 HOWTODOINJAVA

https://howtodoinjava.com/design-patterns/behavioral/iterator-design-pattern/

最让我困惑的是箭头符号是如何用来描述这些类之间的关系的。有时它们是泛化,有时是接口实现,定向关联或依赖。连构图也用了……

我想知道什么是让我明白这一切的最佳方式。

【问题讨论】:

  • 购买 Gamma 等人的设计模式。他们“发明”了它,并且对符号 (TM) 应该是正确的。这是 Wiki 文献中提到的第一个来源。
  • 那个教程点是完全错误的。他们使用命名关联而不是实现/概括。那是完全不同的事情。不确定 Gamma 使用后者中的哪一个;它们有不同的含义。

标签: design-patterns iterator uml software-design class-diagram


【解决方案1】:

一般来说,在查看设计模式的 UML 模型时需要非常小心。原因有以下三个:

  • 设计模式的参考是GoF。这本书出版于 1995 年,当时 UML 还没有出现,并使用了 OMT 表示法(UML 的祖先)的一种变体。如有疑问,这是值得信赖的来源。
  • Java 语言设计于 1995 年公开,JDK 1.0 于 1996 年 1 月发布,该语言尚未广为人知。作者将他们的设计和代码示例基于 C++ 类模型,即仅基于类和继承,而无需考虑多重继承。大多数现代语言不支持多重继承。因此,一些原始模式必须适用于 Java、C# 或 Swift,以区分类、抽象类和接口,以及继承和接口实现。有多种方法可以做到这一点。例如,一些系统地将抽象类转换为接口。有些人只有在发生冲突时才皈依他们。还有一些根据界面“精神”进行转换。
  • 发生了误解。有些人在网上发布了这样的图表,但误解了模式,或者误解了 UML,或者两者兼而有之。此外,Gamma 等人在他们还是博士生时就开始了这本书,也犯了一些错误。例如,您会发现他们在使用 OMT 聚合时存在一些不一致之处。
  • 最坏的情况是 Builder 模式,您不仅会遇到这些问题,而且还有命名冲突:一本非常流行的 Java 书籍介绍了 builder 模式的(非常不同的)变体,具有不同的意图和另一种设计,导致完全混乱。

现在到您的具体示例,并根据您提供的内容:

  • oodesign 是最接近原始模式且完全准确的。顺便说一句,当涉及到模式时,我主要使用指向他们页面的链接。
  • 重构大师也是不错的选择。他们选择使用接口而不是抽象类,这很好。但是他们重新定义了界面的操作和属性(可能与自己的示例有关)并且需要双向导航,这似乎是不合理的。如果您有兴趣,有一个“Head First: Design patterns”,它使用类似的映射但保留了原始界面。
  • wikipedia 也不错:他们忽略了客户端(GoF 以浅灰色显示,表明它对于这种模式不是必需的);它们在依赖关系上更加精确和完整;但他们也以不同的方式重新定义了操作和属性。他们添加了一个不必要的聚合符号。
  • 如何在 Java 中实现 令人困惑,因为他们保留了一个抽象类并为另一个选择了接口。他们隐藏了操作和属性。但乍一看并没有什么根本错误。
  • 忘记教程点,至少对于这个 UML 图。这完全是错误的,正如 cmets 中已经提到的 @qwerty_so。

准确性声明仅适用于此模式和当前版本的内容。鉴于我的介绍性评论,这不能推广到所有设计模式。

【讨论】:

  • GoF 书籍最初于 10 月出版 1994,而 Java 直到 1 月 1996 才公开(即退出测试版)。 Java 的发布时间不一定与这个问题密切相关,因为它没有被标记为这样。它只是强调书中的材料比大多数“现代”语言要古老得多。
  • 同样重要的是要提到,仅仅因为一个网站恰好相对于迭代器模式更准确(今天),这并不意味着同一个网站相对于另一个模式也将是准确的。以我的经验,维基百科的设计模式文章的准确性非常差(并且随着时间的推移也会发生变化)。即使在 25 年后,这本书本身仍然是其作者意图的最准确代表。所有这些网站都会有一些不一致的地方,所以记住这些模式是不够的。了解他们的意图至关重要。
  • @jaco0646 我完全同意网站的准确性。维基百科普遍很差。和oodesign比较好虽然不完美。事实上,最好的资源仍然是 GoF,它还解决了一些具有优点/缺点的开放性问题,而网站经常对这些问题采取立场,这呈现了原始内容的部分视图。 GoF万岁! (如果只有 s.o. 可以更新过时的示例);-)
  • 嗯,这让我上了一堂很好的历史课 :-) 我想知道为什么 GoF 书上没有 UML 更新,还是有更新?
  • 现在已经快 15 年了。那时我不希望有任何更新。可能很多“...的设计模式”书籍会为“设计模式书籍的设计模式”创造市场?
猜你喜欢
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多