功能性、动态和面向方面编程的模式
功能性、动态和面向方面编程的模式
我们有一本非常好的GoF书(Design Patterns: Elements of Reusable Object-Oriented Software),讲述了面向对象编程中的模式,网络上也有很多关于这个主题的文章和资源。
那么,有没有关于函数式编程模式(最佳实践)的书籍(文章,资源)呢?
对于像Python和Ruby这样的动态编程语言?
对于AOP?
GoF所描述的设计模式列表是为像C++和Java这样的语言编写的。它有时被认为是为了使不灵活的语言更具动态性而编写的解决方法列表。例如,如果你使用Ruby,你不真正需要访问者模式,因为你可以在运行时简单地向类添加成员函数。如果你可以使用混合,那么装饰器模式就是过时的。\n\n我的经验是,在实现C++中的解决方案时,我往往花费大部分时间编写脚手架代码。我开始创建一个平台,使我能够在应用程序的程序域内思考。设计模式可能是为了将不同类型的脚手架归类而开发的。\n\n我应该提到,在Ruby中编程时,我没有太多的支持代码。似乎根本不需要。\n\n我的理论是,其他语言不强调设计模式的概念,只是因为他们的基本语言构造足够了。在Java和C++的辩护中:也许这是因为函数式和AOP语言通常用于更特定的问题领域或利基,而Java和C++则用于所有领域。\n\n现在来点不同的。如果你对面向对象的设计有些无聊,想学点新东西,那么你可能会对由Stepanov写的Elements of Programming这本书感兴趣。在这本书中,他解释了如何从数学的角度来考虑编程。欲了解预览,请查看他为Adobe撰写的Class notes(可在此页面等其他页面上找到)。您还可能对Adobe的Collected Papers感兴趣。
之前有一个相关的问题被提出过:“函数式编程是否可以代替GoF设计模式”,有很多回复。\n\n在FP中,“设计模式”的等效物很模糊不清。一般来说,每当你在代码中看到一个“模式”时,你应该创建一个能够统一处理其所有用例的东西。通常它会是一个高阶函数。\n\n例如,下面的C代码:
for (int i = 0; i < n; i++) if (a[i] == 42) return true; return false;
可以被认为是一种基本的“设计模式”——检查列表中是否有某个特殊元素。这个片段可能会在不同条件下出现多次。在FP中,你仅仅使用高阶函数几次即可。它不再是一个“模式”。\n\n函数式编程有其自己的实践方法,但它们与OOP中的“设计模式”有很大区别。它们包括使用多态性、列表、高阶函数、不变性/纯函数、惰性(并非所有都是FP的本质或特有的)等。同时,还有类型类(Haskell)、模块与导出(OCaml)、continuations、单子、zippers、finger trees、monoids、arrows、applicative functors、monad transformers、许多纯函数数据结构(book)等。已经由Randall Schulz提到的“Functional pearls”是FP最好的资源之一。\n\n要学习如何编写惯用代码,任何函数式编程语言的书籍/资源都足够了(例如RWH和LYAH);在那里总是会解释怎样从命令式思维转向函数式思维。\n\n在动态语言中,Jeff Foster的链接是一个良好的集合;在JavaScript中,这里是一种非常巧妙地使用记忆化的方法,可以被认为是一种“设计模式”。