2011-04-28 53 views
6

以功能性风格实现对象模型是否切合实际?功能风格的对象模型?

的一个问题是OOP似乎在被描述的对象模型到Excel。例如,HTML DOM是一种复杂的有状态的野兽,其直接与UI 需要动态语言的可编程性。 OOP的特点往往会有用在很多方面:

  • 成员访问限制使非信任的代码程序接口(如JavaScript)的安全
  • 存取器的功能和性能使更方便绑定到UI
  • 无需一直传递对象模型使得方法变得更简单。

如果您通过MVVM投影模型,故事的UI方面可能有点模糊,但您仍然经常在内部摔跤。

我在F#工作了这个项目,所以我可以很容易地诉诸OOP,但我很好奇,它变得不切实际之前,我可以在多大程度上推动它。有没有设计模式或任何东西?

+0

OCaml,F#,CLOS,Clojure,Haskell和Scala - 加上Erlang等其他语言中所有面向对象的成语...是的,我会说它对他们很好。 OOP不必操纵状态,主要是(在我的脑海中)组织和干预。 – 2011-04-28 08:37:12

+0

我已经看到它与Leskah完成了,我查看了代码,但不幸的是现在它已经超出了我的范围。我也没有真正了解如何在不放弃DRY的情况下实现功能,结果难以维护的代码和/或驱使第三方插件/脚本作者疯狂。 – 2011-04-28 08:42:24

+4

DRY在功能语言上比OO更容易,因为在FP中,将任何重复代码重构为带参数的函数是微不足道的。在OO(或者程序编程)中,重复的代码是preamble和postamble,它们与中间的位相同,不同之处在于你开始考虑关于基类或者接口,在FP中,你不是中间的位就变成了作为参数的函数。托马斯的书有这样的很好的例子:http://www.manning.com/petricek/ – Robert 2011-04-28 10:58:29

回答

5

这是一个有点哲学有一个“正确”的答案,但我没关系会咬。

在我看来,问题就来了,因为你考虑FP和面向对象是并列,他们不是。 FP和命令式编程并置,即使用表达式与使用语句。问题的

部分是OO在我看来,缺乏一个明确的定义,也无妨。为了支持这一点,我指向艾伦凯,他说:“其实我编造了”面向对象“这个术语,而且我可以告诉你我没有考虑C++。”但是大多数语言我们认为是OO,即java/C#在C++之后比Smalltalk多一些。

什么OO C++/java/C#风格确实给我们提供了一个很好的方式来将我们的代码组织到模型中,创建数据包含向他们添加属性等。非此功能实际上无法使用,并且可以很好地用于功能节目。当你指出很多C++/java/C#往往是有状态的,但它们不一定是,java和C#都有基本类型,比如它们的字符串类是不可变的。这是真的,Java和C#不会轻易创建不可变的类,但只需付出一点努力就可以完成。

这给我们带来那里是不可改变挪用?在我的设计中,通常先让所有东西都是不可变的,因为这样可以让事情更容易,如果我发现这会导致性能问题,我会在关键路径上添加一些可变性。一个地方不变性永远不会工作的GUI控件,它通常包含太多的状态是不可改变的。话虽如此,您可以使用不可变的“组合器”方法获得构建GUI的相当长的路径,然后由可变的gui控件进行解释。这或多或少是WebSharper家伙所做的:http://www.intellifactory.com/products/wsp/Home.aspx

FP/OO辩论的另一个很好的资源是Brain的“功能编程如何影响你的代码结构?”(这极大地影响了我对FP/OO的思考):http://lorgonblog.wordpress.com/2008/09/22/how-does-functional-programming-affect-the-structure-of-your-code/

+0

谢谢,组合方法可能是我正在寻找的。我把FP放在OOP的另一端的原因是因为Rafe指出,OOP提供了许多不像FP那样简单的组织特性(对我来说,无论如何 - 这就是我问的原因)。另外,当我将对象模型暴露给插件作者时,我想确保消费者不会将模型置于无效状态 - 我不确定是否容易确保非OO样式,包括FP 。我也读过Brian的帖子,但我之所以再问一次,是因为Brian仍然在鼓励OO。 – 2011-04-28 22:16:17

+0

是的,我同意大型面向对象是一件好事,但大多数FP语言也有一套很好的面向对象功能,包括帮助您组织代码的功能。我花了不少时间用C#和F#编程,我发现C#缺少一些我觉得在F#中有用的特性,模式匹配,联合类型只有一对,但反过来似乎并不正确。我认为,如果你能想出更多具体的OO方便但FP语言不可用的例子,那么辩论会更有用。 – Robert 2011-04-29 11:44:46

+0

嗯,我从来没有打算将它作为一个辩论,但是 - 例如,我想不出一种明显的方式来对不可变对象进行数据绑定。 – 2011-04-30 03:41:59