16.3 横看成岭侧成峰
我们很多人都有表,它们形形色色,各种各样,有的是用于装饰的,有的是可以在水里显示时间的,也有的是专门记录体育比赛时间的……,我自己也有一只表,让我来说说它的功能吧。
我的这只表有闹钟的功能,可以提醒我上班不要迟到;能播放MP3,我可以用它听音乐;使用它还能查阅各种文件,还能照相留念;这些还不够,我的这只表还提供上网浏览网页和收发电子邮件的功能,让我随时随地都能工作(我不是工作狂,千万别凭此判断);这些还不够绝,更绝的是,我能用它收发短信,接听电话。
全世界有数以亿计这样的手表,我相信你也有块这样的手表,只是在日常生活中,我们大部分人把它们叫做手机。自从我有了手机后,我再也没有用过手表了,每当有人向我询问几点时,我都会拿它看时间。它到底是手表还是手机呢?
苏东坡当年在游览庐山时,被美景所迷,“往来山南北十余日”后,终于做出“横看成岭侧成峰,远近高低各不同”的诗句。当然他在那里的寓意和我这里的用意并不相同,我在这里要强调的是,站在不同角度分析事物时,事物所呈现的形态不尽相同。从某种角度来认识手机,它就是“手表”。
这么说的目的并不是不去认识必要的手机特征来完善一个合理模型,而是强调让那些不相干的信息别去干扰我们对模型的认识。那么在抽象一个时钟系统的模型时,手机的通话功能对我们来说是无用的,不需要去提取一个通话模型,所以,而手机和时钟之间的关系可能如图16-3所示。
图16-3
在软件设计过程中,即使对于同一事物建模,也不一定能够使用相同的模型,因为你站的角度不同。譬如,在一个简单的工资系统里,经理的角色和其他员工的角色没太大的区别,每个月都需要给他们账户发钱,工资系统不需要了解经理下属有多少职工,而在职工管理系统里,我们需要知道经理下属有多少职工,所以二者模型并不相同。甚至在同一个应用里,相同事物的模型也不一定完全相同。Eric Evans在“Domain-Driven Design:Tackling Complexity in the Heart of Software”[1]对此进行了更为深刻的探讨。
[1]参见“DomainDriven Design:Tackling Complexity in the Heart of Software”,Part IV:Strategic Design的Chapter Fourteen.Maintaining Model Integrity一章,指出一个复杂的应用里,实现相同的领域模型非常困难,往往存在多个领域模型。