非OOP设计模式?[关闭]


70

我只听说过“设计模式”一词用于面向对象的代码,而GoF模式仅包括OOP设计模式,但是设​​计模式是解决常见编程问题的绝佳解决方案,对吗?那里没有什么说他们必须限于OOP,是吗?

我想看到一些面向对象编程领域之外的设计模式示例。你有什么?甚至存在吗(没有一本书籍,像GoF书籍一样,必须一定要写出来,才应该使用;就足够了​​)?

它们可能特定于某些编程语言,但是一般的(范例级别)模式是首选的,而其他模式则不是面向对象的。


8
我认为,流行的设计模式书最大的危害是使一大群人相信模式仅适用于面向对象的语言。创建模式是值得商bat的,但是几乎所有其他模式都可以并且一直没有面向对象的语言来实现。我确信这种副作用不是作者的意图,而是一种副作用。
Pemdas 2011年

14
好吧,对象是非OO语言的设计模式:)
back2dos

1
甚至更糟的是,模式书创建了一个全班的人,他们相信应该通过应用特定的模式来解决所有问题(通常是最后一个模式是由一些自己也相信相同的学校老师教给他们的)。
jwenting 2014年

Answers:


25

12

实际上,这是一个悖论-最受欢迎的Non-OO模式之一是...“ Class”。

因为OO是在非OO语言中发明的,所以开发人员不得不对其进行仿真(并且他们现在甚至还在做)-因此,这种模式就诞生了。LISP和C就是这样的例子。

但是请听取我的建议:不要犯常见的错误-不要仅仅因为它很酷就使用模式,您需要认真的理由来证明使用模式的合理性(至少是OO模式)。

以命令模式为例-尽管它很好,并且可以将调用者与接收者分离,但是除非您实际需要,否则不应该使用它-因为操作应使用动词表示-这意味着方法。并在所有地方使用命令,最终会得到一堆完全去中心化的OO lambdas->对于许多策略来说同样如此。


11

“设计模式”实际上是“变通方法”的委婉说法。发明设计模式是为了解决OO语言的缺点和缺陷。例如,采用迭代器模式,该模式最终导致Java集合的引入。Groovy通过将它们转换为语言功能而摆脱了许多其他模式:您不再需要装饰器模式,因为您可以向Groovy中的现有类添加方法。

这意味着您可以在任何地方找到设计模式。实际上,每个“最佳实践”都可以视为设计模式的简单形式。


9
同意!从保罗·格雷厄姆“例如,在面向对象世界里,你听到一个好交易‘模式’[...]当我看到我的节目模式,我认为这是一有风吹草动程序的形状应该反映。代码中的其他任何规律性至少对我来说是一个信号,即我正在使用不够强大的抽象,这通常是我手工生成一些宏的扩展我需要写。”
Andres F.

7
我不同意设计模式是一种解决方法。两者是相反的。解决方法是将短期补丁放在一起以绕过特定障碍。设计模式是长期可重用的解决方案。装饰器模式的目的是在功能上“无需”修改类。您可以在对象不知道的情况下在其上放置不同的装饰器。
Despertar

之所以将模式视为“解决方法”,是因为装饰对象应该是语言的功能。相反,我们必须编写许多行代码来实现此目的。例如,迭代器模式已成为许多现代语言的一部分。对于较旧的OO语言,您需要跳几个圈来模拟它们。
亚伦·迪古拉

@AaronDigulla我不明白为什么您认为装饰器之类的模式是如此繁重的实现。您正在谈论几行代码。一个类包含另一个类,并使用一些附加功能将请求转发给它。它使用继承和组合的方式使调用装饰对象等同于调用对象本身。我认为这种透明度是一种优势。这使您可以在运行时换出装饰器。当您说groovy不需要装饰器时,因为它可以将方法添加到类中,这听起来像您错过了要点。
Despertar

2
迭代器模式尚未被现代语言中的任何新语言功能所取代。它只是带有常见集合的默认实现。仅因为它具有默认实现,并不意味着未在使用该模式。如果您编写自己的集合,则必须自己实现。
Despertar

10

LTU提到的是杰里米·吉本斯被写在函数式编程书上的图案。请查看Gibbon先生的“函数式编程中模式”博客,以获取一些帮助。请注意,他建议从旧到新阅读他的文章。

他的论文《作为高级数据类型通用程序的设计模式》(pdf)在功能上模拟了四种模式的组合:复合,迭代器,访问者和生成器。他描述了折纸编程中具有递归方程的编程模式(折叠和展开)。



7

除了命名非oo设计模式之外,我还想给您提供一些具有许多设计模式的书籍示例(其中某些模式仍然是面向对象的):

希望这可以帮助


这些也是我会推荐的,再加上Hohpe&Woolf的企业集成模式
TMN

Fowler的模式非常面向对象:)
David Conde

@David Conde :)它们大多数是纯OO,它们都是以OO方式编写的,但其中一些也适用于非OO:请查看“ Web演示模式”,“会话状态模式”,“分发模式”。 “
KeesDijk 2011年




0

我喜欢将数据结构(例如队列,链接列表,树,图形等)视为模式。他们定义了某些模式来存储数据并进行处理。与“四人帮”的高端模式相比,它们看起来很原始,但仍然是模式。我的意思是,如果有人将堆栈实现为FIFO而不是LIFO,反之亦然,将队列命名为FIFO,又会如何呢?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.