2011年08月07日 21:16 "@banq"的内容
甚至这个边界本身是否需要划下去也是待查的 ...

你所说的“边界”,可能与上面所用的“角度”一词意义相近。从不同的“角度”看,不管看什么(事物、系统、领域甚至事实)都可能存在“边界”。

边界,是从不同的“角度”对所看的东西进行“划分”的那道“界线”?如果banq是这个意思,那么我们的观点就基本上一致。

现在需要讨论的问题,不是我们“要不要”划分边界,从哪个“角度”(比如内与外,动与静)划分边界?这是战术问题。对“什么”(事物还是事实)进行划分,而后考虑怎么划分边界并关注其变化模式,我认为这才是战略问题。这个我想我们应该好好斟酌一下。

事物(系统/领域/场景)蕴含在事实之中,我们看到的是事物,还是事实?
事物(系统/领域/场景)蕴含在事实之中,我们是在讨论事物,还是事实?
事物(系统/领域/场景)蕴含在事实之中,我们改变的是事物,还是事实?

事物(系统)蕴含在事实之中,我们对事实划分了边界,同时不也包含对事物划分了边界。

之所以说拖banq下水,是感觉banq是在岸边观望(之前我也是),并没有下真正下水游一游体验一下:划分“事实”而不是“事物”, 在此基础上,进行后续的思考。

比如,我们根据目标与需求,选择不同的战略(事物观还是事实观),并采用不同战术(如内与外、动与静、联系与变化等角度)进行边界的划分。
[该贴被jdon007于2011-08-07 22:18修改过]

2011年08月07日 22:10 "@jdon007"的内容
边界,是从不同的“角度”对所看的东西进行“划分”的那道“界线”?如果banq是这个意思,那么我们的观点就基本上一致 ...

我脑海中没有把边界和角度联系起来,可能我有时表达时被理解成这样的关系,造成你误解了。

我简单分析一下“角度”,角度这词我认为已经隐含了“事物”这个主词,“事物的角度”,如果没有“事物”,哪来角度呢?而“边界”可能是“事物”之母啊。这有先后次序在里面。

如果“边界”是事物之母,边界可能就是一个点,或者是一个“名”“指称”,只有我们确定它是事物后,靠近观察发现其内部元素时,边界才可能是一个圈或带有内外之分的界线。

“事物”属于直接知识,可以用四色PPT或DDD的实体表达,“事实”属于间接知识,用来判断,或与时间等有关,可用四色的description或MI来表达,DDD的值对象或服务来表达。

“事实”如果是当前发生的,用MI或服务或函数等命题断言;“事实”如果已经发生过了,或持续的时间空间边界超过当期系统领域边界,相对固定了,可以用四色描述或DDD的值或专门的历史对象来表达,比如Cargo案例中,货运历史类就是记录的是除了当前以外过去货运历史记录。关系数据库虽然也是对事实进行记录,但是它当前和历史是不区分的,都是通过时间条件统一从数据库获得。

以上是我简单思考结果,只供参考,如有用可取之,无用可弃之。

[该贴被banq于2011-08-08 09:23修改过]

中国汉字含义太丰富,多元的解释都可能合理。

假如世界是一个“混沌”,那么我们切分这个“混沌”的原子单位是什么?

化学中是“分子”,物理中是“原子”,生物中是“细胞”,那么软件中是“什么”呢?

或者换一个说法,软件对这个“混沌”切分的基本“粒度”是什么或者应该是什么?

拿欧氏几何作一个类比。

点:事实 VS 事物
线:场景 (表示为一组事实或一组相关的事物参与的活动)
面:领域
体:系统

边界是一个“圈”,“圈”可大可小,可以是点、线、面、体等等。现在的问题是,软件中的“点”是什么?“边界观”或者“辩证法”并没有告诉我们这一点,他们是方法论,还不是世界观。

2011年08月08日 10:01 "@jdon007"的内容
软件对这个“混沌”切分的基本“粒度”是什么或者应该是什么? ...

这个在DDD书籍中也提及过,软件切分的细粒度到多少合适?没有一个标准。这是软件不同于自然科学的地方。粒度到你认为适当即可,因为越细越好,但是成本也高。

2011年08月08日 10:05 "@banq"的内容
软件切分的细粒度到多少合适? ...

