纵切与横切

品雪 2000.8.12
pinxue@hotmail.com http://pinxue.yeah.net

在软件工程的设计阶段的一个重要的任务就是工程的分解与分配,及制定开发进度的跟踪与控制方案。而这一任务有两种方式进行:纵切与横切。

何为纵切?即将系统分割成若干相对独立的模块,然后将各功能模块分配给开发售货员通过适当的功能实现顺序安排也可以很好的实现增量开发。该方式对于具有大量功能特性的系统的开发计划制定较为直观。并且随着开发进展,很快就能得到一个有一定功能的可运行的系统,开发-设计-分析的反馈进行得较早而深入,能够及时发现设计乃至分析上的问题,系统整体失败的风险较小。但很难获得完整清晰的体系结构视图,集成时易出现各种预料不到问题。

而横切则根据对象之间的关系将系统分为若干层,可参考ISO/OSI7层模型,将各层分配给开发人员。该方法较符合OO思想,每一层通过接口通信,体系结构清晰。然而如果设计有缺限则要到很晚才会被发现,如何调整设计粒度保证的稳定性是一个经验性极强的任务。如果设计出的模块能够用于模拟,即预演可能发生的情况,那么风险会小很多,否则层间接口的一个小修改将会牵一发而动全身。显然,变化的跟踪、记录、实现也是相当复杂的。这也就意味着横切的风险相当高,分析要确保没有遗漏可能引起体系结构重大变化的用例,设计要确保类/层间接口提供了功能完备、形式恰当的方法,特别是不能形式错误或功能有误的方法,删除或修改接口的方法要比增加方法复杂得多。尽早投入上层的开发是十分必要的,它可以尽早找出系统中可能存在的问题,所以在开发中,低层应该尽可能利用现有的产品、技术。

简单的看,纵切适合做项目,而横切适合做产品。两者的差异有点象编程时是写一段调通一段还是基本写完再调试。

而纵与横是对立统一的。横切可以解决系统结构的问题,但要便于安排、跟踪开发进度、减少变化引起的风险,还得靠纵切。纵切常用的方法是使用Feature List,而横切则常用Use Case驱动。Feature List适合外部对象不多而其行相当复杂的系统,而use case 则是分析复杂系统的利器,不过完全use case 描绘具有成千上成个小Feature的系统似乎是不够方便的,或者使用大粒度的use case,然后为use case列出Feature List会方便许多呢。

在横切的每一层内做纵切则是必然的,在use case驱动的工程过程中是通过将use case分组的方法进行纵切的。