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