2010-10-27 64 views
6

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

关于此问题的资源很少,特别是来自C2 wiki的Are Design Patterns Missing Language Features或来自SO的Are design patterns really language weaknesses?。但我无法找到对这个问题的非客观,客观和全面的报道。理想情况下,我想要一个带有GoF设计模式(行)和一些主流编程语言(列)的矩阵,其中每个单元格都会引用关于特定编程语言中模式的讨论。我们也可以解决这个问题并选择:Java(作为静态类型的OO代表),Smalltalk(作为动态类型代表),Haskell(作为功能代表),Scala (作为混合oo /功能代表),Lisp(作为元编程代表),JavaScript(作为基于原型的代表)。并留下其他PL的旁注或评论。我知道我们可以争论这个选择,但这对于这些语言来说已经很有意思了。

无论如何,这将永远是一个悬而未决的问题,但我觉得就这样问,这足够集中,有一个最佳答案。

也许这个矩阵已经存在的地方?或者有人有足够的知识来制作它?或者有人足够敏锐地开始并使其成为维基答案,以便其他人可以继续?

+0

而不是在SO上提出一个开放式的主观问题,你为什么不写一个博客文章,并发现它,因为你发现一个模式的新实现? – slugster 2010-10-27 01:32:04

+0

这不可能有一个最佳答案。我会投票给社区wiki。 – 2010-10-27 01:33:14

+0

@slugster我的想法确实是撰写这样一篇博客文章(或我的一位朋友会这样做),而问题是收集有关特定模式w.r.t对给定语言的最佳讨论的参考。然后我可以将它编译成博客条目。同时,我可能也会回答我自己的问题,并草拟矩阵的草稿。 – ewernli 2010-10-27 02:05:29

回答

5

设计模式中的模式是人们在使用不同语言进行编程时不断增加的一组模式的子集。作者非常清楚,这些模式只适用于OOP语言,所以其中许多模式在这种情况之外是没有意义的。

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

+0

+1,我写了OO C代码(和状态机C代码,可以非常相似)。我想说的是,在任何具有超过100K代码空间的设备上,用汇编语言编写的调用堆栈不仅仅是一种模式,而是一种帮助。 – detly 2010-10-27 01:54:34

+0

正确,某些模式不适用于其他上下文。对我来说,跳过根本不相关的模式也没有问题,或者提出一种模式在另一种语言/模式中根本没有意义时。但我觉得下面的模式应该在OO上下文之外进行讨论:适配器,装饰器,代理,命令,解释器,观察者,状态,策略,访问者。是的,有很多模式和语言,所以我必须以某种方式限制问题的范围。 – ewernli 2010-10-27 02:13:10

1

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

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

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

我无法帮助您选择一张婴儿床床单,但我可以肯定的是,GOF模式不适用于函数式编程语言,因为它们直接涉及到数学的真实模式,因为功能性语言的美妙之处在于他们直接(在大多数情况下)映射到解决数学问题的许多年。也许一个莽撞的说法是,函数式语言的设计模式是具有一对一关系的数学定理,其中OO具有一种有时妨碍人为抽象的形式。

我认为有些设计原则可以针对所有语言(如MVC,多层体系结构,扩展和扩展)进行交叉。但是这些我认为不是设计模式,更多的是好的软件设计实践。

+0

你实际上说的是,当使用其他语言时,某种模式消失,实际上我想调查。也许我应该首先从提取GoF模式解决的问题开始,然后看看如何用其他语言解决问题。例如。对象或数据结构唯一性的问题在面向对象的单例中被解决,并以严格的功能语言消失。或者Haskell类型类和复合模式之间是否存在某种概念关系?当然,我有点比较苹果和橘子,但这很有趣。 – ewernli 2010-10-27 16:13:35

+0

或者在OO中使用访问者来解释AST时,如果因为超载而无需功能(请参阅表达式问题),这一事实。或者消失的解释器模式是PL支持元编程。或者适配器,如果你有类似Scala的隐式和提取器等等。 – ewernli 2010-10-27 16:16:27

+0

是的,我也对比较感兴趣。 GOF模式确实与面向对象设计有关,我认为它们所代表的并不是什么新东西,但它们确实使得像我这样的日常乔可以访问模式/算法。在所有的无知中,我只是把它们作为指导原则,但是在深入研究功能性风格之后,我开始意识到它们有更多的深度。访问者模式是一个经典的OO示例,它基本上是将一种形式转换为另一种形式的函数。 – WeNeedAnswers 2010-10-27 16:26:22