首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数编程与面向对象编程

函数编程与面向对象编程
EN

Stack Overflow用户
提问于 2010-01-16 21:35:48
回答 4查看 293.1K关注 0票数 842

到目前为止,我主要接触到OO编程,并期待学习一种函数式语言。我的问题是:

  • 你什么时候选择函数式编程而不是面向对象?
  • 什么是典型的问题定义,其中函数式编程是一个更好的选择?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-17 01:47:29

你什么时候选择函数式编程而不是面向对象?

当您预料到不同类型的软件进化时:

  • 当您对事物有固定的操作集时,面向对象的语言是很好的,并且随着代码的发展,您主要添加新的东西。这可以通过添加实现现有方法的新类来实现,而现有的类则不受影响。
  • 当您有一组固定的事物时,函数式语言是很好的,并且随着代码的发展,您主要对现有的事物添加新的操作。这可以通过添加使用现有数据类型计算的新函数来实现,而现有的函数则不受影响。

当进化走错方向时,你就会遇到问题:

  • 向面向对象的程序添加新操作可能需要编辑许多类定义来添加新方法。
  • 向函数程序添加一种新的东西可能需要编辑许多函数定义来添加新的情况。

这个问题多年来一直是众所周知的;1998年,菲尔·瓦德勒称其为“表达问题”。。尽管一些研究人员认为混合语言等语言特征可以解决表达问题,但一个被广泛接受的解决方案尚未进入主流。

什么是典型的问题定义,其中函数式编程是一个更好的选择?

函数语言擅长以树的形式处理符号数据。另一个最受欢迎的例子是编译器,在编译器中,源代码和中间语言很少发生变化(大多数情况相同),但是编译器编写人员总是添加新的翻译和代码改进或优化(对事物的新操作)。更普遍的编译和翻译是功能语言的“杀手应用程序”。

票数 1.3K
EN

Stack Overflow用户

发布于 2010-01-16 21:39:21

你不一定要在这两种模式之间做出选择。您可以使用许多功能概念使用OO体系结构编写软件。、FP和OOP在自然中是正交的。

以C#为例。您可以说它主要是OOP,但是有许多FP概念和构造。如果考虑 Linq ,允许Linq存在的最重要的构造本质上是功能性的:lambda表达式

另一个例子,F#。您可以说它主要是FP,但是有许多OOP概念和构造可用。您可以定义类、抽象类、接口、处理继承。您甚至可以在代码变得更清晰或显着提高性能时使用可变。

许多现代语言都是多范式的.

推荐读数

由于我在同一条船上(OOP背景,学习FP),我建议你阅读一些我真的很感激的东西:

  • 面向日常.NET开发的函数编程新闻,杰里米·米勒报道。一篇很棒的文章(尽管格式很差)展示了C#上许多技术和实用的、真实的FP示例。
  • 实世界函数程序设计新闻,托马斯·彼得里克著。一本很棒的书,主要讨论FP概念,试图解释它们是什么,什么时候应该使用它们。在F#和C#中都有很多例子。而且,佩特里克的博客是一个很好的信息来源。
票数 191
EN

Stack Overflow用户

发布于 2010-01-17 12:07:10

面向对象编程提供:

  1. 封装,到
    • 内部状态控制突变
    • 内部表示法的极限耦合

  1. 子类型,允许:
    • 兼容类型的替换(多态性)
    • 类之间共享实现的粗略方法(实现继承)

函数式编程,在Haskell中,甚至在Scala中,都可以通过更通用的类型类机制来允许替换。可变的内部状态要么被阻止,要么被禁止。还可以实现内部表示的封装。关于一个很好的比较,请参阅Haskell对OOP

诺曼的断言“向一个功能程序添加一种新的东西可能需要编辑许多函数定义来添加一个新的情况”。取决于函数代码如何使用类型类。如果特定抽象数据类型上的模式匹配分布在整个代码库中,那么您确实会遇到这个问题,但这可能是一个糟糕的设计。

编辑的在讨论类型类时删除了对隐式转换的引用。在Scala中,类型类是用隐式参数编码的,而不是转换,尽管隐式转换是实现兼容类型替换的另一种方法。

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2078978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档