OO切分的基本粒度是“对象或事物”;FP切分的基本粒度是“函数或过程”;逻辑式编程切分的基本粒度是“事实”或“命题”。

如果说软件是关于“如何表达思考”的学科,那么思考的“粒度”(概念细胞)肯定不会有统一标准?

OO语言,适合将这个“混沌”切分为各个“对象”(如PPT,DESC,Role, MI等)。

FP语言,适合将这个“混沌”切分为各个“函数”。

当然,可以认函数是个对象,或者对象是个函数。也就是说FP和OO甚至可以认为没什么不同。

逻辑式,适合将这个“混沌”切分为各个“事实或命题”,而后进行推理。

逻辑式的命题与推理,与FP的函数与参数或OO的对象与消息,是有区别的。粒度的选择,取决于业务目标与需求,也受现有的语言描述能力的制约,更受我们思维习惯的制约。试问,我们习惯于逻辑式的思考方式吗?

2011年08月08日 10:25 "@jdon007"的内容
如果说软件是关于“如何表达思考”的学科,那么思考的“粒度”(概念细胞)肯定不会有统一标准? ...

是的,不要试图追求统一论,这本身实际是一种一元论思维:

既然具体的事物具有具体的属性,普遍的事物具有普遍的属性,而语言就是通过主谓结构来表示这种实体-属性关系的,那么最普遍的事物(最基本的实体)将具有最普遍的属性,这种属性就是存在本身。

一元论总是通过大量枚举试图进行归纳得到一个四海皆准的真理,而罗素的关系命题暗示着世界的多元性。

关于我从老子道德经得到的“边界论”其实在罗素悖论中有这样思考:

罗素悖论是如此发生的:当我们谈论类的时候,我们要么从外延要么从内涵来规定类(应该是我认为的边界内外论)。
外延规定一个类,就是直接罗列出一个类的成员,如由数字1、2、3、5、7组成的类;由李白、杜甫、王维、李商隐、孟浩然组成的类
内涵规定类,就是借助于一个或多个属性来定义类,从而确定哪些成员属于该类,如:1到10之间的素数,唐代著名诗人。

一旦一个类在外延上被规定了,那么什么成员属于这个类就完全确定了。对于仅从内涵上规定的类,情况就不是这样,有的时候我们很难确定某一个成员是否属于该类。

从内涵上确定某一个类的成员,也就是确定能满足某一命题涵项为真的成员。但是单单按照能满足某一命题函项为真的方式来确定其相关的类的成员,会出现这样的悖论:当我们承认这个类是不包括自身为一员时,那么按照定义它就应该把自身包括在这个类中;但当我们把它包括在这个类中的时候,它就不是由一切不包括自身为一员的类所组成的类了。

著名的理发师悖论:某村庄有一位理发师,他规定给并且只给本村庄中不给自己刮胡子的人刮胡子。那么他究竟给不给他自己刮胡子呢?如果他给自己刮胡子,则按照他的规定他不应给自己刮胡子;如果他不给自己刮胡子,则按照他的规定他应给自己刮胡子。由此得出这样的悖论:他给自己刮胡子,当且仅当他不给自己刮胡子。要使理发师悖论能够发生的限定条件还有:这位理发师是本村人,并且是男的,是需要给自己刮胡子的。

罗素认为,类的悖论的问题主要是由于语义不清楚引起的,从而引起陷入怪圈的自指问题。


[该贴被banq于2011-08-08 11:42修改过]

拿出那个图书馆的例子分析一下看一下区别何在不就好了

2011年08月08日 13:19 "@uda1341"的内容
当我们谈论类的时候,我们要么从外延要么从内涵来规定类(应该是我认为的边界内外论)。 ...

从例子上看,你是把集合的表示方法中的“例举法”当作“外延”;“描述法”当作“内涵”。

一张表既从“外延”(属性集,列集),也从从“内涵”(元组集,行集)的角度描述集合。而一个类,其实仅仅从“内涵”的角度描述集合。

一个集合包含三个元素:10、100、1000。(自然语言描述)
或者
画一个圈把10、100、1000画在圈中。(图形语言描述)
或用更常用的形式化语言描述,如下:

例举法:{10, 100, 1000} (外延)
描述法:{x|x = 10^n, (1 =< n <= 3)} (内涵)

外延与内涵只是对“陈述角度”的分类而已,他们陈述了“同一个事实”,一个集合中包含了那些元素。

