`
dcaoyuan
  • 浏览: 307422 次
社区版块
存档分类
最新评论

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,理解成名字空间,问题域就行了。

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

   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 概述 **ABAP OOALV**(Object-Oriented Application List Viewer)是一种用于SAP系统的高级列表显示技术,主要用于生成复杂的报表和列表视图。自R/3 4.6C版本起...

    OOALV常用功能完整简例

    标题中提及的“OOALV常用功能完整简例”,描述中说明了该简例包含的内容:热键单击、双击、帮助、编辑和自定义工具条等。OOALV是指面向对象的ALV,它是在SAP系统中常用的报表输出组件,用于将数据以表格形式展示。在...

    实战OO 用例 建模

    实战OO_用例建模 实战OO_用例建模 实战OO_用例建模

    SAP ABAP开发学习——第10课:OOALV(视频教程)

    这个主题对于任何想要在SAP系统中进行高效数据展现和处理的开发者来说都是至关重要的。以下是关于SAP ABAP和OOALV的一些关键知识点: 1. **SAP ABAP概述**:SAP ABAP(Advanced Business Application Programming)...

    ABAP OOALV报表开发

    ABAP OOALV报表开发,定义变量,选择屏幕定义,创建类,调用函数

    OO4O简介以及其在VC++中的应用

    ### OO4O简介及其在VC++中的应用 #### 摘要 OO4O(Oracle Objects for OLE)是Oracle公司推出的一种高级底层接口,专为基于Oracle数据库的应用程序开发而设计。它提供了快速访问Oracle数据库的能力,并且兼容微软...

    oo2core_6_win64

     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技术介绍.pdf

    SAP OO ALV技术介绍 SAP OO ALV技术是SAP系统中的一种报表控件类,通过调用cl_gui_alv_grid类的方法可以实现ALV报表的显示。OO ALV技术可以满足大多数ALV需求,但有时需要与后续的屏幕开发等集中在一个屏幕中,或者...

    ABAP OO的八个理由

    【ABAP OO的八大理由详解】 1. 数据封装与稳定性:ABAP面向对象(OO)编程的核心优势之一是数据封装,它将数据和操作数据的方法捆绑在一起,形成对象。这提高了程序的可维护性和稳定性,因为对象内部状态的改变对...

    实战OO的pdf自留备份

    《实战OO》是一本深入探讨面向对象(Object-Oriented, OO)编程技术的书籍,主要针对软件开发人员,特别是那些关注于软件设计流程和优化的开发者。此书的PDF版本是作者或读者为了个人学习和参考而留存的备份,包含了...

    oracle oo4o安装包part1

    oracle oo4o 817安装包oracle oo4o 817安装包oracle oo4o 817安装包

    OO4O(Oracle Objects for OLE C++ Class Library)

    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技术介绍.pptx

    SAP OO ALV技术介绍 SAP OO ALV技术是SAP系统中的一种报表控件类,通过调用cl_gui_alv_grid类的方法set_table_for_first_display可以实现ALV报表的显示。OO ALV技术相比于标准函数REUSE_ALV_GRID_DISPLAY和REUSE_...

    需求分析_OO分析

    PPT,需求分析,OO分析前言,PPT,需求分析,OO分析前言,

    面向对象需求分析(OO RES)

    面向对象需求分析(OO RES) 面向对象需求分析(Object-Oriented Requirements Engineering,OO RES)是一种基于面向对象技术的需求分析方法。该方法将需求分析过程分为三个主要阶段:问题域分析、需求定义和系统...

    [SAP ABAP开发技术总结]ALV详解(Fuction ALV 和OO ALV)

    [SAP ABAP开发技术总结]ALV详解(Fuction ALV 和OO ALV) 图文并茂,详细介绍了Fuction ALV 和OO ALV的相关开发 [SAP ABAP开发技术总结]ALV详解:Function ALV(一) [SAP ABAP开发技术总结]ALV详解:Function ALV...

    OO超市V1.0.7

    使用方法:打开游戏界面,同时按下键盘shift和ctrl键,切换至您想要 的输入法,界面底部会显示当前输入法和模式。 2、新增 增加抽奖功能。 3、修复 修复商品价格和利润的关系问题,解决金币越来越少的问题。 ======...

    基于OO4O和VC 6.0 实现Oracle数据库操作C++源代码程序小实例

    在本实例中,我们将深入探讨如何使用Object Oriented for Oracle (OO4O)库和Microsoft Visual C++ 6.0(或Visual Studio .NET)来实现对Oracle数据库的C++编程操作。OO4O库是Oracle公司提供的一个接口,允许开发者...

    ABAP OO去掉ALV中的标准工具栏

    首先,我们需要定义一个数据结构`gt_exclude`,用来存放我们想要排除的工具栏功能。这里使用了`ui_functions`类型的数据结构,因为它包含了所有可能的工具栏功能标识。 ```abap DATA: gt_exclude TYPE ui_functions...

Global site tag (gtag.js) - Google Analytics