【问题标题】:Are Design patterns specific to Language or Technology?设计模式是特定于语言还是技术?
【发布时间】:2011-02-01 09:34:48
【问题描述】:

这里的问题是特定于编程语言或技术的设计模式,

就像你只能在 C#、Java 中做复合模式,但不能在 VB6.0 中。这是真的吗,如果是,那是什么模式不能用面向对象的编程语言来实现。

【问题讨论】:

    标签: design-patterns programming-languages


    【解决方案1】:

    在经典的“四人帮”模式中,有不少是特定于语言的。其他的,如访问者,仅在面向对象的环境中才真正有用。函数式语言有fold(catamorphisms)而不是Visitor,任何试图在函数式语言中使用Visitor的人都会被视为危险的疯子。最后,还有一些模式可以应用于任何语言,比如 Factory。

    我不喜欢 Gamma 等人实践的模式运动的原因之一是模式的观点缺乏知识上的连贯性。 “任何有用的东西”是一个很好的主张,但正如您所观察到的那样,它并没有提供太多指导,说明在语言或范式发生变化时哪些模式可能仍然有用。

    要了解对模式进行分类所固有的风险,请查看我最喜欢的系列之一:Kent Beck 的 Smalltalk Best Practice Patterns。尽管标题中有“Smalltalk”,但许多程序员发现这些模式也适用于 Java 和 Python 等语言。

    【讨论】:

    • GoF 模式都不是特定于语言的。 “都可以用标准的面向对象语言实现,”(前言 p. xi)。另一方面,所有 GoF 模式都是特定于范式的,因此本书的副标题是“可重用的面向对象软件的元素。”
    【解决方案2】:

    模式取决于编程语言,尽管不像您的问题所暗示的那么强烈。例如,迭代器是一种设计模式,但在许多语言(C++、Java、C#)中,它是语言的一部分(好的,类库)。

    有几种模式可以称为面向对象,即如果没有适当的类、继承和多态性,就很难实现它们。示例:抽象工厂、策略、模板方法。但是,即使这些也可以在例如C,如果有人真的想要。这是可能的,因为 C 有函数指针。尽管我很难想象在没有指针(或等效)支持的情况下以非 OO 语言实现上述模式。话又说回来,我猜这些模式在这样的语言中并没有真正的意义......

    【讨论】:

    • 作为推论,大多数设计模式实际上是语言中缺少的功能的替代品。例如,战略和指挥是缺乏一流功能的解决方法。 Wikipedia 的带有块的 Ruby 策略示例完美地说明了这一点(请记住,块只是匿名函数的一种特殊语法)。 Composite 是缺少通用函数的一种解决方法,如 Wikipedia 在 Common Lisp 中的示例所示。我怀疑可以通过这种方式将大多数设计模式与语言特性相匹配。
    • Mark Dominus 的一篇颠覆性文章说明了@Zak 的观点 - blog.plover.com/prog/design-patterns.html
    【解决方案3】:

    设计模式本身并不是特定于语言的,但是有些模式可以是特定于范式的,例如在 C 中实现单例模式没有任何意义,因为您最好只编写一个普通的旧模块。

    但是设计模式不是特定于语言的,但在不同的范例(OO vs结构化 vs 功能)中可能更有用或更有意义

    【讨论】:

    • 这是最好的答案。语言和范式之间的区别是关键,其他答案似乎忽略了这一点。请注意,GoF 书的封面上写着“面向对象的软件”。如果这些模式不适用于函数式编程,这不足为奇!
    【解决方案4】:

    我认为这更多地取决于您可以使用哪些语言功能,但不,我不会说设计模式仅限于特定语言。

    【讨论】:

      【解决方案5】:

      大多数模式都与语言无关。对于某些模式和语言,需要主要的hackery。例如,windows COM 是 C(不是 C++)语言中复合模式的奇异实现。

      像 VB 6.0 这样的一些语言设置了需要跳过才能实现某些模式的主要障碍,因此不值得努力。

      【讨论】:

        【解决方案6】:

        是的,不是的。某些设计模式并非特定于特定语言,但可能存在特定于语言类别的设计模式。

        例如,可能存在特定于函数式语言的函数式设计模式或特定于面向对象语言的面向对象设计模式。可能存在一些重叠,但不是 100%。

        【讨论】:

          【解决方案7】:

          这是为了给出一个直截了当的答案。

          一方面,一些模式依赖于语言,像工厂、策略和模板这样的模式依赖于多态和继承等语言机制。

          另一方面,存在一些模式是因为我们使用的语言没有正确的功能(例如:访问者模式用于弥补 Java 和 C++ 等语言中双重调度的不足)。

          【讨论】:

            【解决方案8】:

            设计模式本质上并不是特定于语言的,尽管某些模式在某些语言中比其他语言更有用。

            【讨论】:

              【解决方案9】:

              不,他们不是。它们是一种抽象,通常可以应用于面向对象的语言。

              【讨论】:

              • 其他编程范式有自己的设计模式。这不仅仅是 OOP。
              【解决方案10】:

              设计模式往往特定于特定的编程范式。就许多(大多数?)语言支持多种范式而言,给定的设计模式可以适用于完全不同的语言。

              1. 首先,请注意实现给定的简单 不同语言中的模式可能会有很大差异,具体取决于 每种语言的特点。
              2. 其次,请注意,一种模式可能非常有用/流行/必要,以至于一种语言直接实现它,无需开发人员这样做。

              那么,什么是特定于语言的模式?实现模式通常被称为惯用语
              请参阅:https://softwareengineering.stackexchange.com/questions/106815/difference-between-idiom-and-design-pattern

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-06-01
                相关资源
                最近更新 更多