我们应把精力放在事实本身,而不是放在陈述的角度的分类上。

2011年08月08日 13:53 "@jdon007"的内容
一张表既从“外延”(属性集,列集),也从从“内涵”(元组集,行集)的角度描述集合。而一个类,其实仅仅从“内涵”的角度描述集合。 ...

有点不对称。“一张表的行列”,对应的是“对象集合的对象属性值及其属性”,跟类比的,应该是建表阶段,即只对表作描述,不包括有什么行。

其他我再看看

2011年08月08日 14:28 "@SpeedVan"的内容
有点不对称。“一张表的行列”,对应的是“对象集合的对象属性值及其属性”,跟类比的,应该是建表阶段,即只对表作描述,不包括有什么行 ...

是啊,关系数据库的表结构存在对罗素关系命题的误解。

罗素认为世界是由事实组成,事实之间是没有关系的,关系在事实里面存在。

而我们很多人会误解“关系命题”以为是事物之间有关系的。如果把事实内部表达的关系看成是一个动态关系,事物之间的关系是一种静止关系,事物之间这种关系可能是以“事物-属性”或"实体-属性"这样隐含意思为前提的。是一种一元论的。

关系是通过命题存在的,比如“北京是中国首都”这样一个命题,说明“北京”和“中国首都”这样的同一关系,但是“中国首都”并不是在“北京”这个实体的属性中。

如“上海在北京的南面”,表示上海和北京是彼此独立的,北京不包含在上海的属性中,上海也不包含在北京的属性中, 这样的句子并不是主谓结构,并不是描述实体的属性,从而打破了“事物-属性”或“实体-属性”的形而上学,诸事物之间的关系不是实体-属性的统一关系。

再比如DDD案例中航运系统,用户在所有城市列表中选择货物所达到的城市,后台我们的软件系统把货物和到达城市发生关联,这是一个命题,货物和城市的关系在这个命题中完成事实。如下图。

这里又引出关系数据库了,当货物和城市发生关联后,为了记录这种发生过事实,我们要在关系数据库中把货物表和城市表两个发生关联,比如把城市的ID作为货物的外键存储起来。

当这样通过外键存储发生过的事实后,很容易产生混淆,这个外键关系到底是货物表和城市表之间的静态结构性事物高聚合关系(事实之前的关系),还是事实发生后的关系?这个有点像侦探破案现场,要进行反推理哦。

[该贴被banq于2011-08-09 15:37修改过]


2011年08月09日 15:19 "@banq"的内容
关系数据库的表结构存在对罗素关系命题的误解。

罗素认为世界是由事实组成,事实之间是没有关系的,关系在事实里面存在。 ...

关系数据库中的一条记录,实际上记录的就是一个事实。查询,是推理的过程;命令,则是改变事实的过程。

事实之间是存在关联的,虽然事实是个“原子”。

OO中并没有用“枚举”的方式去表示事实集合,而关系数据库有。OO中的对象是分散在各个角落的,而关系数据库中则把所有的记录集中罗列在表中。表达方式两者本来就不对称。

所谓关系到底是什么?简单说,关系就是集合的概念。关系运算,就是对集合的操作。一个关系,就是表示一个事实集合。

关系数据库在表达“事实的集合及其运算”这个方面比OO强得太多了。把关系数据库,理解为“对象的集合”或“数据的集合”,而不是事实的集合,本身是一种误用;是用“事物观”去扭曲关系数据库的“事实观”。

崇尚OO人总是在强调“数据”是死的,没有“行为”;却不知关系数据库背后的逻辑观是什么,是集合论,是事实观。

没有集合概念和事实观概念的人,再怎么学习关系数据库,都是以扭曲的方式的在学,在用。

不过不管OO,还是关系数据库,都缺乏时间概念的支持。时间是变化的前提,缺失这个极其重要概念,两者都是不完善的。

2011年08月09日 15:19 "@banq"的内容
再比如DDD案例中航运系统,用户在所有城市列表中选择货物所达到的城市,后台我们的软件系统把货物和到达城市发生关联,这是一个命题,货物和城市的关系在这个命题中完成事实 ...

补充一下,我前面将货物和城市关联这个命题如果用OO如何实现呢?直接实现,如同我们在DCI中讨论在两个账户之间转帐一样,用函数function或service实现:
ship(Cargo cargo, City destinationCity);

