4+1视图分析

一、4+1视图来历

1995年,Philippe Kruchten在《IEEE Software》上发表了题为《The 4+1 View Model of Architecture》的论文,引起了业界的极大关注。
后来,Philippe Kruchten加入Rational,他的4+1视图方法演变为著名的、为许多架构师所熟知的“RUP 4+1视图方法”(如下图所示)。
RUP 4+1视图的说法是:逻辑架构、实现架构、进程架构、部署架构。

概括而言:
逻辑视图(Logical View),设计的对象模型。
进程视图(Process View),捕捉设计的并发和同步特征。
部署视图(Deployment View),描述了软件到硬件的映射,反映了分布式特性。
实现视图(Implementation View),描述了在开发环境中软件的静态组织结构。
用例视图(Use-Case View),该视图是其他视图的冗余(因此"+1")。

Philippe Kruchten 4+1视图最初的“+1”,指场景视图(如下图)。RUP 4+1视图的“+1”,指用例视图(参考上图)。

二、4+1视图之父谈视图

那么,什么是软件架构视图呢?Philippe Kruchten在其著作《Rational统一过程引论》中写道:
一个架构视图是对于从某一视角或某一点上看到的系统所做的简化描述,描述中涵盖了系统的某一特定方面,而省略了于此方面无关的实体。
软件架构的每个视图分别关注不同的方面,针对不同的目标和用途。也就是说,架构要涵盖的内容和决策太多了,超过了人脑“一蹴而就”的能力范围,因此采用“分而治之”的办法从不同视角分别设计;同时,也为软件架构的理解、交流和归档提供了方便。

三、视图的另眼解读

来看一个生活中视图的例子。我们只有一个地球,但不同的时候我们会关心世界的不同问题:例如下图(世界人口分布图)是社会学家关心的,而气候学家则更关心下下图(世界年降水量分布图)。

其实上面就运用了“视图”作为手段,用不同的视图来刻画我们这个世界的不同方面。如果你喜欢,你完全可以将“世界人口分布图”称为“世界的人口分布视图”。这里引入视图的作用在于:世界地图的绘制者很难将不同的信息都绘制到同一幅图中;而看地图的人也希望有一幅地图是专门针对他的需要的。
而且,更进一步而言,同一事物的不同视图之间是有联系的。对比上面两幅图,除了南美洲之外基本都是降水量足的地方人口较密集——多好的例子呀!于是不难理解:软件架构的不同视图之间也存在相互影响。

四、4+1视图如何指导架构设计

因为实践需要,所以多视图必要。正如“纯理论曰架构设计即切分<---->多视图<---->现实是架构设计涉及面广”所总结的那样,4+1视图方法告诉我们【通过哪些视角、每个视角关注什么】,以此指导架构设计实践。
RUP 4+1视图的说法是:逻辑架构、实现架构、进程架构、部署架构。
Philippe Kruchten 4+1视图的说法是:逻辑架构、开发架构、进程架构、物理架构。
本“4+1视图剖析系列”沿用更普遍的说法:逻辑架构、开发架构、运行架构、物理架构。

  • 逻辑架构。逻辑架构关注功能,不仅包括用户可见的功能,还包括为实现用户功能而必须提供的“辅助功能模块”;它们可能是逻辑层、功能模块、类等。
  • 开发架构。开发架构关注程序包,不仅包括要编写的源程序,还包括可以直接使用的第三方SDK和现成框架、类库,以及开发的系统将运行于其上的系统软件或中间件。开发架构和逻辑架构之间可能存在一定的映射关系:比如逻辑架构中的逻辑层一般会映射到开发架构中的多个程序包;再比如开发架构中的源码文件可以包含逻辑架构中的一到多个类(在C++里一个源码文件可以包含多个类,即使在Java里一个源码文件也可以同时包含一个类和几个内部类)。
  • 运行架构。运行架构关注进程、线程、对象等运行时概念,以及相关的并发、同步、通信等问题。运行架构和开发架构的关系:开发架构一般偏重程序包在编译时期的静态依赖关系,而这些程序运行起来之后会表现为对象、线程、进程,运行架构比较关注的是这些运行时单元的交互问题。
  • 物理架构。物理架构关注“目标程序及其依赖的运行库和系统软件”最终如何安装或部署到物理机器,以及如何部署机器和网络来配合软件系统的可靠性、可伸缩性等要求。物理架构和运行架构的关系:运行架构特别关注目标程序的动态执行情况,而物理架构重视目标程序的静态位置问题;物理架构还要考虑软件系统和包括硬件在内的整个IT系统之间是如何相互影响的。

总结:一物看不清,就多角度看;多角度看一物,不同视角会相互影响。