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

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

凤舞凰扬
2004-12-13 17:03
恕我直接,楼上的命名实在有些搞笑,呵呵。

其实,在进行OOA/OOD的时候,怎么会有去考虑主动对象和被动对象的概念呢?方法是什么?在OO中,它是对象说具有的操作(或者直白地说是一种能力),是名词,而不是动词,名词还有主动和被动的差别么?

方法只有在所在对象被实例化,方法被激活,也就是调用的时候,才是一个动词的概念。

比如说car,具有方法run,是理解成car具有运行的能力,至于随去开它,谁去执行它,那是别人的事情。不会有什么car.run(road)这样的方法的。

凤舞凰扬
2004-12-13 17:07
方法一般以动词开头,并不代表方法就是动词,在做对象设计,而不是考虑具体实例的时候,它更准确地应该理解为对象说具有的操作。而操作本身在执行情况下是完全可以主动或者被动的(也就是执行操作的对象可以是自己也可以是其他对象),也就是Sequence Diagram的message和self-message。不过,这不是说,对象有什么主动和被动的概念。

banq
2004-12-13 19:58
我有些明白楼主的主动对象和被动对象意思,实际是功能性Java类和数据Java类的区别。

功能性Java类,我们称为Service、或者是business Object;数据Java类通常表现数据模型或domain Model,它的持久化有o/r mapping、CMP,SQL等方式,数据库是数据Java类的持久化表现之一。

功能性Java类可使用UML顺序图表达。

而数据Java类可使用类图等UML来表达。

访问者模式中,主动对象和被动对象意思更加明确。

猜你喜欢