功能性编程与面向对象编程
到目前为止,我主要面向OO编程,并期待学习一种功能性语言。 我的问题是:
你什么时候选择面向对象的函数式编程?
当你预计一种不同类型的软件演变时:
面向对象的语言当你对事物有一组固定的操作时是很好的,随着你的代码的发展,你主要增加新的东西。 这可以通过添加实现现有方法的新类来实现,并且现有的类都是独立的。
当你有一组固定的东西时,函数式语言是很好的,随着代码的发展,你主要在现有的东西上添加新的操作。 这可以通过添加使用现有数据类型进行计算的新功能来完成,而现有的功能则单独存在。
当进化错误时,你会遇到问题:
将新操作添加到面向对象的程序可能需要编辑许多类定义以添加新方法。
为功能程序添加新的功能可能需要编辑许多功能定义来添加新的功能。
这个问题已经有很多年了, 1998年,菲尔瓦德勒将其称为“表达问题”。 尽管一些研究人员认为表达式问题可以用mixin这样的语言特征来解决,但一个广为接受的解决方案尚未成为主流。
函数式编程是一个更好的选择,典型的问题定义是什么?
函数式语言擅长以树形式操作符号数据。 一个最喜欢的例子是编译器,源代码和中间语言很少发生变化(大多数情况是相同的),但编译器编写者总是添加新的翻译和代码改进或优化(对事物进行新的操作)。 编译和翻译更一般地是功能语言的“杀手级应用程序”。
你不一定必须在两种范例中进行选择。 您可以使用许多功能概念编写具有OO体系结构的软件。 FP和OOP本质上是正交的 。
以C#为例。 你可以说它主要是OOP,但是有许多FP概念和构造。 如果你考虑Linq ,允许Linq存在的最重要的构造本质上是功能性的: lambda表达式 。
另一个例子,F#。 你可以说它主要是FP,但是有很多OOP概念和结构可用。 你可以定义类,抽象类,接口,处理继承。 您甚至可以在使代码更清晰或显着提高性能时使用可变性。
许多现代语言是多范式的。
推荐读物
因为我在同一条船上(OOP背景,学习FP),所以我建议你阅读一些我非常感谢的内容:
Jeremy Miller 撰写的“日常.NET开发的函数式编程” 。 一篇很棒的文章(虽然格式不佳)显示了许多C#上的FP技术和实际实例。
真实世界的功能编程 ,Tomas Petricek。 一本介绍FP概念的好书,试图解释它们是什么,什么时候应该使用。 F#和C#中都有很多例子。 另外,Petricek的博客是一个很好的信息来源。
面向对象编程提供:
函数式编程,在Haskell中,甚至在Scala中,都可以允许通过更一般的类型类机制进行替换。 可变的内部状态是不鼓励或禁止的。 也可以实现内部表示的封装。 请参阅Haskell与OOP进行比较。
诺曼的断言是“为功能程序添加一种新的东西可能需要编辑许多函数定义来添加新的情况。” 取决于功能代码如何使用类型类。 如果特定抽象数据类型上的模式匹配遍布在代码库中,那么确实会遇到这个问题,但这可能是一个糟糕的设计。
EDITED讨论类型类时删除了对隐式转换的引用。 在Scala中,类型类使用隐式参数进行编码,而不是转换,尽管隐式转换是实现兼容类型替换的另一种方式。
链接地址: http://www.djcxy.com/p/3915.html