论坛首页 Java企业应用论坛

OO—现实与实现的分歧

浏览 15123 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-03-04  
OO
   最近在和朋友做一个小的系统,对系统进行设计时与朋友的理念有所冲突,于是乎就想起了一个老问题,那就是正方形与长方形的继承问题。
   
OO可以说是现实世界在计算机世界的一个映射,而对于正/长方形,实际上是对正/长方形数学定义在计算机的一个映射的问题。

首先我们来看看在现实中,长方形的定义:
有一个直角的平行四边形是长方形。

再来看看判定定理:
定理1:有三个角是直角的四边形是长方形。
定理2:对角线相等的平行四边形是长方形。

以上就是长方形在现实中的定义以及判定定理。以此来看,正方形完全符合以上定义以及判定定理,所以可以得出正方形就是长方形,是它的一种特例。

在阎宏博士所学的《java与模式》一书里的观点是反对正方形是长方形的子类的,同时他写了一个例子出来:
  public void resize(Rectangle r){
        while(r.getHeight()<r.getWidth()){
           r.setWidth(r.getWidth()+1);
        }
    }


这个例子是长方形的一个方法,用来不断增加长方形宽度,当宽度超过长度就停止增长,当传入对象是正方形的时候,这个方法就无用武之地(修改)。对于这一点,我的反驳很简单,是谁规定了长方形的边长必然是一个长一个宽呢?在现实的定义和判定定理中,并没有这一条吧。我记得在以前读书的时候,就有过一道判断题:长方形的长一定比宽的长度长。这道题目的答案就是错的。而在这里,阎宏博士通过一个自己定义实现的方法来扭曲现实中的定义,这一点已经明显违反了OO设计的根本,那就是客观的反映现实世界。

以上说了那么多,实际上我想说的是,在进行对象设计的时候,我们要把握好一点,那就是客观的反映现实的世界,当然要做到非常准确是很难,至少在现实对象有明确定义之时,我们不应该主观的加上自己的定义实现,让实现与现实产生分歧。
   发表时间:2007-03-04  
what's your point?
那你打算怎么实现这个resize方法
0 请登录后投票
   发表时间:2007-03-04  
resize这个方法是不属于定义范畴,更多的是属于业务需求范畴。从业务角度来说,resize这个方法并不适用于正方形,我想这也是OO设计中的一大矛盾所在,最简单的解决办法就是子类对父类进行方法覆盖,但是实际上子类并没有这一需求,我也想找个更好的解决办法,呵呵,不知道gigix有没有既不违反现实客观定义,又可满足实际业务需求的解决办法呢?这点也是我希望大家可以讨论一下的。
0 请登录后投票
   发表时间:2007-03-04  
传入的是正方形的话是不会溢出的,因为判断条件不满足,所以啥都不做。
0 请登录后投票
   发表时间:2007-03-04  
哦,呵呵,写错了,不好意思,改一下
0 请登录后投票
   发表时间:2007-03-04  
关键在于概念没有搞清。
特别是用了容易混淆的术语命名。
如果将"长方形"改为"矩形",相信没有人会反对正方形作为矩形的子类。

长方形,从你给出的定义来看,跟矩形一样,但是,其中的“长”字,给出了一个边一定长的暗示,从而与正方形区分开。而矩形,说的是,四个角都是直角,就是一个更好的命名,更贴近本质。

从这个意义上说,为一个概念取一个精确的命名,是成功的开始。
0 请登录后投票
   发表时间:2007-03-04  
现实中只能说什么都不做,或者抛出operationnotsupportedexception.
我想这个exception创造出来就是做这个用的。
0 请登录后投票
   发表时间:2007-03-04  
引用

关键在于概念没有搞清。
特别是用了容易混淆的术语命名。
如果将"长方形"改为"矩形",相信没有人会反对正方形作为矩形的子类。


开始我和你所想的一样。于是我查了很多数学相关资料,这些资料的定义都是长方形=矩形,也因此才有我上面这一说法
0 请登录后投票
   发表时间:2007-03-04  
正方形继承长方形的问题,关键在于正方形有更强的约束。

比如给你一个长方形,长4宽3,我们很容易计算其面积为12;将长设置为5,则面积为15。

如果是一个正方形,边长4,我们也很容易计算其面积为16;如果将长设置为5呢,面积是25还是20?

楼主恐怕还是过于拘泥于阎博士的例子了。

正方形能不能继承长方形?还是根据具体环境决定吧。
0 请登录后投票
   发表时间:2007-03-04  
我觉得问题就在于Rectangle对象是可变的。只要有下列代码存在
Rectangle r;
r.setWidth(r.getLength());
// now what's the type of object r?

这个对象体系的设计就是有问题的。
0 请登录后投票
论坛首页 Java企业应用版

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