您的位置:首页 > 其它

面向对象技术伪术语--主动对象的批判

2006-12-15 12:32 597 查看
面向对象技术伪术语--主动对象的批判

按照清华大学出版社绍/杨二人的《面向对象的系统分析》一书,主动对象是一组属性和一组服务的封装体,其中至少有一个服务不需要接收消息就能主动执行(主动服务)。另外一种就是被动对象,需要通过消息的驱动才能执行。该书中给出一个例子,比如哨兵站岗并对发现的情况主动报告。主动对象一般被实现为进程或线程。

我认为这种把对象分成主动对象和被动对象是错误的。因为按照面向对象的理论,所有动作都是消息响应的结果。哨兵站岗也是司令部发出了指令让其站岗。哨兵主动报告也是因为他发现了情况,也就是得到了(比方说敌人潜入)消息。所以一个看起来像主动对象的对象,只不过是其服务过程较长。在其服务期间如果发出消息给其他对象就好像是其主动发出的消息罢了。

再举一个被认为是被动对象的售报亭的例子。客户到报亭买报纸,客户发出要买报纸的消息,同时给出消息参数既要买的那种报纸。售报亭给出响应该报纸的价格。然后客户给钱,售报亭找零。这么看来售报亭是一个被动对象了。别急,如果售报亭无法找零,那它是否要主动发消息告诉客户多卖一份报纸或者让客户找找看自己有没有零钱。有人会说,这个消息其实不是售报亭主动发送的,是要系统预先设置好规则的。好吧,接着看下面的进展。售报过程不总是那么顺利。比方说有的客户挑报纸就要挑很久,有时候找零也会耽搁很多时间。如果总是前面的客户买完了报纸,后面的客户才能被服务,那这个售报亭可能要排很长的队。为了提高效率,售报亭决定允许多个客户同时买报纸。现在售报亭的运行方式如下:如果没有客人,售报亭不运作(售报员可以睡觉,呵呵)。如果来了第一个客人要买报纸,售报亭接受该消息开始运作。如果这个客人买完报纸后没有其他客户光临,售报亭可以再次休息。如果排队的客人多于2个,当一个客人还在考虑的时候,售报亭主动询问后面的客人要买什么报纸。那么这么一个售报亭是主动对象还是被动对象呢?如果没有客人,它完全不运行。它应该不是主动对象。如果只有一个客人,它的操作流程完全的询问应答型,应该也不是主动对象。如果有多个客人,这时那会主动询问客户,这时候看起来是主动对象了。

这么看来,一个对象,它的服务正在执行,那么它就是主动的。它的服务未被执行,那它就是被动的。所以根本就不应该使用主动对象和被动对象这种术语。而线程完全是另外一个领域的概念。如果一个对象的服务执行需要较长时间,可以将其放入单独的线程中执行,提高CPU利用率。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  出版