【IT168 专稿】
大多数的开发人员在讲DRY (Don't Repeat Yourself) 的时候大多认为DRY是功能和代码的重复,也就是OAOO (Once And Only Once),其实不尽然。面向对象设计提倡的OAOO,强调的是利用面向对象的继承、组合等特性尽量让一个功能点只存在一个地方,所以OAOO强调的是面向对象设计,以及功能代码方面。而DYR的范围比OAOO要广泛得多。DYR更多的是一种架构设计思想,在软件开发过程中的万事万物均可能重复,大到标准、框架、开发流程;中到组件、接口;小到功能、代码均纯存在自我重复。而DYR提倡的就是在软件开发过程中应消除所有这些自我重复。
在软件过程中的自我重复,总的来说有五种类型:
(1) 一件事物,有多种的不同语言和方式来表达,不同的角色采用不同的语言去描述同一事物。在这些角色之间需要协同工作时造成的重复。
比如,架构设计师用一种语言和方式描述其架构设计,可为PPT、Word文档、Visio、建模工具等。开发人员的工作语言则是程序代码。两种角色描述的是同一事物,只是描述语言不同而已,这样造成架构设计师的架构输出,不能作为开发人员的开发输入,而不能被开发人员重用,导致一定的自我重复。这就像一个人用英文写书,一个人用中文写书,内容类似,那么中文作者要么重新整理内容并书写书籍,要么就翻译英文书籍,不管哪种,造成重复工作劳动是在所难免。
对于此类的自我重复,随着模型驱动的成熟和广泛应用将逐渐减少。模型驱动架构中业务建模、架构建模和程序编码等之间,通过Unified Modeling Language(UML)、the Meta-Object Facility (MOF)、XML Metadata Interchange (XMI)和自动化代码生成等语言、标准和技术进行互相转换,达到Don't Repeat Yourself。如下图所示:
传统的开发过程中,需求、分析、设计、开发等各个阶段,可能采用不同的描述语言和方式,互相之间也较难转换,所以他们之间不能无缝的相互转换,造成了重复沟通、理解和建模。
模型驱动开发,在开发过程的每个阶段基于标准和转换工具,所以每一个阶段的成果,都可以被下一个阶段复用,消除重复。这也是标准的魅力之一吧。
(2) 同一件事物,不同的人各描述了该事物的不同方面,造成他们之间所描述的事物既类似又不同,有重复的地方,又不完全一样,导致自我重复。
比如,银行中的用户信息模块,在"网上银行"、"公积金贷款",和"信用卡系统"中各自都可能有一个模块,从数据库、到逻辑、到界面都各自重复一套,他们之间既类似又有一些区别,如需要的信息不一样。导致这些模块之间的自我重复。
对于此类的自我重复,是由架构设计导致,在架构设计阶段没有按照"组件化"、"服务化"和"层次化"的架构设计,造成在一个事物不能符合不同模块和系统的需求,并且无法扩展。
这种自我重复,在企业的遗留系统和新系统之间尤为明显。因为大多企业的老系统在构建时由于技术、组织结构等原因,都是采用垂直的渠道架构,即存储层、逻辑层、展现层完全重新实现,甚至连技术框架都和其他渠道相异。如某银行业的多渠道应用中,不同渠道(如网上银行和手机银行)的逻辑类似,但在两个系统中重用性不高,存在着大量的自我重复。如下图左所示:
随着SOA(Service Oriented Architecture)的广泛使用,再辅助以层次化架构,能有效解决此类问题。
重复的组件要被重用,就需要是组件化的,并且能够被访问到。EJB、Web Service以及相应的组件化、基于服务的设计思想,一定程度解决了这些问题,缓和了在企业架构中的重用性问题。
而层次化的架构设计则既是解决架构重复的途径,也是结果。层次化的架构演变过程,可以在人类社会发展过程中找到似曾相似的影子。在人类社会中,任何事情重复到一定程度,就会产生一个新的职业或阶层,比如,找房子的人多了,就自然会产生中介。在架构设计中也是一样。任何设计重复到一定程度,就应该抽象出新的层次。这个层次也许可以作为一个新的组件,也可能做出一个新的产品。
上图2右边的架构,是银行多渠道整合的架构设计,是基于SOA架构的、多层次高度重用的架构设计,银行在新增一个渠道(如增加ATM渠道)时,能够重用大量的其他渠道的组件。