软件体系结构:二维分层、模块化和开放平台
先引出几个问题。首先,对于分层,如何来分层?仅仅纵向分层是否够用了?什么是“二维分层”呢?一提到模块化,很多人会说“我们的系统就是基于模块化来构建”,稍微一多问,要么和分层差不多,要么就说我们是基于一个又一个的dll文件来实现模块化的,那应该怎样才算模块化呢?“开放平台”怎么回事?
关于“二维分层”软件体系结构的提法比较少见。不过,对于分层软件体系结构,估计是个傻子都知道。“模块化”也是傻子都知道的一个词,软件工程最经典之一的词莫过于“高内聚、低耦合”。
在我个人看来,软件体系结构不是套路,而是根据实际应用系统的需求来确认的,甚至有时候需要根据实际情况来组合使用经典的“三层”、“管道”等软件体系结构风格。但不管怎样,从最最抽象的角度来看待一个软件系统时,软件系统就可以抽象成如下的结构,即应用系统总是由一个又一个功能构成的,而每一个功能总是由一段又一段的代码来构成的。
在这里每一个功能的代码段并不完全一致,当我们应用传统的分层软件体系结构来设计应用系统时,我们总是需要预想整个应用系统大致的代码,然后为大致的代码做一个归类,从而制定每一个层次大致的功能及其规范,每一层次一般也就包含了相应功能的代码段,理想状态下,这样的体系结构可能如下。
聪明的你肯定看出来,为了使用统一的分层架构来设计所有功能,那么在一个层次都必须包含了不同模块相似逻辑代码,那就有可能出现一种情况,就是一个层次在不同模块的编码实现复杂度也不一定相同,比如在上图的层N设计中,功能2的代码段N要比其它两个模块的代码段简单的多得多,如果这种异常情况在一个应用系统出现多次的话(特别是在大规模应用系统,这将是很常见的事情,就像原来我在Sybase工作时,数据管理、数据监控、数据复制等功能的复杂度都不一样),为应用系统统一设计的分层在异常情况下就显得特别的别扭。因此,我觉得在这种情况下,仅关注代码纵向行为而设计的分层软件体系结构是不够的。除了考虑纵向代码行为,我们还需要关注软件系统的整体功能。从“二维”的角度分解软件,“二维”的核心就是:从横向维度考虑软件系统的功能组成,从纵向维度来考虑每一个功能的代码行为,将若干个功能组合在一起作为纵向分层的单元,即“将若干功能横向切割成不同的模块,对每一个模块进行统一的分层架构”。
关注“二维”的分层软件体系结构会使架构的设计更加适合实际应用系统,不过,需要注意的是,横向维度关注的是应用系统的功能,因此,横向切割必须以功能为单元来组织,这也就意味着,模块是由若干个功能构成的。这样,构建的模块间的依赖也比较小。这话的意思,就是要强调,模块不是以纵向层次来划分的,因为纵向层次具有很强的代码依赖关系,一般而言,上层是完全依赖于下层的。
关于分层的话题,本文就描述到这里,欢迎大家能围绕这个问题继续展开。接下来,我们再来谈一下模块化。
在我给客户推荐OSGi模块化的优点时,很多客户会说“我们的应用系统就是基于模块化来构建的”,好,那我们来交流一下模块化。一旦深入讨论之后,就会发现不少客户的模块化就是所谓的分层,或者所谓的程序集就是模块化。而一旦再深入讨论模块的可复用性、隔离性、可维护性和隔离性时,客户会简单的说,我们拷贝代码或者拷贝dll过来就复用了。如果再深入问下去的话,会发现并不仅仅拷贝就解决了复用的问题,在拷贝的同时需要大量的修改。呵呵,这非常的有意思,:)。关于模块化,我非常推荐OSGi规范(我们也实现了OSGi.NET规范)提倡的模块化。在这里的模块,是一个完全物理隔离,可以动态部署、动态更新、动态卸载、动态启动与停止,所有的模块都可以躺在模块仓库中,以备我们真正使用“搭积木”的方式构建系统。从OSGi的角度来看,我们可以为应用系统设计一个大致通用的企业级总体架构,如下所示。这个架构实际上,还可以设计的更加开放一些,可以适合于传统软件和目前流行的云计算软件以及开放平台软件的构建。
在这个系统架构图中,一个应用系统由客户端、服务端、模块仓库三部分构成。客户端和服务端基于模块化构建,相应的模块称为功能模块和服务模块,这里面的模块均从模块化仓库获取,可以实现自动更新、远程动态管理与部署、模块多版本并存。每一个功能模块按照要实现的功能复杂度进行个性化的模块体系结构设计。这是一种理想化的状态,正如《未来10年:OSGi、Spring DM》作者罗时飞描述的OSGi提倡理念一样。事实上,我的老雇主Sybase也是基于这样的思路来构建Sybase Central和Sybase Control Centre产品的。
目前我团队也在致力于在.NET平台上实现这么一个理想化的模块化平台,并基于这个模块化平台实现一个“大和”的统一开放平台,目前已经取得了不错的进展,该平台的体系结构如下所示。
我们希望通过这个平台来集中广泛的开发者们的聪明才智,构建一个庞大的插件仓库,让不同的开发者、不同的最终软件客户都可以从这个统一开放平台受益。这样构建的软件系统才是我心目中最理想的真正的“模块化”!
当然,很多事情都是说起来容易,做起来困难,不过,这并不代表不可能,至少我们已经通过一点一滴实践了这样的模式。文中的描述也可能疯狂或者有偏差,欢迎任何指正。
转自:道法自然 ? http://www.cnblogs.com/baihmpgy/archive/2011/05/22/2053742.html