【发布时间】:2011-02-01 09:34:48
【问题描述】:
这里的问题是特定于编程语言或技术的设计模式,
就像你只能在 C#、Java 中做复合模式,但不能在 VB6.0 中。这是真的吗,如果是,那是什么模式不能用面向对象的编程语言来实现。
【问题讨论】:
标签: design-patterns programming-languages
这里的问题是特定于编程语言或技术的设计模式,
就像你只能在 C#、Java 中做复合模式,但不能在 VB6.0 中。这是真的吗,如果是,那是什么模式不能用面向对象的编程语言来实现。
【问题讨论】:
标签: design-patterns programming-languages
在经典的“四人帮”模式中,有不少是特定于语言的。其他的,如访问者,仅在面向对象的环境中才真正有用。函数式语言有fold(catamorphisms)而不是Visitor,任何试图在函数式语言中使用Visitor的人都会被视为危险的疯子。最后,还有一些模式可以应用于任何语言,比如 Factory。
我不喜欢 Gamma 等人实践的模式运动的原因之一是模式的观点缺乏知识上的连贯性。 “任何有用的东西”是一个很好的主张,但正如您所观察到的那样,它并没有提供太多指导,说明在语言或范式发生变化时哪些模式可能仍然有用。
要了解对模式进行分类所固有的风险,请查看我最喜欢的系列之一:Kent Beck 的 Smalltalk Best Practice Patterns。尽管标题中有“Smalltalk”,但许多程序员发现这些模式也适用于 Java 和 Python 等语言。
【讨论】:
模式取决于编程语言,尽管不像您的问题所暗示的那么强烈。例如,迭代器是一种设计模式,但在许多语言(C++、Java、C#)中,它是语言的一部分(好的,类库)。
有几种模式可以称为面向对象,即如果没有适当的类、继承和多态性,就很难实现它们。示例:抽象工厂、策略、模板方法。但是,即使这些也可以在例如C,如果有人真的想要。这是可能的,因为 C 有函数指针。尽管我很难想象在没有指针(或等效)支持的情况下以非 OO 语言实现上述模式。话又说回来,我猜这些模式在这样的语言中并没有真正的意义......
【讨论】:
设计模式本身并不是特定于语言的,但是有些模式可以是特定于范式的,例如在 C 中实现单例模式没有任何意义,因为您最好只编写一个普通的旧模块。
但是设计模式不是特定于语言的,但在不同的范例(OO vs结构化 vs 功能)中可能更有用或更有意义
【讨论】:
我认为这更多地取决于您可以使用哪些语言功能,但不,我不会说设计模式仅限于特定语言。
【讨论】:
大多数模式都与语言无关。对于某些模式和语言,需要主要的hackery。例如,windows COM 是 C(不是 C++)语言中复合模式的奇异实现。
像 VB 6.0 这样的一些语言设置了需要跳过才能实现某些模式的主要障碍,因此不值得努力。
【讨论】:
是的,不是的。某些设计模式并非特定于特定语言,但可能存在特定于语言类别的设计模式。
例如,可能存在特定于函数式语言的函数式设计模式或特定于面向对象语言的面向对象设计模式。可能存在一些重叠,但不是 100%。
【讨论】:
这是为了给出一个直截了当的答案。
一方面,一些模式依赖于语言,像工厂、策略和模板这样的模式依赖于多态和继承等语言机制。
另一方面,存在一些模式是因为我们使用的语言没有正确的功能(例如:访问者模式用于弥补 Java 和 C++ 等语言中双重调度的不足)。
【讨论】:
设计模式本质上并不是特定于语言的,尽管某些模式在某些语言中比其他语言更有用。
【讨论】:
不,他们不是。它们是一种抽象,通常可以应用于面向对象的语言。
【讨论】:
设计模式往往特定于特定的编程范式。就许多(大多数?)语言支持多种范式而言,给定的设计模式可以适用于完全不同的语言。
那么,什么是特定于语言的模式?实现模式通常被称为惯用语。
请参阅:https://softwareengineering.stackexchange.com/questions/106815/difference-between-idiom-and-design-pattern。
【讨论】: