2011年07月10日 23:21 "@redorange"的内容
世界是事实的总合,而不是事物的总合 ...

其实这句定义里面也可以看到关系数据库的弱点,优点即弱点,为什么呢?我们看看关系顺序:

事物--->事实---->关系数据库

可见,关系数据库是事实的总合(结果),我们使用关系数据库常常需要根据数据库中的数据倒推出曾经发生的事实,这好比福尔摩斯侦探根据凶手现场还原凶手事实一样,这样求真的过程是很难的。

而面向对象则是用代码直接对事物和事实进行表达,这样不是更直接更方便吗?

2011年07月10日 23:21 "@redorange"的内容
而OO完全是背道而驰,把人的粗浅常识又搬出来当做OO的哲学基础。你追踪下去会发现OO完全基于非常粗浅的哲学认识,根本没有理论渊源和根基,连2000多年前的古希腊哲人都不满足于此。 ...

背道而驰,还真是第一次听,在你看来,所有东西必须自下而上地组织?OO自上而下切分关注,难道是错误?是玩物?“把人的粗浅常识又搬出来当做OO的哲学基础”,说粗浅?背道而驰不是错误么?

若果背道而驰,而又遍地开花,那只能是泡沫。

“根本没有理论渊源和根基”,你是在谈科学,还是哲学?老子“道德经”的根基在哪?请问,第一个提出哲学的人,其根基也在哪呢?根基的根基,追踪到最后,根基呢?评价哲学的好坏,是对其能否解析世界进行评价,不是他爸是否是“李刚”。

“关系数据库的插入都是以整条记录为最小单元”,记录是啥呢?记录没有边界,没有定义?有边界,有定义,OO就能描述。关系数据库说的是记录“插入”,OO中说的是对象“诞生”。

回头一想,OO有排除其他哲学吗?OO有和其他哲学对立吗?命名与立象,人类认识的开端而已。面向对象,不但要我们认识如何立象,还要考虑象间的逻辑,这就是所谓的“面向”。增删改查是对世界的分解,而不是抽象。抽象是对现实(事实)的抽象,绝对不是想象。

“世界是事实的总和,而非事物的总和。”OO违背了什么?洗耳恭听。

谈哲学么,我只是告诉你们跟计算机最有关系的哲学是什么,和这种哲学的地位。

举个例子吧,在人工智能的领域,用来表现当前世界状态的,从来就是用事实来表示。

lisp发明人的另一个成就是情景演算(situation calculus),情景演算表示世界状态的方式是用逻辑的方式表示的。包括他的elephant语言,也是走在这个路子上。

这里还有一个STRIPS表示法:

世界状态:一个世界状态(简称状态)是一组谓词公式的集合
目标:表示世界状态的谓词的合取
动作:动作用前提条件和动作效果来表示。

前提条件:动作执行前必须满足的条件
动作效果:动作执行后可以保证为真的状态

STRIPS是用于动态规划的经典方法,在人工智能主体编程中也有不小的作用。

还有tony hoare的hoare逻辑,各种计算机语义学,全部是如此,逻辑学和计算机科学的论文就更数不胜数了。

但是OO呢?

去翻吧,啥理论都没有,都是拼凑的。

现在那些只不过那些停留在论文阶段,离工程界的实际应用还有不小的距离,我只是想指出这个方向,在这个方向上,关系数据库是对了,而OO是彻底的失败,函数式那些奇技淫巧其实也是错误的方向,只不过错得没OO这么离谱而已。

看了uda1341的发言,我开始有些糊涂了。
1、uda1341总是说OO是错误的,关系数据库才正确。但是OO和关系数据库是什么关系?
关系数据库应该是OO的一种表现形式吧。
2、OO错误的原因是没有理论根基。难道一定要有理论根基才正确吗?
我觉得,所谓的理论是某种规律性,OO是高于规律性的,即还处在混沌状态下的世界。需要人为解读、归纳、提取,来找出这种规律性。面向对象其实就是面向现实世界,与其它表达方式相比,关系数据库也许更能准确、直观表现现实世界。但OO和关系数据库不是对立的,他们应该是本体和本体的表现形式吧。

我想可能存在定义上的差异,OO的定义是什么,在这里绝不是面向对象的编程语言。

说多了无用,我又不是什么有权威的大师,就算看不懂也可以让人仔细琢磨。

最后一点发言,希尔伯特在将几何学严格公理化的过程中发现,点无法定义,直线也无法定义,能够定义的只是点和直线之间的关系。这个例子很好,在一个公理化体系中,关系才是基本要素。

因此,正确的出路是,用关系定义实体,而不是先定义实体,再组成关系。这样构造出来的实体(对象),才真正地符合现实世界。

我的话完鸟。

2011年07月11日 12:31 "@uda1341"的内容
关系定义实体,而不是先定义实体,再组成关系 ...

我倒想问问,按你那样说,OO的错误是因为先定义实体,那么OO中提到的实体时如何出来的?空想出来的?

说白了,你脑中“错误”的OO中的实体,是如何“先”定义出来的?
[该贴被SpeedVan于2011-07-11 16:46修改过]

uda1341的世界状态和点不能定义。我也有体会,只是这些不是从书中得来,而是反反复复的思考得来。

对于前者,我发现有些业务规则,可以描述为最小状态集及其转移,一个状态表示一个事态(或事实的状态),这样表达领域模型非常简洁。从这点看,世界是事实的总和的观点,比世界是事物的总和,更富有表达力。不过当我们仅考虑一件事情时,分清事物及其活动的边界,也许就必要了。

