在功能样式中实现对象模型是否实用?
OOP似乎擅长的一个问题是描述对象模型。
例如,HTML DOM是一个复杂的,有状态的野兽,它直接与UI 接口,而需要动态语言的可编程性。 OOP功能往往在很多方面都有用:
如果您通过MVVM投影模型,故事的UI方面可能有点没有实际意义,但您仍然在内部不断与国家进行斗争。
我正在F#中为这个项目工作,所以我可以很容易地使用OOP,但我很好奇我可以在它变得不切实际之前推动它多远。是否有设计模式或任何东西?
答案 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/