我一直主要是暴露于OO编程迄今为止,我期待着学习的功能性的语言。我的问题是:

  • 当你选择的功能编程的过面向对象?
  • 什么是典型的问题定义编程功能是一个更好的选择吗?
有帮助吗?

解决方案

当你选择的功能编程的过面向对象?

当你预见一种不同的软件的演变:

  • 面向对象的语言是良好的,当你有一个固定的 操作事情, 作为你的代码的演变,主要添加新的东西。这可以通过增加新课程而实施的现有方法和现有的课程单独留在家中。

  • 功能性的语言是良好的,当你有一个固定的 事情, 作为你的代码的演变,主要添加新的 操作 在现有的东西。这可以通过增加新的功能,用来计算现有数据的类型,以及现有的功能单独留在家中。

当演变的方式是错误的,你有问题:

  • 增加一个新的操作面向对象的节目可能需要编辑许多类定义中添加一个新方法。

  • 增加一种新的事功能的程序可能需要编辑许多功能的定义添加一个新的情况。

这个问题已众所周知的许多年;1998年, 菲利浦wadler其称为"表达的问题".尽管一些研究人员认为,表达的问题是可以解决这种语言功能混入,一个被广泛接受的解决方案还没有击中主流。

什么是典型的问题定义编程功能是一个更好的选择吗?

功能性的语言excel在操纵象征性的数据在树的形式。最喜欢的例子是编译器,来源和中级语言的变化很少(主要是相同的 事情),但编译器作家总是添加新的翻译和编码改进或优化(新的操作)。汇编和翻译更多的通常是"杀手级的应用程序"的功能性的语言。

其他提示

你不一定要选择两者之间的模式。你可以写软件与OO构使用多功能的概念。 FP和面向对象是正交的性质.

举个例子。你可以说它主要是面向对象,但也有许多FP的概念和结构。如果你考虑 皇宫, 最重要的结构,允许皇宫存在的功能的性质: lambda表达式.

另一个例子,F#。你可以说它主要是FP,但是还有许多面向对象的观念和结构。你可以定义类抽象的课程,接口,处理继承。你甚至可以使用的变化无常的时候它使你的代码的更清楚,或当它大大提高的性能。

许多现代语言的多的范例。

建议读数

因为我是在同一条船上(面向对象的背景下,学习FP),我建议你一些读数我真的理解:

  • 功能方案的日常生活。净发展, 通过杰里米*米勒。一个伟大的文章(尽管不善的格式)出现了许多技术和实用、现实世界的例子FP上。

  • 真实世界的编程功能, 通过托马斯Petricek.一个伟大的书,主要涉及FP概念,试图解释他们是什么,当他们应可使用。有许多例子中的两F#和C#。此外, Petricek的博客 是一个伟大的信息来源。

面向对象编程提供:

  1. 封装,
    • 控制的突变的内部状态
    • 限制联接内部的表示
  2. 子类型的,允许:
    • 替代可兼容的类型(多)
    • 粗制的手段的共享执行情况之间的课程(执行继承)

编程功能,Haskell,甚至在卡拉,可以允许取代通过更一般的机构的类型的课程。可变的内部状态是不鼓励或者禁止的。封装的内部表现形式也可以实现。看看 Haskell vs面向对象 对于一个很好的比较。

诺曼的断言,即"加入一种新的事功能的程序可能需要编辑许多功能的定义添加一个新的情况。"取决于如何很好的功能码已采用类型的课程。如果模式匹配在一个特定的抽象的数据类型是传播整个一代码,你将确实遭受了这一问题,但是这也许是一个可怜的设计开始。

编辑 除参考的隐性转换在讨论类型的课程。在斯卡拉类型的编码与隐含的参数,而不转换,虽然隐性转换的另一个手段来实现替代的兼容类型。

  1. 如果你在一个严重的并发的环境,那么纯粹的编程功能是有用的。缺乏可变的状态使得并发几乎微不足道的。见爱尔兰.

  2. 在一个多模态语言,则可能需要模型的一些事如果在功能上的存在的可变的状态是必须实施细节,并因此FP是一个很好的模型,用于问题领域。例如,见列表解析在蟒蛇或 std。范围 在D编程语言。这些都是鼓舞的功能程序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top