OO FP 杂想

《这是有关OO和FP的杂想,断断续续的...》

一、关于对象
在FP中如何理解对象这个东西?

Erlang  -> 对象Object就是一些基本数据和基本数据的组合,如果说Object还有Type的话,那么可以用atom来表述它们(等价形式就是Record),同名函数通过匹配来判断对不同的Type的Object应用什么样的算法。可以说Type就是起一个名字,一个Object可以随时、随便,起个,或者改成什么样的名字。

Haskell-> Erlang's + Strong Type: Type 就是一组接口、一组约定,函数被定义为作用在特定Type的Object上。

评论:erlang的type更符合现实世界,同一个Object完全可以在不同场景下看作不同的Type。Type只是一种标签,随时贴上去或者贴很多个都无所谓,关键是看函数怎么处理它,或者说,函数怎么处理它,它就是什么Type,Type是通过各种函数(“道”,道可道,非常道)的算法来呈现的,而不是事先贴的标签,标签只是一个(“名”,名可名,非常名)。最坏的结果是Except或者Crash

a purely functional program's state is implicitly kept in function call stacks.

=====================

OO中的对象:
最简单的定义就是实现了某一组接口Interface的东西,可以包含能被这些接口理解和处理的状态states

评论:
  • states一旦被setter和getter,就成了全局变量。OO的封装性是极其脆弱的和隐晦的。
  • states如果想具有其它的行为,就必须通过继承,或者被组合到另一个对象中。无论如何,Object在成为某种Type的同时就失去了成为其它Type的能力。OO的重用性是极其狭窄的和受限的。


二、关于效率
OO的状态可以暂存,所以在作状态分步变化的运算时似乎有优势。
FP不在内部存贮状态,但带来的好处是只要喂给它同样的参数,就肯定输出同样的结果,因此可以在内存中缓存这个结果,今后遇到同样的参数,不需要再计算,直接取出结果。

评论:随着内存越来越便宜,长时间运行的FP效率将超过OO?

三、Erlang作为DSL
DSL的要素:(主、谓、宾) + 属性(名词或形容词)
module名可以考虑作为主语,但不宜象OO中的对象实例名一样使用:

不要?
-module(feed)

feed:has_many(items, {dependency, True})
feed:find("creator")  


应该?
-module(model)
-import(db)
-record(feed, {creator,
               pubDate,
               lastUpdateTime})

-record(user, {name,
               emal})

db:relations([[feed, has_many(item), with_opt([dependency, etc, etc])],
              [user, has_many(feed), with_opt([dependency, etc, etc])]])
db:find(feed, by([{creator, "caoyuan"}, etc, etc]))

无论如何都痛苦。



或者,module就是module,理解成名字空间,问题域就行了。

函数倒是可以多下点功夫,除了动作,还可看作命名、赋属性、打个标记、说一句话等等,比如这样:

 


book(Title,Author,Publisher,Date).

 


问题:
1. 既然没有OO了,为什么还是要想方设法去ORM,也许model的最佳表述就是record + relation database + SQL?
SQL不就是DSL吗?只是考虑到兼容性,还是要再加 一层 wrap。

2. 也许DSL就是千变万化,就应该是自然语言?在计算机上实现就是应该经由分析、设计?即使是用rails好像也脱离不了这个吧,让客户读rails程序读得懂吗?可以让他直接来写吗?当然简单的Todo, Blog, Wiki用现存的例子可以业余建站,但如果ruby真是目前设计DSL还算灵活的语言,为什么没有出来一个Blog的DSL,让写Blog更简单呢?

3. 从rails目前的情况看,好的Application还是寥寥无几,用好的Application设置一下搭起来的网站倒是一大堆。

4. 从句法而言,最适合DSL的语言应该是Haskell,可是一大堆Type下去,晕了、完了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值