一些设计模式是否依赖语言?

时间:2011-09-08 05:34:37

标签: c++ design-patterns

如果是,那么是否有一些专门应用于C ++的模式,有些则不是? 如果有的话,他们是哪一个?我指的是这些设计模式:http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29

5 个答案:

答案 0 :(得分:5)

RAII是一个强大的模式,它依赖于C ++的范围清理机制。在垃圾收集环境中,通常缺少此语言功能。其他语言(例如Ruby)有其他使用用户提供的控制流结构的方法。

答案 1 :(得分:3)

我不确定除了“是”之外是否还有其他答案。

如果设计模式依赖于与语言无关的对象行为,则可以跨语言应用相同的DP。

但是,如果设计模式依赖于某些语言功能,那么将其翻译成另一种语言需要付出一些努力或者是不可能的。由于特定语言的某些特征(但在其他语言中不需要),某些模式可能会存在。

人们总是提出模式。是的。

答案 2 :(得分:1)

我认为这里最好的答案是“它取决于”,因为模式的概念有一些模糊的界限。

如果您愿意说“C ++虚拟功能”或“Java界面”是一种“模式”,那么,您默认情况下会提出一种“模式”,该模式仅适用于一种语言,但不包括所有其他人。鉴于模式只是解决可以在不同环境中应用的问题的一种方式,你可以从技术上论证单语言模式在理论上可以存在。

然而,术语“模式”的常见用法比特定的语言特征略微抽象。我认为大多数人都同意的是,某些语言系列特有的模式,家庭可能非常小,例如支持OO的语言,支持演员,支持基于频道的语言沟通等。

当你的模式变得如此特殊以至于它应用的语言系列一直到一种语言时,你会进入模糊区域,人们可能会对某些东西是模式还是语言特征进行狡辩。这里的理由是“很好,不能有人只是根据这种语言创建另一种语言,这样模式也适用于派生语言?”

然而,如果你可以合理地论证你所谓的模式确实是解决可以在不同环境中使用的问题的一种方式,并且没有其他编程语言可以合理地实现这个解决方案,那么你可以说是。

....直到某人创造了这种方言! : - )

答案 3 :(得分:1)

最值得注意的方法是尝试范式转换。例如,将Java(OO)与Haskell(Functional)进行比较。

让我们用Java中的Flyweight模式。在Haskell中,它是一个明白无误的数据(它是不可变的)是隐式共享的。

其他示例:命令模式。 Haskell支持一流的函数(和curryism),命令是内置的。

有些人认为DP的存在是为了涵盖语言不能以内置方式提供的内容。从这个意义上讲,语言越高,嵌入的DP越多。

答案 4 :(得分:0)

使用特定语言功能的模式,如C ++中的Multiple Inhertance,像Reflections这样的动态行为完全取决于语言。 GoF设计模式被认为是大多数模式的基础,但随着时间的推移,系统变得更加复杂和分布。因此,基本的设计模式和原则得到了发展和扩展。 Web框架和库是实现真实场景以满足开发人员/用户需求的最佳示例之一。像动态页面生成,AJAX等。但我认真地认为,模式必须是通用的,不应该依赖于语言。

例如,如果您使用太多依赖于PHP的模式,可能无法帮助他们切换到其他动态语言,如Python。通用/通用实现可以在大多数语言中轻松实现。