功能风格的对象模型?

Rei*_*aka 6 user-interface f# functional-programming object-model

在功能样式中实现对象模型是否切实可行?

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

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

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

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

我在这个项目的F#工作,所以我可以轻松地使用OOP,但我很好奇我能在多大程度上推动它变得不切实际.是否有设计模式或任何东西?

Rob*_*ert 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 /如何-做功能编程,影响最结构的-你的代码/