《这是有关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,理解成名字空间,问题域就行了。
函数倒是可以多下点功夫,除了动作,还可看作命名、赋属性、打个标记、说一句话等等,比如这样:
female(amy).
female(johnette).
male(anthony).
male(bruce).
male(ogden).
parentof(amy,johnette).
parentof(amy,anthony).
parentof(amy,bruce).
parentof(ogden,johnette).
parentof(ogden,anthony).
parentof(ogden,bruce).
brotherof(X,Y) :-
parentof(Z,X),
male(X),
parentof(Z,Y),
X Y.
book(Title,Author,Publisher,Date).
author(LastName,FirstName,MI).
publisher(Company,City).
create_tree(niltree).
inserted_in_is(Item,niltree, btree(Item,niltree,niltree)).
总之,函数的signature就是s (expression),就是句子,就是表达,想怎样写就怎么写,一股脑都推给函数的signature就是
问题:
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下去,晕了、完了。
分享到:
相关推荐
### ABAP OOALV 学习文档详析 #### 一、ABAP OOALV 概述 **ABAP OOALV**(Object-Oriented Application List Viewer)是一种用于SAP系统的高级列表显示技术,主要用于生成复杂的报表和列表视图。自R/3 4.6C版本起...
标题中提及的“OOALV常用功能完整简例”,描述中说明了该简例包含的内容:热键单击、双击、帮助、编辑和自定义工具条等。OOALV是指面向对象的ALV,它是在SAP系统中常用的报表输出组件,用于将数据以表格形式展示。在...
实战OO_用例建模 实战OO_用例建模 实战OO_用例建模
这个主题对于任何想要在SAP系统中进行高效数据展现和处理的开发者来说都是至关重要的。以下是关于SAP ABAP和OOALV的一些关键知识点: 1. **SAP ABAP概述**:SAP ABAP(Advanced Business Application Programming)...
ABAP OOALV报表开发,定义变量,选择屏幕定义,创建类,调用函数
### OO4O简介及其在VC++中的应用 #### 摘要 OO4O(Oracle Objects for OLE)是Oracle公司推出的一种高级底层接口,专为基于Oracle数据库的应用程序开发而设计。它提供了快速访问Oracle数据库的能力,并且兼容微软...
1、Windows 95/98/Me系统,将oo2core_6_win64.dll复制到C:\Windows\System目录下。 2、Windows NT/2000系统,将oo2core_6_win64.dll复制到C:\WINNT\System32目录下。 3、Windows XP/WIN7/win10系统(64位系统对应...
SAP OO ALV技术介绍 SAP OO ALV技术是SAP系统中的一种报表控件类,通过调用cl_gui_alv_grid类的方法可以实现ALV报表的显示。OO ALV技术可以满足大多数ALV需求,但有时需要与后续的屏幕开发等集中在一个屏幕中,或者...
【ABAP OO的八大理由详解】 1. 数据封装与稳定性:ABAP面向对象(OO)编程的核心优势之一是数据封装,它将数据和操作数据的方法捆绑在一起,形成对象。这提高了程序的可维护性和稳定性,因为对象内部状态的改变对...
《实战OO》是一本深入探讨面向对象(Object-Oriented, OO)编程技术的书籍,主要针对软件开发人员,特别是那些关注于软件设计流程和优化的开发者。此书的PDF版本是作者或读者为了个人学习和参考而留存的备份,包含了...
oracle oo4o 817安装包oracle oo4o 817安装包oracle oo4o 817安装包
Oracle Objects for OLE (OO4O) is a product designed to allow easy access to data stored in Oracle databases using any programming or scripting language that supports the Microsoft ...
SAP OO ALV技术介绍 SAP OO ALV技术是SAP系统中的一种报表控件类,通过调用cl_gui_alv_grid类的方法set_table_for_first_display可以实现ALV报表的显示。OO ALV技术相比于标准函数REUSE_ALV_GRID_DISPLAY和REUSE_...
PPT,需求分析,OO分析前言,PPT,需求分析,OO分析前言,
面向对象需求分析(OO RES) 面向对象需求分析(Object-Oriented Requirements Engineering,OO RES)是一种基于面向对象技术的需求分析方法。该方法将需求分析过程分为三个主要阶段:问题域分析、需求定义和系统...
[SAP ABAP开发技术总结]ALV详解(Fuction ALV 和OO ALV) 图文并茂,详细介绍了Fuction ALV 和OO ALV的相关开发 [SAP ABAP开发技术总结]ALV详解:Function ALV(一) [SAP ABAP开发技术总结]ALV详解:Function ALV...
使用方法:打开游戏界面,同时按下键盘shift和ctrl键,切换至您想要 的输入法,界面底部会显示当前输入法和模式。 2、新增 增加抽奖功能。 3、修复 修复商品价格和利润的关系问题,解决金币越来越少的问题。 ======...
在本实例中,我们将深入探讨如何使用Object Oriented for Oracle (OO4O)库和Microsoft Visual C++ 6.0(或Visual Studio .NET)来实现对Oracle数据库的C++编程操作。OO4O库是Oracle公司提供的一个接口,允许开发者...
首先,我们需要定义一个数据结构`gt_exclude`,用来存放我们想要排除的工具栏功能。这里使用了`ui_functions`类型的数据结构,因为它包含了所有可能的工具栏功能标识。 ```abap DATA: gt_exclude TYPE ui_functions...