敏捷架构设计一文到目前已经全部结束,由于架构设计是一个很大的话题,要在一篇文章中完全把架构设计讲清楚是很难的。因此本文的最后一个章节中提供了一组书籍和文章,这些资料都和架构设计有关,本文的写作过程也从中获益良多,故而推荐给有兴趣的读者。
Refactoring To Patterns(Joshua Kerievsky)
勿庸置疑,模式是软件设计的一种有效的工具。但是在将模式和现实中的软件设计关联起来时,很多人往往迷惑于模式到底是如何应用的。结果是表现出两种极端:一是用不好模式,二是过度的滥用模式。模式是他人设计经验的总结,但是它在提供优秀的设计思路的同时也会增加一定的复杂性。因此,不了解模式应用的上下文环境而错误的使用模式是非常危险的。不但达不到原先的效果,而且会导致设计难以理解和设计团队沟通的困难。文章一开始,作者就批评了滥用模式的做法。那么,到底要怎样才算是正确的使用模式呢?作者借鉴了Martin Fowler的重构方法。通过实际的例子,讨论如何把一个普通的、不够灵活、不具备扩展性的设计重构为一个优美的设计模式。因此,本文的核心在于,如何识别哪些设计需要重构?如何判断重构的时机?如何评价重构前后的优缺点?以及,如何进行重构?本书目前正在写作中,从http://industriallogic.com可以找到其草稿。在透明的网站和umlchina上,也可以找到部分的译稿。在阅读架构重构模式后,你可以再翻阅此文,这样你就可以了解到该模式在代码级别上的实现。
Effective Java(Joshua Bloch)
此书的定位于编程习惯(Idiom)和良好的OO思维上。任何的设计都无法脱离最终的代码。因此,擅长于架构设计的设计师一定也拥有浑厚的编码功力。优秀的软件过程是由大量优秀的实践拚接而成,架构设计也是一样的,它是由大量的代码级的实践累积起来的。此外,本书的很多讨论都是关于如何进行一个优秀的OO设计的。在本文中,我们很多关于具体设计的讨论都是基于OO设计的,在稳定化模式中我们也讨论了OO设计优秀之处。因此,在了解架构设计的基本思路后,阅读此书,你可以进一步的了解和强化OO架构的设计思路。顺便一提,本书的中文版即将面世。
Writing Effective Use Case(Alistair Cockburn)
文如其名,本书主要介绍了如何编写用例的知识。在架构设计中,我们不断的强调需求的重要性,可以说,没有需求,就没有架构。那么,需求应该如何组织呢?用例就是一种不错的需求组织方式,注意,用例并不能够完全代替需求,类似于业务流程、非功能需求之类的需求都不是用例所擅长的。本书的精华就在于它完整的介绍了叙述型用例的各个方面,从用例的范围、角色、层次等方面描述了用例的构成,并讨论了用例的很多相关知识。更为宝贵的是,本书中包含了大量的实例。相较一些介绍用例图的书而言,本书的定位更加的实践化。一个优秀的需求的价值在于,它能够很容易的转换为软件开发过程中其它实践所需要的工件。如果我们仔细的体悟本书的话,我们会发现书中的很多思路都是基于此的。本书在市面上可以找到中文版和英文版两种版本。
Thinking in Patterns(Bruce Eckel)
Bruce Eckel 的另外两本书《Thinking in C++》和《Thinking in Java》可以说是非常的出名。后者更是有三个版本,前两个版本都有中文译本,候捷老师更是亲自翻译了第二个版本,第三个版本目前正在写作中,从Bruce Eckel的网站(http://www.mindview.net)上可以下载到。《Thinking in Patterns》目前也仍然处于写作中,但已经略具规模了。Bruce Eckel从不同的应用角度来讨论模式之间的不同以及模式的内涵。例如,对工厂模式的讨论是从封装对象创建的角度开始讨论的,对适配器模式的讨论则是从改变接口的角度开始讨论的。模式的关键在于应用,阅读本书,你能够体会到这一点。
Java 与模式(阎宏)如果说上述的一些好文都出自国外专家之手,那么这本书就是绝对的中文原创。本书的重点是讨论隐藏在模式背后的面向对象规律,并一一对各种设计模式进行分析和实例研讨。使用很多有趣的例子和运用哲学思维来解释模式是本书的两大特色。在阅读该书的时候,请注意区分技术细节和框架代码。设计模式的好处就在于能够根据上下文环境,设计出一个具有灵活性、扩展性、低耦合度的框架来。这和架构设计的思路是一样的,不要在软件开发过程的早期考虑太多的细节。
Patterns of Enterprise Application Architecture(Martin Fowler)
这是一本绝对的讨论架构设计模式的书了,但这里的架构是特指企业信息系统的架构,这和本文讨论的问题域是一样的。根据三层结构的理论,本书的模式大致可以分为5类:表示层模式、逻辑层模式、数据层模式、分布式模式、以及一些基础的模式。书的早期版本采用了这种分类法,在出版之后,模式的分类进一步细化。例如数据层模式就被进一步的区分为数据源架构模式、对象-关系行为模式、对象-关系结构模式、对象-关系元数据映射模式等。本书的内容覆盖面很广,Martin Fowler在素材的组织上拥有非常优异的才能,当年的《重构》一书就是这方面的例证。阅读本书,你会对架构设计的技术层面有着很深的了解,但是,应该注意,书中的一些模式虽然看起来简单,但是如果要真正实现,却需要花费大量的精力,因此,听从《Refactoring To Patterns》一书和本文重构模式的建议吧,只有在需要的时候才把设计重构为模式。
Dealing with Roles(Martin Fowler)
这只是一篇小短文,讨论的重点是关于角色处理的知识,但作者从面向对象的基础知识出发,讨论了如何根据需求的不同,来进行不同的设计,并用实际的例子,演示了设计是如何变化的。这种思想和本文提倡的思想是非常的相似的,架构设计不能够独立于需求而存在。建议不论是对面向对象设计有兴趣还是对软件工程有兴趣的人都可以阅读此文。在Martinfowler的网站上(http://www.martinfowler.com)可以找到本文,次外,网站上还有其它一些优秀作品,《Dealing with Properties》就是其中的一篇。我曾经为《Dealing with Roles》一问撰写了一篇读书笔记,发布在点空间上(http://www.dotspace.twmail.net/patternscolumn/analysis%20patterns/RoseModelingNotes_S.htm),如果有兴趣,也可以指导一二。
《Framework Process Patterns》(James Carey,Brent Carlson)
本书的作者是IBM公司的成员,他们有着面向对象操作系统和企业应用框架的设计经验,而后者,这是著名的IBM SanFrancisco框架。他们把框架设计中学习到的知识整理为过程模式的形式,书中并没有太多的理论,但处处都体现出了作者的丰富经验。在阅读本书的时候,要时刻牢记其推介的框架设计的特点,再结合自己工作的具体情况,来理解和应用这些模式。不要盲目的把书中介绍的模式应用于自身,这是我的忠告。本书的中文版由我和一位朋友翻译,将不日面世。
IBM Sanfrancisco 框架,这并不是一本书,而是一个现实中的产品。IBM根据市场经验,设计了一个企业应用框架,定位于为企业应用开发者提供通用的组件。从这个产品中,你可以充分的了解到模式是如何应用在一个成熟的产品中的。要了解这个产品的设计思路,关键是要先了解它的层次划分。SanFrancisco框架总共分为三个层次:Foundation Layer、Common Business Objects Layer、Core Business Process Layer。Foundation Layer定义了基础的类以及类的使用策略,例如工厂类来负责所有对象的创建;Common Business Objects Layer定义了企业中的一些通用对象,例如公司、帐户、客户等,而Core Business Process Layer定义了企业应用所需要的关键业务流程,包括会计框架、应收应付、订单处理、库存管理几个方面。这三个层次可以进行独立的重用,越高的层次的重用价值越大。在理解这样一个产品的时候,我们要有这样的思路,对于一个大型的产品来说,一致性有时候是重于其它的价值的,例如,在对象创建方面,产品统一使用了工厂模式,而在属性处理上,统一使用了动态属性的设计方式。虽然有些地方并不需要用到这两种设计模式,但是为了保持设计的一致性,还是必须使用该模式。这一点对于普通的项目开发或是小产品开发来说可能未必适用,但是对于大型的项目或产品来说就显得非常的重要了。
Applying Patterns(Frank Buschmann)
这是一篇用过程模式语言来描述如何在实际中应用设计模式的文章。文章短小精悍,把设计模式的应用总结为几种模式,没有提供具体的实例是个遗憾。对正在学习设计模式的人而言,花一些时间了解别人是如何应用设计模式是很有必要的。在点空间上可以找到原文链接和繁体版译文。本文的架构愿景模式就参考了这篇文章中的内容。
重构(Martin Fowler)其实本书已经不用再介绍了,他的价值就在于他能够把程序员日常的很多优秀做法提升到理论的阶段,并为更多的程序员提供指导。这也是我在上文夸奖Martin Fowler具有优异的组织才能的一大原因。遗憾的是,本书一直没有中文译本,不过这个遗憾即将结束,候捷和透明正在合译此书,相信不久之后就可以一饱眼福。http://www.refactoring.com是Martin Fowler创建的重构的讨论站点,上面也会很多的相关内容。而关于重构的另一方面的消息是,现在已经有越来越多的建模工具将重构作为重要的特性之一,这无疑能够为程序员节省大量的精力。
http://www.agiledata.org(Scott W. Ambler)这是Scott W. Ambler 最新维护的一个网站,也代表了Agile方法发展的一个方向――如何以敏捷的姿态进行数据库项目的开发。在读过站点的内容之后,你会了解到如何做好数据库项目的开发。目前,本站点还在Scott W. Ambler的维护下不断的更新。数据库设计一直不是面向对象阵营强调的一个重点,基本的观点认为,关键是类的设计足够规范,数据库并不是主要问题。但是在实际的项目中,数据库,特别是关系型数据库往往是无法忽略的部分,包括数据库模式的设计、性能优化、数据库连接管理、数据操纵语言。除此之外,遗留数据库、并发问题、安全,关系数据到对象的映射,业务逻辑处理,这些都是需要在架构设计的时候就加以考虑的问题。在本文中并没有专门的章节对数据库相关的知识进行讨论,因为数据库的讨论最好是结合具体的数据库进行。如果大家在架构设计中存在数据库方面的问题,可以参考这个网站。
Designing for Scalability with Microsoft Windows DNA(Sten Sundblad)
目前关于讨论微软体系平台设计的优秀书籍不多,而本书正是其中之一。本书介绍了DNA体系下设计一个分层架构所要注意的问题。其核心思想是避免纯理论的面向对象设计。例如,书中在介绍领域对象的时候,建议将只读对象和可写对象分开处理,这样,只读对象就不需要COM+的支持,能够提高效率,但这是不符合面向对象的设计的封装思路的。另外,为了能够使用对象缓冲池技术,本书提议在设计业务对象的时候不要包括状态数据,这和类包括数据和行为的基本思路也是相斥的。从这本书中,我们可以了解到现实系统的设计和经典面向对象思想之间的辨正关系。
设计数据层组件并在层间传递数据(Angela Crocker、Andy Olsen 和 Edward Jezierski)
这是另一篇讨论windows体系平台的文章。微软的产品适合于小型的开发,一方面和具体的技术有关,另一方面也和体系结构的设计有关。windows体系结构的特点是快速开发,因此在一些小型的项目中,使用微软产品的开发速度较快,但是随着项目规模的增大,快速开发伴随着的结构性欠佳的问题就逐渐显露出来了。因此,文章的主要内容就是如何优化结构。其主要的思路是对系统进行分层,并实现层间数据传递的策略。这两点不论是在哪一类型的体系中都是关键性的问题,在分层模式中,我们也曾经对这两个问题做了大篇幅的讨论。和Java体系相比,Window体系有其特殊的一面,也能够起到他山之石的效果。
EJB Design Patterns(Floyd Marinescu)
本书分为两个部分,第一个部分重点讨论了如何在一个分层体系中应用模式语言,并分别针对架构设计、数据传输(即上一段中讨论的层间传送数据)、事务和持久性、服务端和客户端交互、主键生成策略等主题讨论了可能的设计模式。第二部分讨论了EJB设计过程中的实践活动和过程。虽然本文的所有内容都是针对EJB设计的,但是其思路同样可以借鉴于其它体系。本书的电子书在Middleware网站上可以下载到。
(全文完)
作者简介:
林星,辰讯软件工作室项目管理组资深项目经理,有多年项目实施经验。辰讯软件工作室致力于先进软件思想、软件技术的应用,主要的研究方向在于软件过程思想、Linux集群技术、OO技术和软件工厂模式。您可以通过电子邮件 iamlinx@21cn.com 和他联系。