[讨论]关于一个设计方面的问题――主动对象和被动对象中的方法定义

    
smalldeer
04-12-07 7 724

[讨论]关于一个设计方面的问题――主动对象和被动对象中的方法定义

人 能开车 主动的
车 能开动 被动的

人有开车的能力,但车不能自己开,需要人去开

突然想到个问题,“开”这个方法run(),是写在主动类People中,还是写在被动类Car中
有点疑惑了,以前会习惯性的写在Car这个类中,但现在想想,run这个动作发出者是人,车是被动的,车不能自己动起来,需要人给它这个动作

是不是想太多了,
run如果写在People类中,那Car类怎么样获得方法
run如果写在Car类中,那People中怎么样去触发这个动作

哪种更合适,或有其它更好的处理方法

想法还不是很成熟,请大家指教了

谢谢

ljshan
2004-12-08 10:14

这要看所分析的对象和问题是什么了,如果你研究的问题是人能做什么事情(包括开汽车,骑自行车...),最好是将drive(Object tool)操作给people,因为操作一个工具可能需要很多个步骤,比如开车:需要发动机、油门、刹车、方向盘各个部位的配合,又比如骑自行车:需要协调踏板、扶手、变速器等。这时汽车本身只要关心各个部位具体如何操作就行了。按照CRC的思想,R的分工是:people负责开车,车子负责各个部件的操作。换个角度如果你研究一部车子是被people开还是robot开(注意这里people和robot没有任何共性),这时可以将drive(Object driver)操作给car。其实话又说回来,考虑到实现需要(重用, 多态等等),drive操作给谁都可以,只要从业务角度好理解就行。

Kidwish
2004-12-08 12:33

当然是人开车了, 你见过车开人吗? 笑!

代码可能比较直观一点:

class People{

Car bmwCar;
...

public void driveCar() {
bmwCar.run();
}

}

class Car{

public void run() {
...
}

}

kewan
2004-12-08 20:27

基本同意Kidwish的分析。如果要定义一个接口,去除人和机器人的区别,那么不应该定义为People,而应该是Driver。Driver责任是drive(Car car),Car的责任是Run(Road road). 二者协作则是:

public void drive(Car car){
Road road = pickRoad();
car.run(road);
}
这样是人还是其他东西开车都没关系了。也不一定是Car, 定义为Vehicle可能更加合适。

kewan
2004-12-08 20:32

另外提出主动对象和被动对象的区别,不利于面向对象的分析。因为在面向对象中,我们主要考虑的是该对象的责任,被动对象的观点则不利于这样的分析。

2Go 1 2 下一页