当你努力开发或理解一个程序设计时,“服务提供者”是理解对象的最好方式之一。你的程序本身为用户提供服务,它通过其他对象为它提供的服务来实现这一目的。你编程的目的便是创造(更好的是使用已经完成的代码库)一系列的对象提供解决问题的理想服务。
要想达成这个目标,方式之一就是问一问“如果你想像变魔术那样把他们从帽子里拿出来,那么哪个对象可以马上解决问题?”例如,假设你正在编一个记账程序,你要创建一些包含预定义的记账输入屏幕的对象,一些用来执行记账计算的对象,以及一个可以在不同打印机上打印支票和发票的对象。这些对象中的一部分可能已经存在,而其他对象则需要你去创建。这些对象看起来什么样?这些对象将提供什么样的服务?这些对象还需要什么对象来完成自己的责任?如果你坚持这么做,你最终就会到达这么一个节点,你会说“这些对象太简单了,我马上就能坐下来写代码了”或者“我确信这个对象已经存在了”。这是把问题分解为一系列对象的合理方式。
把对象理解为服务提供者会有额外的收益:它可以提高对象的聚合性。高聚合(high cohesion)是软件设计的基本原则:意味着软件的各个部分(如对象,尽管有可能是指一个方法或者是一个对象库)很好的“组合在一起”。人们设计对象时存在的一个问题就是把很多功能都塞进一个对象里。例如,在你的支票打印模块中,你也许会想你需要一个对象来实现所有的格式化和打印功能。你会发现这个对象太臃肿了,而实际上,你需要三个或者更多的对象来实现这些功能。一个对象可以用来作为所有可能用到的支票格式的目录,这个对象可以用来查询怎么打印一张支票的相关信息。一个或一系列的对象可以作为一个通用的打印接口,这个接口使用不同类型的打印机实现打印功能(但是这些对象都与记账无关,它更应该是通过购买获取而不是你自己去写代码)。第三个对象可以使用其他两个对象提供的服务来完成任务。因此,每一个对象都有它所能提供的服务的高聚合的集合。在面向对象的设计中,每个对象只需要做好一件事情而不是尽量做太多的事情。正如例子中展示的,不仅允许购买对象(如打印接口对象),也创造在其他地方可以复用的新对象(如支票格式目录对象)。
把对象作为服务提供者来对待是一个伟大的简化问题的工具。不仅仅在设计代码的过程中很有用,而且当其他人尝试理解你的代码或者复用对象的时候也是十分有用的。当他们发现这个对象是基于它提供的服务所设计时,在其他地方进行复用会变得更加简单。

被折叠的 条评论
为什么被折叠?



