用函数式实现对象模型有实际意义吗?
OOP似乎擅长的一个问题是描述对象模型。
例如,HTML是一个复杂的、有状态的庞然大物,它直接与UI接口,并且需要动态语言的可编程性。OOP特性在很多方面都很有用:
、
如果您要通过MVVM投射模型,则故事中的UI方面可能会有一点争议,但您仍然在不断地与内部状态进行斗争。
我在F#中为这个项目工作,所以我可以很容易地使用OOP,但我很好奇,在它变得不切实际之前,我能把它推到多远。有没有设计模式什么的?
发布于 2011-04-28 11:47:39
这是一个“正确”的答案有点哲学,但好的,我会咬。
在我看来,问题的出现是因为您认为FP和OO是并列的,但它们并不是并列的。FP和命令式编程是并列的,即使用表达式和使用语句。
部分问题是,OO缺乏一个明确的定义,我认为无论如何。为了支持这一点,我要指出的是,Alan说“实际上是我编造了”面向对象“这个术语,我可以告诉你,我并没有想到C++。”然而,我们认为大多数我们认为面向对象的语言,即java/C#,在C++之后比smalltalk更多。
OO ++/java/C#风格为我们提供了一种很好的方法,可以将我们的代码组织成模型,创建包含添加属性的数据等等。
正如您所指出的,许多C++/ java /C#往往是有状态的,但它们并不一定是有状态的,java和C#都有基本类型,比如它们的字符串类是不可变的。的确,java和C#并不容易创建不可变的类,但只要稍加努力,就可以做到这一点。
那我们到哪里去了不可变的专用呢?在我的设计中,通常从使一切都不可变开始,因为这样可以使事情更容易纠正,而且如果我看到这会导致性能问题,我就开始在关键路径上添加一些可更改性。永久不变永远不会起作用的地方是GUI控件,它通常包含太多的不可变状态。尽管如此,使用不可变的“combinator”方法可以很长的时间来构建GUI,然后由可变的gui控件来解释。这或多或少就是WebSharper这个家伙所做的:http://www.intellifactory.com/products/wsp/Home.aspx
FP/OO辩论的另一个重要资源是“函数式编程如何影响代码的结构?”(这极大地影响了我对FP/OO的思考):http://lorgonblog.wordpress.com/2008/09/22/how-does-functional-programming-affect-the-structure-of-your-code/
https://stackoverflow.com/questions/5815836
复制相似问题