功能风格的对象模型?

时间:2011-04-28 08:33:38

标签: user-interface f# functional-programming object-model

在功能样式中实现对象模型是否实用?

OOP似乎擅长的一个问题是描述对象模型。

例如,HTML DOM是一个复杂的,有状态的野兽,它直接与UI 接口,而需要动态语言的可编程性。 OOP功能往往在很多方面都有用:

  • 会员访问限制与不受信任的代码(例如javascript)安全
  • 进行交互
  • 访问者功能和属性使得绑定到UI更加方便
  • 不必一直传递对象模型使方法更简单。

如果您通过MVVM投影模型,故事的UI方面可能有点没有实际意义,但您仍然在内部不断与国家进行斗争。

我正在F#中为这个项目工作,所以我可以很容易地使用OOP,但我很好奇我可以在它变得不切实际之前推动它多远。是否有设计模式或任何东西?

1 个答案:

答案 0 :(得分:5)

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

在我看来,问题的出现是因为你认为FP和OO是并列的,但事实并非如此。 FP和命令式编程是并列的,即使用表达式与使用语句。

部分问题在于OO缺乏明确的定义,无论如何我认为。为了支持这一点,我指的是Alan Kay,他说:“其实我用”面向对象“这个术语,我可以告诉你我没有考虑到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/