点不能定义,以前在学微积分和矢量代数时,就有类似的感触。点既可以是线,也可以是面,甚至可以是体,但是存在一个难以释怀的悖论,不能定义的点,却定义了矢量代数中最核心的概念:梯度,旋度,散度等,这些概念是麦克斯韦描述电磁场理论的基石,甚至有人用来描述信息场,这个现在我还没有想通,也不太敢去想,信息作为物质,能量之外的第三大元素,太复杂了,香农精确的定义,也只是在不考虑语义的前提下,对信息的量化。《易经》中的象,既可以是事实之象,也可以是事物和活动之象。当我们面对复杂的世界时,描述事实的状态,比描述事物及活动的更简洁。

我目前的观点:1)宏观上,以“世界是事实的总和”为世界观,描述为世界状态集合及其转移;2)微观上,以“世界是事物及其活动的总和”,描述为对象和消息或关系与查询。3)宏观与微观是相对的,两种世界观可以相互嵌套表达。视需求和目标而定。4)对象与消息,关系与查询,是互补的角度。对象侧重描述的是事物本身的边界,关系侧重于描述事物之间的联系。

看来分歧是先有实体或关系,其实这还属于边界划分,两个实体关系紧密,起初你只看到关系,但是随着认识深入,你可以在这两个实体之间画一道线边界,一个关系就变为两个实体的关系,就像你把线最后总是能切割成点一样。这就是 oo 分析。
对于探究未知领域,我们必须继续借助数学去切割分析表达,比如线由多少点组成,但是更多于人相关领域已经有很多领域专家,他们可以用数学表达他们的领域知识,也可以用他们职业直觉来表达出核心实体模型出来。

终于有个帮我说话的了。

再给个更具体的例子,完全实用的我可没有,正做着呢

事件是什么?

把事件定义为:事实的变化模式

结合关系数据库想一下,不考虑效率,如果把这个事件定义引入,并从基础上进行支持,会带来多大的方便?

前提是数据库是有记忆的,我们可以查询到数据库变化的所有历史(说了先不考虑效率)

考虑我们的自然语言中的例子,是怎么表达事件的?比如“我回家了”,这是一个事件,变化模式是,从“我不在家”变成“我在家”,是事实的变化,别的分析方法都只会搞得很繁琐,而且缺乏基础定义,只能用更缺乏定义的东西来定义事件,最后只能靠人来把握。

借用关系数据库的关系查询,(实质是逻辑查询),你可以表达非常复杂的事件,比如:一个穿红衣服的胖子走进翠花胡同里的沙县小吃。

结合你们的例子想一下,或者发一个例子上来讨论,觉得有关事件,但处理很繁琐的例子。你们就知道这种定义和处理方式是如何的简洁了。

2011年07月12日 10:19 "@uda1341"的内容
前提是数据库是有记忆的,我们可以查询到数据库变化的所有历史 ...

请问uda1341在做什么项目呢?
你说的有记忆的数据库,我这里正好有个实例。用户可以设定时间,数据就会回到那个时间点。

我曾经搞过软件现在不搞软件,现在搞电子,FPGA,数字音频啥的。

业余课题,传统一点说是新的计算机语言rationese以及这门语言的IDE

这个是写给别人的一点解释:
http://www.douban.com/note/147749382/

其他的都在我的豆瓣日记里,很杂乱,不期待有太多人能看懂:)

我咋觉得,就在说DSL

关于点和线的定义,我个人感受是因为其关系过去庞大,而难以归纳出定义。事与物都是相互关联的,新事物总是通过关系去认识,当把认识归纳,划定边界,立象命名,就是定义。点和线只是还没定义,而不是不能定义。但我们划定领域,将关系缩小,于是便可以归纳出定义,像点在二维空间上,便可以定义为二维坐标。

很多事物的定义,只存在某个领域和持续一段时期,想从世界、宇宙的角度准确定义事与物,可能只有上帝可以,如人的定义。为什么,在做数学题时,提到的点与线,为什么学生们能懂?“不就是坐标嘛”。一样东西若果不能被定义,则不能用来推导。当你指着一个东西说“这个点如何如何”,然后对方说“这不是线么?”。

命名与定义,是同一样东西,为什么当别人说uda1341时,就知道说谁呢?是因为uda1341这个名字,指定了一组定义,而该定义指定了一个或一组事物。当uda1341这个名字放到其他论坛,放到世界,能担保是同一个人么?明显不能。“名可名,非常名”,名字意义的改变,也就是指定的定义改变了。

回到OO上,OO在提取实体时没有考虑关系吗?答案是有,这也是类图跟ER图相似的原因。编程分为想和写两个阶段。想就是分析思考,分解提炼,这时候就是思考关系,逻辑来获取领域当中实体及其活动的定义。至于写,就是把想到的表达出来而已。别以为先写类,就认为是不考虑关系去认识。只不过类最大的问题是过于静态。

以上是本人对定义的理解。(在uda1341提到的豆瓣里的那个回复(不是我),确定与有限的概念我是同意的)

2011年07月12日 11:24 "@SpeedVan"的内容
传统一点说是新的计算机语言rationese以及这门语言的IDE ...

给点建议:
1、可以不是经典的计算机语言。可以是批处理文件那样的脚本。
2、可以不是编译型,解释型的语言更容易实现。如果你要掌握编译原理,那还要刻苦学习几年。而解释型的语言,网上似乎有现成的语法解析器。
3、必须配合数据库,因为你提到了记忆。计算机语言的运行是在内存里,需要一个将内存数据映射到永久保存载体的机制。
4、开始阶段可以不做IDE,IDE是上层建筑,被迫随着语言本身的变化而修改。当然,如果你只做个IDE界面,就另当别论了。