(2)地图(map)模式
所谓“按图索骥”,地图就是一种指南,一个路标,通过它可以带领我们通向预定的目标。地图模式的软件隐喻具有指引性和启发性,它借助隐喻的象征意义帮助软件开发人员直观形象地理解艰深晦涩的软件概念,这在一定程度上降低了学习曲线和沟通误差。
最为常见的地图模式的软件隐喻是“软件开发生命周期”,它以生物学的概念对软件开发的整体阶段进行隐喻,从而形象地表达了一个具有起点和终点的软件开发过程,正如一个生命的诞生和衰亡。在关于软件开发生命周期的分类中,甚至大量使用了隐喻,例如瀑布模型(waterfall model)、螺旋模型(spiral model)、喷泉模型(fountain model)以及迭代模型(iterative model)或增量模型(incremental model)。
以瀑布模型为例,隐喻的含义即明确地体现了自上而下、不可回溯的本质。它将软件开发生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,并且规定了它们自上而下、相互衔接的固定顺序,如同瀑布流水,逐级下落。迭代模型或增量模型则体现了迭代与增量的特点,它否定了“瀑布”隐喻不可回溯的特质,认为这对需求不断变化的软件开发而言是存在弊端的,它将软件开发看作是一种渐进的过程,这种演进式的开发方式,更利于应对需求的不断变化,也便于架构师驾驭整个系统的体系架构。迭代的隐喻体现了在软件开发生命周期中,“需求定义、设计、实现和测试并非顺序的,而是相互重叠和迭代发生的”。
增量的隐喻则表现为软件产品以渐增的方式完成。利用增量式开发,每一步增量实现了一个或多个最终用户功能,每一步增量包含所有早期的已开发功能集加上增量的新功能特性。系统在逐步累积的增量中增长,这就使得整个软件开发过程是可控的、可视的。 极限编程(eXtreme Programming)的系统隐喻同样体现了地图模式的特征。从项目开发的整体角度来看,系统隐喻就像一个航标,指引设计和重构的方向。
正如Kent Beck的定义:系统隐喻是一种描述,每个人员——客户、程序员和管理者——都能使用它来讲述系统是如何工作的。这种描述就是地图的展现,项目组成员依据系统隐喻有效沟通,并在其指引下达到共同的项目目标。系统隐喻能使项目中每个人在系统如何工作的问题上达成共识,有助于拟订一个表示各对象及其关系之间的命名系统;隐喻能够帮助发现有关系统的一些新的知识,它既能反映系统的静态特性,又能反映动态特性,从而反映整个系统的体系结构。
(3)图示(diagram)模式
图示代表具体而形象的指示,它着重体现事物的细节与实现,正如细致而准确的建筑设计图或者机械设计图。图示模式的软件隐喻表现为一种软件模型、软件规范和实现细节。例如架构模式的分层模式(Layers Pattern),其中的“分层”就是一种隐喻,通过将不同功能的对象划分到不同的层次。架构中的每一层都是内聚的,并具有相同层级的抽象。分层模式具有强烈的标识作用,软件设计人员与开发人员通过该隐喻就能够确切地知道具体的解决方案。
在GOF提出的设计模式中,大量地运用了图示模式的软件隐喻,例如工厂方法(Factory Method)模式、装饰者(Decorator)模式、门面(Facade)模式以及观察者(Observer)模式。工厂方法模式将创建者与被创建者隐喻为工厂和产品,引入了生产线的象征意义。装饰者模式将动态地给对象添加额外的职责隐喻为一种装饰,这种装饰行为形象地体现了职责的叠加与组合。门面模式为子系统的一组接口提供了一致的界面,就像门面一样,只暴露调用者需要的接口,从而化繁为简。观察者模式引入观察者的隐喻,以表现对象之间的依赖关系。当被观察者的状态发生变化时,观察者能够实时地获得通知并自动更新。
图示模式的软件隐喻通过贴切的修辞,帮助人们理解隐喻事物的含义。例如,对于设计模式的初学者而言,隐喻可以帮助他们直观形象地理解该模式的具体目标以及应用场景。同时,图式模式的软件隐喻还有利于沟通。在讨论设计方案时,如果双方都熟悉这些软件隐喻,就可以省略对具体实现细节的讨论,且不至于出现理解上的偏差。