论坛首页 Java企业应用论坛

敲响OO时代的丧钟!——DJ对于数据持久化的支持(3)

浏览 192824 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-07-18  
datatype Point{
    double x;
    double y;    
}
datatype Line{
    Point p1;
    Point p2;
}

那你还是没办法实现high order亚,譬如说“对一组对象中的每一个实施某一操作”(也就是map)这个事情你怎么描述?你这新语言跟Java又有啥区别呢?
0 请登录后投票
   发表时间:2005-07-18  
关于那个几何图形的例子,OO为什么会失败呢?原因很简单,只要我们把其中的名词换一下就可以了。

多边形 ------  三角形 ------  等腰三角形

水果   ------  苹果   ------  红色的苹果

这种继承体系是OO继承体系的原意吗?水果和苹果之间的关系以及苹果和红色苹果之间的关系完全是两回事,但是几何图形的例子则将两种关系牵强的扯在一起,然后得出OO失败的结论,怎么看都是偷换概念。
0 请登录后投票
   发表时间:2005-07-18  
robbin 写道
引用
1、关系:也就是徐昊所说的边语义。在OO中,对象与对象之间是否存在关系,在对象之外是不知道的。当一个对象被封装起来以后,他内部是否使用、关联、组合了其他的对象,是不可知的。因此,我们看到的通常的OO图,只能说是Object被剖开了以后的对象图。事实上,关系是被隐藏起来的。而在RDB中,关系非常明确的被定义与标识出来,一目了然。这将带来巨大的描述效果。相比起UML Class图,E-R要容易理解得多。


这段话基本上是无稽之谈,对象与对象之间的关系描述是非常清楚,并且一目了然的,庄偷换了一个基本概念:把接口契约偷换成了接口实现代码,所以结论是荒谬的。


robbin同志啊,你怎么还是这么说话冲人呢?

对象与对象间的关系描述很清楚吗?

User u=new User("zbw");;
String add1=u.getAddress1();;
String add2=u.getAddress2();;
String add3=u.getAddress3();;


我怎么才能知道,这三个Address,是User的内部属性呢?还是与User有一对多关系的三个Address对象呢?

robbin 写道
引用
Primary Key:这是RDB特有的概念,在OO中没有对应概念。因此,我们要判断两个对象是否相等,就相当困难。如果每个对象都有一个“一次设置,终身不变的Primary Key”,那么对象之间的比较语义,就能够被清楚的区分为:IS和LIKE。IS就是Primary Key相同的两个对象,他们应该完全一致,甚至在内存中,也只应该保存一份。LIKE,就是成员数据相同的两个对象,他们不是一个东西,仅仅是像而已。


对象相等语义是指他们的内存地址是一样的,在Java中,使用对象的hashCode来判断。hashCode就是OO的PK。看来庄子的Java基本功有待加强。


别随便就说人家的基本功不扎实,这样的语气也很冲的。

所谓PK,就是整个数据库中,只能有一条这个PK的记录。OO语言中,能够有这样的限定吗?
User u1=new User(1);;
User u2=new User(1);;


这u1和u2在数据库里是一条记录,但是在内存中,却是两个对象。

robbin 写道
引用
SQL:这也是RDB特有的语言,而在OO的世界里,查找一个对象的工作,从来没有被规范过。


ODMG就是OO数据管理规范,ODMG1.0是1993年发布的,覆盖了C++,smalltalk,Java等面向对象编程语言,现在ODMG规范已经到了3.0。在Java的O/R Mapping中,如JDO和Hibernate都使用了该标准。可见ODMG不但由来已久,而且已经规范了n多年了。

前面的帖子没有怎么看过,不过这个最新的blog实在漏洞百出,很多基本问题都搞错了,实在看不下去了,只好跳出来指正一下。


ODMG,我没有了解呀。
你用Hibernate的时候,用到了OQL吗?
我看《深入浅出Hibernate》,也只字未提ODMG呀。

据我所知:

由于历史原因,ODMG并没有象想象中地那样得到广泛应用,现有的十几个面向对象数据库中,采用ODMG OQL规范的少之又少,目前也只有FastObjeccts、Ozone这些产品采纳了这个规范,而象Versant这样的大厂商还没有采取OQL来查询数据库,而是自己定义了自己的一套API,称作VQL(Versant Query Lanaguage)。

