面向对象的疑惑(200分)

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个Employee类,它有两个链表用来记录Employee的排班表、考勤记录。这些排班表,考勤记录数据量很大。我每次实例化一个Employee类的时候是不是都需要把它的排班表、考勤记录都从数据库加载的内存中?但有的时候我根本不需要操作它的排班表和考勤记录啊!但不加载Employee又是不完全的!我希望使用Employee的程序只知道去它的链表里取排班表和考勤记录。 难道要有两个成员变量记录他的考勤记录、排班表是否加载的内存中?那样的话,如果在没加载之前,正好新增加了考勤记录,并且这些考勤记录已经存到数据库中了,这时我需要所有的考勤记录,是不是需要把链表中的考勤记录先删除,在从数据库中加载所有的考勤记录?
同样的问题还有:有一个对所有的部门抽象的类Department,它有一个链表记录他的子部门,我实例化一个部门时是不是要加载他的子部门?那子部门的子部门呢?如此下去,实例化一个最上层部门时岂不是要把整个单位的部门加载进来?
本来我分析是作的好好的,但为什么涉及到对象持久化问题是就这么麻烦?以前作程序,需要时就直接去数据库中取,增、删、改都对数据库操作就没这么多麻烦!
愁死我了!
 
设计类的时候要在抽象层次考虑嘛,不要考虑到具体的表呀,数据库啊
Employee员工类就考虑员工的属性,以及正对这些属性的操作,不要把所有操作都集中在一个类上
 
一个系统(不管多小),只有一个类是不够的,排班表、考勤记录的操作可以从员工类开展开来。
 
是呀,排版表和考勤纪录是单独抽象成类了,但他们是被一个员工包含的阿!实例化员工时不是要实例化排版表和考勤纪录?如果时,那是不是要加载数据?
 
//排版表和考勤纪录是单独抽象成类了,但他们是被一个员工包含的阿
谁包含谁啊? 应该是排版,考勤记录包含员工?

 
员工包含考勤记录和排班表阿,就是员工有一个对考勤纪录类的引用和排班表的引用
 
同意楼上的。如果一个类太复杂了就应该把它分离出来
 
如果更复杂了,那这种面向对象就没有必要
 
你的设计有问题哟,一个字“乱”!!
感觉是为了对象而对象,你试试画个UML吧,把对象关系理清楚
 
真正用的时候 再加载嘛!
 
用PROXY模式怎么样?
 
做成 property , Get 的时候再加载
 
涉及到数据库编程时,用PROXY模式,在敏捷软件开发一书中讲到是用一些原则来做分析,用模式来解决问题。
 
:-(,我还只会封装
 
有也正在做类似的东东,同时也有类似的问题。坐下来听听。
 
国外这个也很热门.
有几个Framework,如InstantObjects,现在成了OpenSource(http://sourceforge.net/projects/instantobjects/),可以看看它的示范录像.
 
不知道那位看过 Patterns of Enterprise Application Architecture ?
 
握有英文版的Patterns of Enterprise Application Architecture ,看了一点,太累,不知道什么时间出中文版?
 
来自其他的方的恢复
回复人: redguardtoo() ( ) 信誉:100 2004-06-08 14:12:00 得分: 0


类提供了一个接口供操作数据,而把数据隐藏起来,
你的employee类本身是否包含两个链表和类的接口无关。
按你的描述,我觉得只要保持接口不变,取消vector之类的缓存不就行了?改为直接从数据库中取数据。
class CImployee{
public:
void get_kaoqin()
{..here you search the database or vector anything you like..
}


Top

回复人: redguardtoo() ( ) 信誉:100 2004-06-08 14:28:00 得分: 0


还有部门,子部门的问题。
也许部门类不需要需要提供和子部门相关的数据操作,也就不需要提供接口,更进一步说,就可以取消类内的子部门数组了...
只有需要维持类不变式的操作才需要放在类接口内。
例如:
我最近写了个CWindow类,理所当然的有create_window(),destroy_window(),show_window()等操作。经过程序的不断维护,我取消了所有这些“理所当然的”接口,把他们移到了通用的windows操作内。只留下了改变窗体大小位置的接口,因为我之所以设计Cwindow类,就是为了改善输入法的composition window 和candidate window两个窗体的之间大小位置的*互相依赖*关系。
关于类设计可以参考Bjarne Stroustrup访谈录(http://www.artima.com/intv/elegance.html)
中文翻译见我的blog
http://redguard2.blogspot.com


 
对问题一
一个方法是只在需要的时候再读表,用完就删了.
方法2 使用singleton 模式 建立唯一表,所有Employee共享这个表类.变类的组合关系为类的依赖关系.减少类之间的耦合.
 
顶部