数据元素,而方法( method,指属于这个对象的函数。它接受你传给这 个对象的消息)则列在方框的底部。通常UML的设计图只会显示类的名字 以及 public方法,所以中间部分是不显示的。如果你只对类的名字感兴 趣,那么最下面的那部分也可以不显示。 对象会提供服务 当你开发一个程序或者分析一个程序的设计时,理解对象的最佳的方式是 把它们当作“服务的提供者”。程序本身会为用户提供服务,而它通过使 用其它对象所提供的服务来完成这个工作。你的任务是制作(或者在更理 想的情况下,从现有的代码厍中找出)一组能为解决问题提供最佳服务的 对象 这么做的第一步是问“如果我可以像变魔术那样把东西从帽子里拿出来, 我该拿出些什么东西,哪些对象能立即帮我解决问题?”举例来说,假设 你要创建一个簿记程序。可能你会想应该有一些保存预设的输入界面的对 象,一组进行簿记计算的对象,以及一个能在各种打印机上打印支票和发 票的对象。有些对象或许已经有了,但是那些还没有的应该是什么样的 呢?它们应该提供哪种服务,还有它们要完成任务的话,又该用哪些对象 呢?如果你不断分析下去,最终你会发现,不是“那个对象写起来很容 易”就是“那个对象已经有了。”这是将问题分解成一组对象的一个合理 的方法 将对象视作服务的提供者还有一个额外的优点:能提高对象的内聚性 ( cohesion)。内聚性高是高质量的软件设计一个基本要求:就是说软件 的各种组件(比如对象,也可以是方法或类库)应该能很好的“组装在 起”。设计对象时常犯的一个错误就是,往对象里塞了太多的功能。举例 来说,设计支票打印模块的时候,你也许会决定设计一个能通晓所有排格 式和打印工作细节的对象。很快你就会发现这个任务太艰巨了,或许应该 用三个或是更多对象来完成这个工作。第一个对象应该是支票格式的目录 册,通过査询这个目录册可以获得该如何打印支票的信息。第二个对象, 或是一组对象,应该是能分辨各种打印机的通用的打印接口(但是对簿 记,它一窍不通——这个模块应该买来而不是自己写)。以及使用上述两 个对象所提供的服务的,能最终完成任务的第三个对象。由此每个对象都 提供一组互补的功能。在一个良好的面向对象的设计中,每个对象都应该 只作一件事,并且作好一件事,而不是去作太多的事情。就像这里看到 的,这样不仅能发现哪些对象应该买(打印机接口对象),而且能设计出今 后能复用的对象(支票格式的目录册) 将对象视作服务的提供者还是一种很了不起的简化工具。它不仅在设计过 程中有用,而且还能帮助别人理解你的代码或者复用这个对象——如果他 们认同这个对象所提供的服务的话。将对象视作服务的提供者能使对象更 容易地被用于设计。 第6页共34页shhgs@wgqqh.com 6 ✁ ✂ 34 ✁ 6 ,ÛÜàµ(method)) ×¥V(d,A$%¡¬ ×¥V()0¾Fµb(h· U M L ([1Ëóº×/(ÑK EP p u b l i c µDE*4X×(ÄÅ¡ó¥/(ÑKef gYZbƶ(Y[ÝEX× ¡ì3×âh|3×âh([1¢£¥V(bh(µ´ PA 1Í jþ(Ïâh pº0jþàA^ç §A¥VD(jþQ ×y1¡(þn1(|F¢ |([Æím(pi*j! )3-;£Nbhjþ( ¥V ZT(3Í ÄÅÝE}ák±Y¦PlË@!Q w@!ÌZmÌ¥V; no£NÊÏBâQ$Z[ ¡%3×pqâhÝ;¡º|vwm3Ìù?[(rt»¶(¥ V3-tEpq12(¥VEP3×;FÚ]s3J]stuì u(¥VmÌ¥V|ôõm,YÌm(vwZ¦( QÊAvwmjþmA%þ(üwmÌ¥V QÊÄÅ¡XvÆJb:¡ºìíXÍ Y×¥V«9QR SÏÍ Y×¥Vôõm,Ï £3-¥V(3×¢ (µ ¥V·1jþ(m3×;½(wC7;©¥V(x (coh esi on )x©©(yÅ[13×Y %7$yÅ (Ú-Å(8Ä¥V[ÝEµ|/i)vw;(Í -zF3 9Ï[1¥V·{(3×Ó|Þ¥VË},ÉV(ô;Bâ Q$[1tu]s~(M¡[ºNO[13×;Dmè ´]sy1uv(¥Vs¡ºìí ×þÉ,|vw L×|V¥VQ ×y13×¥Vvwtuè´( ^H
×ÝEówÄ]stu(×¥V |3-¥Vvw;Ú]s3((]s$X (¥p qA3Xyy ×~vw5QàXýþ« )EPçJe ×¥VD(jþ(;b:þ(L×¥Vçòê×¥VÆ 3-e(ô;F3×(¶U¥V([1*ê×¥VÆvw ó13Åk13ÅàXJ1ÉV([} Ë<g ( ¦XÇ;ìímÌ¥Vvw5 (]s3$X¥V)àk;[1!d ;(¥V(tuè´() ¥V·1jþ(3,X9( NyAAXÇF[1^ â*màk;o¼ª¢£¡(p| ×¥VyyÄÅG Ù ×¥VD(jþ(¥V·1jþ(;ç¥V RSr=)[1