我的孤陋寡闻,也不能全怪我吧。
0 请登录后投票
   发表时间:2005-07-18  
buaawhl 写道
庄子的新语言终于出来了。:D  千呼万唤始出来。

Check 部分,相当于contraint吧。post-check after setting properties?
CheckMethod 都是静态方法?


在我看来,所谓数据类型,就是符合一系列逻辑判断条件的数据。
表述为:满足约束条件。也是一样的。
CheckMethod,与一般的Method是有区别的,他们仅仅用于检查数据,是否符合某某条件,绝对不能修改数据,也不能用于数据检查之外的用途。

buaawhl 写道
引用

datatype IsoscelesRightTriangle as IsoscelesTriangle,RightTriangle{

}


as 是否相当于 多重继承?是否具有多态的特性?


其实所有的数据类型之间,并没有任何关系,他们之间的那个as,只是为了解决check代码的复用需要,任何数据,只要能够通过某一类型的check,那么它就实质上属于那一类型。

buaawhl 写道
引用

datatype Polygon:ValueList{


: 表示继承?

数据 和 操作 之间是多对多的关系。
操作(方法代码)可以重用,数据本身(不是包装成类的object)也可以重用。
是这样吗?


:不是表示继承,而是任何一个数据类型,都必然是三种类型之一:
ValueObj、ValueList、ValuePackage
因为ValueObj极为常用,所以可以省略。

数据与操作之间,的确是多对多的关系,这一点,我在数据类型介绍完之后,会继续介绍操作类型。然后才是对象类型。
0 请登录后投票
   发表时间:2005-07-18  
gigix 写道
datatype Point{
    double x;
    double y;    
}
datatype Line{
    Point p1;
    Point p2;
}

那你还是没办法实现high order亚,譬如说“对一组对象中的每一个实施某一操作”(也就是map)这个事情你怎么描述?你这新语言跟Java又有啥区别呢?


如何实施操作,是操作定义的事情,我还没说到呢。
一步一步的来嘛。

与java的差别还是挺大的。
0 请登录后投票
   发表时间:2005-07-18  
age0 写道
关于那个几何图形的例子,OO为什么会失败呢?原因很简单,只要我们把其中的名词换一下就可以了。

多边形 ------  三角形 ------  等腰三角形

水果   ------  苹果   ------  红色的苹果

这种继承体系是OO继承体系的原意吗?水果和苹果之间的关系以及苹果和红色苹果之间的关系完全是两回事,但是几何图形的例子则将两种关系牵强的扯在一起,然后得出OO失败的结论,怎么看都是偷换概念。


http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-18.html

这里是原图的出处,一时找不到中文版,你先将就着看看E文吧。
0 请登录后投票
   发表时间:2005-07-18  
不知道庄看完第三章没有,希望你能看完以后再谈谈你的想法。
同时我请你注意,那个图下面的注解52。
0 请登录后投票
   发表时间:2005-07-18  
这个check看起来像不动点,应该是在构建完成以及任何一个外部函数调用返回之前都要检查的。hehe,开销不小啊。
不过,既然这么做了,干脆把DBC那一套都搞过来。看起来会完整一些。
0 请登录后投票
   发表时间:2005-07-18  
庄表伟 写道
robbin 写道
引用
1、关系:也就是徐昊所说的边语义。在OO中,对象与对象之间是否存在关系,在对象之外是不知道的。当一个对象被封装起来以后,他内部是否使用、关联、组合了其他的对象,是不可知的。因此,我们看到的通常的OO图,只能说是Object被剖开了以后的对象图。事实上,关系是被隐藏起来的。而在RDB中,关系非常明确的被定义与标识出来,一目了然。这将带来巨大的描述效果。相比起UML Class图,E-R要容易理解得多。


这段话基本上是无稽之谈,对象与对象之间的关系描述是非常清楚,并且一目了然的,庄偷换了一个基本概念:把接口契约偷换成了接口实现代码,所以结论是荒谬的。


robbin同志啊,你怎么还是这么说话冲人呢?

对象与对象间的关系描述很清楚吗?

User u=new User("zbw");;
String add1=u.getAddress1();;
String add2=u.getAddress2();;
String add3=u.getAddress3();;


我怎么才能知道,这三个Address,是User的内部属性呢?还是与User有一对多关系的三个Address对象呢?

robbin 写道
引用
Primary Key:这是RDB特有的概念,在OO中没有对应概念。因此,我们要判断两个对象是否相等,就相当困难。如果每个对象都有一个“一次设置,终身不变的Primary Key”,那么对象之间的比较语义,就能够被清楚的区分为:IS和LIKE。IS就是Primary Key相同的两个对象,他们应该完全一致,甚至在内存中,也只应该保存一份。LIKE,就是成员数据相同的两个对象,他们不是一个东西,仅仅是像而已。


对象相等语义是指他们的内存地址是一样的,在Java中,使用对象的hashCode来判断。hashCode就是OO的PK。看来庄子的Java基本功有待加强。


别随便就说人家的基本功不扎实,这样的语气也很冲的。

所谓PK,就是整个数据库中,只能有一条这个PK的记录。OO语言中,能够有这样的限定吗?
User u1=new User(1);;
User u2=new User(1);;


这u1和u2在数据库里是一条记录,但是在内存中,却是两个对象。

robbin 写道
引用
SQL:这也是RDB特有的语言,而在OO的世界里,查找一个对象的工作,从来没有被规范过。


ODMG就是OO数据管理规范,ODMG1.0是1993年发布的,覆盖了C++,smalltalk,Java等面向对象编程语言,现在ODMG规范已经到了3.0。在Java的O/R Mapping中,如JDO和Hibernate都使用了该标准。可见ODMG不但由来已久,而且已经规范了n多年了。

前面的帖子没有怎么看过,不过这个最新的blog实在漏洞百出,很多基本问题都搞错了,实在看不下去了,只好跳出来指正一下。


ODMG,我没有了解呀。
你用Hibernate的时候,用到了OQL吗?
我看《深入浅出Hibernate》,也只字未提ODMG呀。

据我所知:

由于历史原因,ODMG并没有象想象中地那样得到广泛应用,现有的十几个面向对象数据库中,采用ODMG OQL规范的少之又少,目前也只有FastObjeccts、Ozone这些产品采纳了这个规范,而象Versant这样的大厂商还没有采取OQL来查询数据库,而是自己定义了自己的一套API,称作VQL(Versant Query Lanaguage)。

我的孤陋寡闻,也不能全怪我吧。


引用

我怎么才能知道,这三个Address,是User的内部属性呢?还是与User有一对多关系的三个Address对象呢?


这段代码已经写的很清楚了,只有一个User对象,根本谈不上对象与对象之间的关联关系。而一个类的内部属性也是外部不可见的,这段代码只能说明User类有三个方法调用返回三个String,仅此而已。


引用
所谓PK,就是整个数据库中,只能有一条这个PK的记录。OO语言中,能够有这样的限定吗?
User u1=new User(1);;
User u2=new User(1);;


这u1和u2在数据库里是一条记录,但是在内存中,却是两个对象。


Java使用hashCode来保证对象唯一性,数据库使用PK保证唯一性,当然可以有这样的限定。

u1和u2当然是两个对象,如果他们是一个对象,才是hashCode的失败呢!说明hashCode无法保证对象的唯一性了。你这个例子恰恰是一个证明对象唯一性的例子。

而且这个例子其实有逻辑推理上的问题, 我们推理一下,我还可以一个user对象往数据库插入两次,那么就是一个对象对应两条数据库记录,那是不是说,对象可以保证唯一性,而数据库却无法保证唯一性呢?
引用


你用Hibernate的时候,用到了OQL吗?
我看《深入浅出Hibernate》,也只字未提ODMG呀。


Hibernate如果不遵循ODMG,干吗还依赖odmg这个jar呢
《深入浅出Hibernate》是OO经典教科书?它只字未提ODMG不能说明任何问题吧。

当然这些都是概念问题,庄子可以不必理会,我们更期待的是DJ的介绍。
0 请登录后投票
   发表时间:2005-07-18  
ozzzzzz 写道
不知道庄看完第三章没有,希望你能看完以后再谈谈你的想法。
同时我请你注意,那个图下面的注解52。


我看完了的。

对这个问题的看法,也是我解决方案的基础之一。
我正在陆续写出。

也请谈谈你看法吧。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics