设计模式为(缺失)语言功能

时间:2010-10-27 01:22:27

标签: design-patterns programming-languages language-design

有时人们将设计模式称为缺少编程语言功能。为了避免关于什么是设计模式的争论,让我们说我们只考虑原始的GoF模式。例如,单例模式在Scala中消失,Scala使用关键字object支持单例对象。

关于此问题的资源很少,特别是来自C2维基的Are Design Patterns Missing Language Features或来自SO的Are design patterns really language weaknesses?。但我找不到对这个问题的非自我,客观和全面的报道。

理想情况下,我想要一个带有GoF设计模式(行)和一些主流编程语言(列)的矩阵,其中每个单元格都会引用有关特定编程语言中模式的讨论。

为了避免关于PL要考虑什么的争论,我们也可以解决这个问题并选择:Java(作为静态类型的OO代表),Smalltalk(作为动态类型代表),Haskell(作为功能代表),Scala(作为混合oo /功能代表),Lisp(作为元编程代表),JavaScript(作为基于原型的代表)。并留下其他PL作为旁注或评论。我知道我们可以争论这个选择,但对于这些语言而言,这已经非常有趣了。

无论如何,这总是一个悬而未决的问题,但我觉得问这个问题,这个问题足以让人有一个最好的答案。

也许这个矩阵已经存在于某处?或者有人有足够的知识来制作它?或者有人热衷于开始并将其作为维基答案,以便其他人可以继续?

2 个答案:

答案 0 :(得分:5)

设计模式中的模式是人们在使用不同语言编程时使用的不断增长的模式集的一部分。作者非常清楚,这些模式仅适用于OOP语言,因此在这种情况之外,其中许多模式都没有意义。

与此同时,OOP语言中不需要其他语言中的大量模式。在C或Scheme中实现时,请考虑对象本身是一种模式。在汇编中,调用堆栈是一种模式。

答案 1 :(得分:1)

我个人,在花了几年时间做OOP之后发现设计模式的问题是,他们确实突出了OOP的问题,以及看到数据中与模式相关的模式有多么困难它正在建模中。有时候看树木是很难的。 OOP中的一些人工制品只是用于解决在特定范例中思考或绕过封装状态和访问时存在的问题。

我认为设计模式很好而且我使用它们,但是它们被认为是OOP无法对数据结构和功能客观存在的问题的解决方案,因此经过试验和测试的公式可以适用。一个简单的例子是Singleton对象。这在使用函数式语言时就会消失,而不是问题。

正如SO上的一位绅士所说,当我询问UML以及是否可以用它来模拟功能语言时,他说功能编程语言的建模语言是数学。我认为这是理解为什么模式与函数式编程语言无关的关键,因为它们背后的理论沉浸在数学结构中。

我无法帮助你使用婴儿床单,但我可以肯定GOF模式不适用于函数式编程语言,因为它们直接转向真正的数学模式,因为函数式语言之美就是他们直接映射(在大多数情况下)多年解决数学问题。也许一个夸张的说法是,函数式语言的设计模式是具有一对一关系的数学定理,其中OO具有一种人为抽象的形式,有时会妨碍它。

我认为有一些设计原则可以与所有语言交叉,例如MVC,多层架构,扩展和扩展。但是我认为这些不是设计模式,而是更好的软件设计实践。