《这是有关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
评论:
二、关于效率
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]))
无论如何都痛苦。
问题:
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下去,晕了、完了。
一、关于对象
在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下去,晕了、完了。