Smalltalk 中的设计模式

Design Patterns in Smalltalk

常说设计模式多用于静态类型语言,如C++和Java,我也同意。但在 this article 罗伯特·马丁写道

What a strange thing to say. Smalltalk, a dynamic language, played a significant role.

由于我没有Smalltalk的经验所以想问一下Strategy或者Visitor这样的模式在Smalltalk中用的多吗?我认为您不需要 "dynamic language"

访问者模式(以及许多其他模式)在 Smalltalk 中被广泛使用。例如 Smalltalk 方法的解析和编译使用访问者。代码着色和格式化也是典型的例子。还有很多其他情况,我提到这些的原因是因为方法编译在开发环境中动态发生(例如,编译器能够在 运行 时修改自身并立即获取更改)。

从历史上看,Kent Beck 是最早将设计模式应用于 Ward Cunningham 编程的人之一,这主要应用于 Smalltalk。
参见 https://en.wikipedia.org/wiki/Software_design_pattern

他在 1996 年出版的 Smalltalk 最佳实践模式一书中推广了其中一些模式。
参见 https://en.m.wikipedia.org/wiki/Kent_Beck

即使四人组的作品发表于 1994 年,早于 Kent Beck 的书,在 Smalltalk 中发现大量此类模式也不足为奇。

具有讽刺意味的是,这些设计模式一旦应用于静态类型语言,就对它们产生了巨大帮助。

你提到的文章很好地解释了什么是设计模式,我会在你的问题的上下文中添加更多细节。

设计模式通过基本上降低耦合和增加内聚,提供了提高软件质量的易于理解的方法。这两个属性是任何软件所固有的,无论它是用静态类型、动态类型、面向消息based/object、函数式还是命令式语言编写的。

虽然动态类型语言和静态类型语言的模式可能略有不同,但它们仍然提供了有关如何设计代码的有用概念。

实际上,许多(如果不是全部)原始设计模式书的作者都非常精通 smalltalkers,并且可能在使用 Smalltalk 代码时发现了这些模式。原书中有数百次提到 Smalltalk,许多原始模式都应用在 Smalltalk 系统中。

如果你打开任何 Smalltalk,访问者是最容易区分的之一,因为它具有特殊的 visit/accept api,用于遍历许多树状结构,例如编译器中的解析树,或用户界面元素层次结构中的节点。

一本关于如何在 Smalltalk 中实现设计模式的优秀书籍是: https://www.amazon.com/Design-Patterns-Smalltalk-Companion/dp/0201184621

如果你能读一点 Smalltalk,我认为这本书比用 C++ 介绍标准设计模式的 GoF 书更清楚地介绍了标准设计模式。

您可能会问为什么?在我看来,我认为这是因为 Smalltalk 没有静态类型声明,所以代码更短且更容易理解。让你更容易掌握图案的“形状”

我特别喜欢这本书对访客的介绍。

Smalltalk 配套书籍草稿的一些相当广泛的部分可在 http://rmod-files.lille.inria.fr/FreeBooks/SmalltalkDesignPatternCompanion

免费(合法!)

值得一看,以决定是否要购买一本。