软件系统复杂,分而治之,每个部分就叫组件。组件对内隐藏职责的实现细节,对外通过接口和系统其他部分交互满足自己的目标。基于组件的软件开发就是在理解系统将要做什么后,捋出需求,把需求全都映射到组件,设计实现和测试配置发布。假定一个酒店管理系统,组件如下图:为顾客和员工提供的功能组件有订房,入住和离店。顾客屏幕和员工屏幕展示信息,预订和房间组件维护在数据存储中的信息。
基于组件开发的软件系统可以从2个维度理解,横向维度是系统能完成的功能点和纵向组件。一个功能点通常跨越多个组件,而每个组件通常也是承载多个功能点的部分实现。
上图三个功能点,订房间,入住客人和客人离店,每个功能点都横跨多个组件,称为tangling缠绕,一个组件包含有多个功能点的部分称为分散scattering. 功能点的实现在组件里没有严格分离,扩展系统的时候,扩展的组件也不能完全从要扩展的组件完全隔离开来。
系统增加排队排队功能,顾客订房功能若没有满足条件的房源是进入列表排队。扩展的排队列表组件对订房组件扩展,多少要在订房组件某个地方插入些代码,称为侵入式代码。系统加入新功能点,这种侵入式代码让人异常痛苦。
英文concern表示系统需要提供的功能点也称痛点,requirement则指系统内部需要实现的点. 功能点(痛点)表示软件系统外部对系统的关注点,需求表示软件系统内部一个开发环节,对每一个功能点(痛点)的需求,分析,设计,实现,测试,发布,配置环节都分离到完全独立的模块里,是本书介绍AOSD想要的效果,所有独立的功能点(痛点)模块最后通过组合机制合成一个可执行的运行程序。
用例技术能帮助痛点在开发过程的分离与组合。