OO编程文献中充满了设计模式。大多数有关面向对象程序设计的书都专门用一两章来设计诸如工厂和装饰器之类的模式。那么功能语言中的等效模式是什么?为什么还没有人写过有关它们的书?关于功能语言,有什么特别的东西可以消除对设计模式的需求?
OO编程文献中充满了设计模式。大多数有关面向对象程序设计的书都专门用一两章来设计诸如工厂和装饰器之类的模式。那么功能语言中的等效模式是什么?为什么还没有人写过有关它们的书?关于功能语言,有什么特别的东西可以消除对设计模式的需求?
Answers:
OO和功能编程是两种截然不同的编程范例,而设计模式(DP)是OO设计和编程的重要组成部分。DP在函数式编程中不起作用。
甚至可以说,在函数式编程中不需要使用DP - DP可以解决任何问题。
有人可能会说设计模式是编程语言中缺少功能的标志。
彼得·诺维格(Peter Norvig)发现,在《设计模式》一书中的23个模式中,有16个在Lisp或Dylan中为“ 不可见或简单 r”。
“许多模式暗示着面向对象或更普遍的可变状态,因此可能不适用于功能编程语言,在这些语言中数据是不可变的或如此。” - http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29
杰里米·吉本斯(Jeremy Gibbons)正在写这本书。在完成之前,您可以阅读他的博客“函数式编程中的模式”。他建议阅读从最旧到最新的文章。
也浏览他的出版物。他以高阶数据类型通用程序的形式介绍了设计模式中的四种模式组合,并介绍了折纸编程中具有递归方程式的编程模式(折叠和展开)。
一个简单的事实是,许多OO模式将被视为功能语言中的惯用语(尤其是原始的GoF模式)。例如,在具有序列运算符的Lisp或ML中,不需要迭代器模式(现在已内置到C#这样的语言中)。
我们在OO系统中使用的许多模式都可以帮助我们消除“非本质”问题,因此我们可以专注于编码对象。换句话说,这些模式是应用程序不感兴趣部分的解决方案。我们应该利用模式来解决以前已经解决的常见需求(例如,企业应用程序体系结构的Fowlers模式中的模式用于处理数据库传输之类的内容,或者xUnit模式中的模式用于增强单元测试的能力),以便我们可以专注于增加业务价值为应用程序。
我敢肯定,除了GoF模式的细节之外,还有一些设计模式也将适用于函数式编程。事实是,OO是主导范式。编写针对功能开发人员的模式书...坦率地说,发行商不会开绿灯。这就是归结为。对于功能性模式,没有足够的市场来提供大量有关该主题的书籍。
斯图尔特·塞拉(Stuart Sierra)在这个话题上做了很好的演讲(〜45分钟):
http://www.infoq.com/presentations/Clojure-Design-Patterns
不一定具有约束力和权威性,但是我根据自己使用FP进行数据分析的经验认识到他的许多示例。
用Clojure编写的示例,但可能适用于任何FP语言。他为所涵盖的模式提供的名称是:
如果您真的对学习设计模式感兴趣,那么Haskell就是您的最佳选择。如果您花时间以艰难的方式学习语言,那么您就会陷入困境,并且对大多数基本模式都感到满意-它们已经融入了语言。
不要跳过单子。那里有很多冗长的解释,需要花一些时间才能使想法沉浸其中,但是如果您不停地插话,最终它就会冒出来,您会惊讶于可以设计出多少种设计模式建立在这一抽象/接口之上。
一旦掌握了Haskell,就会有足够的FP武器库可供使用,以免发生危险。重点是,坚持下去直到得到它。没有捷径。
就FP的设计方法论而言,就是要设计您的类型以准确反映问题空间,并且实现应自动遵循,FP相当于一本有关设计模式的书,就像Chris Okasaki的Purely Functional Data Structures。