我已经开始阅读GoF的设计模式书。有些模式看起来非常相似,只是概念上的差异很小。
您是否认为在许多模式中,在像Python这样的动态语言中,有些是不必要的(例如,因为它们已被动态功能替代)?
我已经开始阅读GoF的设计模式书。有些模式看起来非常相似,只是概念上的差异很小。
您是否认为在许多模式中,在像Python这样的动态语言中,有些是不必要的(例如,因为它们已被动态功能替代)?
Answers:
彼得·诺维格(Peter Norvig)展示了GOF书中发现的23种设计模式中的16 种在动态语言中是不可见的或更简单的(他专注于Lisp和Dylan)。
自从您提到Python以来,Alex Martelli对该主题做了很好的介绍。也与Python有关,有一篇不错的博客文章,演示了惯用的Python中的六种设计模式。
我还保留了一个github存储库,其中包含(由其他人执行)Python中最常见的设计模式。
无需任何设计模式。任何语言。
我倾向于遇到很多人,他们阅读了设计模式,然后认为他们应该在各处使用它们,从而编写了许多代码。结果是实际的代码被埋藏在大量的接口,包装器和层下,并且很难阅读。这是设计模式的错误方法。
存在设计模式,以便在遇到问题时可以方便地使用一些有用的惯用语。但是,在确定问题之前,切勿应用任何模式。保持简单愚蠢永远是最高的管理原则。
它还有助于将设计模式视为思考问题的概念,而不是要编写的特定样板代码。而且,作为Java的变通办法,很多样板都缺少在大多数具有其他功能的其他语言(例如Python,C#,C ++等)中使用的免费功能和标准功能对象。
我可能会说我有一个访问者模式,但是在任何具有一流功能的语言中,它都只是一个带有功能的功能。除了工厂类,我通常只有工厂功能。我可能会说我有一个接口,但是那只是用注释标记的几个方法,因为不会有其他实现(当然在python中,接口总是只是注释,因为它是鸭子类型的)。我仍然将代码称为使用模式,因为这是一种考虑模式的有用方法,但是在我真正需要它之前,不要真正键入所有内容。
因此,将所有模式学习为概念。忘记具体的实现。在现实世界中,即使只是在Java中,实现也有所不同,并且应该有所不同。
在鸭子类型的语言(例如Python)中,抽象工厂模式是不必要的,因为它实际上已内置在该语言中。
想到的唯一一个就是Singleton模式。
由于Python不会强制您对所有内容都使用类,因此您只能使用全局数据结构。该全局数据结构可以由一个实例管理,但是您不必控制该类的实例化,只需在import上创建实例,然后将其保留在该实例上即可。
通常,python中的Singleton被模块替换。python中的模块本质上就是Singletons。python解释器只会一次创建一次。
我曾经在Python中一次或多次使用过的Design Patters中的所有其他模式,您会在整个Python标准库和Python本身中找到它们的示例。
len
工作的。Guido在这里做出了明确的选择。我的观点是证明Python不是纯OOP语言。这是一种实用的语言。我喜欢这样。
设计模式是针对程序员的,而不是针对语言的。程序员倾向于使用模式来帮助他们理解手头的问题。绝对没有必要使用设计模式,但是可以使用它来简化您尝试做的事情。
Python(特别是鸭子类型)确实提供了许多常见模式和实践的终结,并且某些模式(隐私,不变性等)带来的许多限制仅在程序员同意不破坏它们的范围内成立。 。但是,只要程序员参与其中,它们就可以工作。即使是假想的墙壁将门框住,门仍然是一扇门。
Python被认为是“多范式”语言。您可以使用所需的任何模式。这是故意的。例如,它提供了复杂的类层次结构,即使它们是完全不必要的并且有些人为的。但是对于某些人来说,特定的抽象是有帮助的。不是因为问题需要它,而是因为程序员需要。所以你去了。
最初的“设计模式”书记录并命名了一些常见的惯用法,这些惯用法在命令式,面向对象的语言(例如C ++和Smalltalk)中有用。但是Smalltalk是一种动态类型的语言,因此严格来说,它不是动态的。
但是,您的问题的答案仍然是“是”:其中一些设计模式与现代动态类型化语言无关。更一般地,将有不同语言的不同设计模式,尤其是不同种类的语言。
重申一下:“设计模式”只是编程习惯用语的名称:解决常见问题的常用解决方案。不同的语言需要不同的习惯用法,因为一种语言的问题对另一种语言可能是微不足道的。从这个意义上讲,设计模式倾向于指出它们所应用的语言中的弱点。
因此,您可能会寻找其他功能,这些功能使现代动态语言(或诸如Lisp之类的古老语言)更强大,从而使某些经典设计模式变得无关紧要。