毫无疑问ship函数也是四色图中MI,MI是一个和时间有关对象,表示和时间有关的正在发生的。

电脑操作员只要在屏幕上选择要到达的城市,按确定发生命令到软件系统,直接调用ship函数即可,表示当前某个cargo发往destinationCity这个命题为真,很实时表达了当前事实。

所以,OO(特别是面向函数范式编程)对事实表达按照罗素“指称”系统逻辑,是直接指称事实的,而关系数据库是将发生事实的结果进行保存,关系数据库不是直接指称事实(是记录事实),而是直接指称事实的结果

记录事实和指称事实是两个概念,就像你在表演,有人在旁边摄像一样,摄像是记录事实,你表演才是直接事实在发生。当然,我们以后可以根据摄像资料查看各种事实,当这已经算间接知识了。

不知我表达清楚没有?我们经常会习惯归纳事实,噢,你这个边界内外是外延内延,外延内延又叫A和B,然后对A和B进行讨论,这实际上已经发生指称转移了。

名可名,非常名,多么简单而深奥的课题啊。现代人具有丰富知识的人都会犯,别说平常人了。


jdon007 加油,讲一个实例,比较一下OO分析和事实分析的根本区别和灵活性比较,你就要赢了。

我先观战。

呵呵,banq的边界观到底是什么?我尝试给出几种解释似乎都不是。
1)输入/输出-系统
2)内涵-外延

关于概念的内涵与外延的定义,可参见现代汉语词典(这个最权威)。
词典不在身边,凭记忆,内涵应是描述定义法,外延应是列举定义法。
比如人这一个概念,
能够制造和使用工具的动物。(内涵,且不论这个命题是否成立)
古往今外所有的人。(外延)

这个人的概念,应该是马克思定义的。从“事实观”看,内涵与外延不过是以不同的方式陈述了同一事实而已。

实际上我们是无法定义事物是什么的,只能说事物怎么样,能做什么。

比如,可以尝试去定义最常见的碗和筷子。
你可以陈述,
这个碗是瓷的,这双筷子是竹子做的。(事物怎么样)
碗用来盛饭的,筷子用来夹菜的。(能做什么)
而说事物怎么样和能做什么,实际上就是在陈述事实(包含事物)。

货物(Cargo)邮寄(shipping)到城市(City)去,这是一个事实(指称事实)。
货物(Cargo)邮寄(shipped)到城市(City)了,这也是一个事实(记录事实)。

如果认为这两个事实互为因果,则需考虑怎么表达这种因果关系,“因果关系”是一种常见的事实变化模式。

数据库的记录方式(仅作讨论)
1)货物集合,Cargo (cargo_id, cargo_name, ...)
2) 城市集合,City (city_id, city_name,...)
3) 邮寄集合,Ship_Cargo_City (ship_id, cargo_id, city_id, ship_state)

《火影忍者》邮寄到“北京”去,陈述这个事实:
(001, 火影忍者,北京,寄出)
《火影忍者》邮寄到“北京”了,陈述这个事实:
(002, 火影忍者,北京,寄到)

数据库没有“时间”概念或者说一般只记录当前时刻的事实。
即不记录002的事实,而是更新001的事实,把“寄出”的状态改为“寄到”。(001, 火影忍者,北京,寄到)。
如果记录002的事实,实际上还是没有时间概念,因为001和002不是标识为同一个事实了,尽管它们之间存在因果关系。

2011年08月09日 21:06 "@jdon007"的内容
jdon007 加油,讲一个实例,比较一下OO分析和事实分析的根本区别和灵活性比较,你就要赢了。

我先观战。 ...

呵呵,banq的乾坤袋(OO)太厉害了,估计到最后还是徒劳无功, 我做过河卒也不容易呀。

最近在看一个开源项目,上层是用Java写的,底层是C实现的。尽管底层是C编写的,但是其开发文档竟然说:Today, OOP(Object-Oriented Programing) is the best way to program well designed softwares。然后介绍怎么使用C模拟实现类的概念。

OO太火了,都入侵到底层了。还好,我用我的四象图,可以将其尽收到画中。

我可以想象以“事实”为概念细胞的语言,实现程序起来会更简洁。要说明这种效果,需要借助于逻辑式的描述性语言,SQL差强人意,或许可勉强为之。