Posted on 2007-07-26 20:46
冰浪 阅读(1154)
评论(2) 编辑 收藏 所属分类:
Java
今天开始做一个新的模块,叫“时限监察”,这个模块的功能是要对“办件处理”的处理情况进行一个监察工作。也就是说两者是紧密相关的。而我要做的工作就是针对办件处理的结果或者说是记录进行一个过滤汇总,并对有关的记录进行处理。如某些办件未能按时处理的,我就可以对此办件记录进行通知,提醒相关人员进行处理。
首先说明一点的是,有一个VO对象,在公司的产品开发框架中是一个值对象,但这个值对象并不是简单功能角色上的VO,而即做为数据持久化操作中与数据库表进行对象关系映射的ORM Object,也是作用显示层中的View Object,在这里我不讨论此设计的优缺点,这不是我要说的方面。
在办件处理模块,某同事已经创建了对应的VO,在这里我称之为APVO吧,而我在时限监察模块也需要用到它数据表中的数据,进行办件情况的列表显示,所以APVO对我而言是很有利用价值的,如果我能利用它,那我就需要重复创建此VO(或者说是其中大部分属性)的工作了。对于此,我首先想到的是创建一个自己模块的LMVO,并继承APVO,这样,我既可以拥有自己的私有成员,也可利用到APVO中的所需要成员属性。如果这要求能够实现,那么我就可减少不少工作量,而对于面向对象开发方法中也是常见的情况。
正当我这么做时,却发现了一个问题,APVO中的成员属性的访问域全是“private”类型的,这让我大失所望,我无法继承这些成员属性!
一般情况下,我们都习惯性将类成员变量的访问域设为private类型,然后提供Setter和Getter方法,这样的做法,我们也通常认为是比较安全的作法,是符合封装性要求的。但这样的做法,让很多没有必要进行private封装的成员变量永远地失去了再利用的可能。在这种情况下,如果我还是不想重写这些成员变量的话,就只能是直接用APVO,并在其中加入我更多的成员变量,但这并不我所希望的。也许你会说,“不用继承,可以用组合,而且组合优于继承,不是吗?”这句话本没有错,一般情况下可以这么法,而且最好这么做。但在某些情况,组合无法实现我的要求,就像在公司的开发框架中就无法进行,VO中的成员变量只能是简单的数据类型,如String,这样在进行数据库操作时可以顺利地对其取值和赋值,但如果组合了另一个VO对象的话,这个VO对象却无法进行取值和赋值。
所以,在设计类时,要考虑到类的复用,所以对其成员变量的访问域控制上,不要一概地设成private。我们可以设为protected或者是默认访问类型。单是这么做并不够,我们还是要考虑安全性,也就是访问控制。所以我们还要对其所在的包的结构进行设计。
我们不要简单地按功能模块的方式来设计包,要考虑到模块间的逻辑关系,让有关系的模块的包设计成“父子包”的形式,而不是按功能模块简单地设计成平行结构,这不利于类之间的交互,也只有这样,我们在前面说的设计类成员变量的访问域才变得有意义。
如前面我提到的例子,我可以将我自己的包置于APVO所在包的子包下,再让APVO的成员变量的访问域声明为protected,此时我将自己的LMVO继承APVO,这不再行不通了!