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

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

人 能开车 主动的

车 能开动 被动的

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

突然想到个问题,“开”这个方法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 下一页