基本信息:
中文名:企业应用架构模式
作者:Martin Fowler, David Rice, Matthew Foemmel, Edward Hieatt, Robert Mee
出版日期:2002年11月
出版社:Addison Wesley
作者自己给的介绍:
My latest work, and I think the hardest one to write. It all started after Dave Rice and I gave some talks on J2EE architecture and mulled over how the concepts we had learned in C++, Forte, CORBA, and Smalltalk had been crucial to us developing good designs in Java. With this book I wanted to set many of these patterns down to help developers whatever their platform. As it's turned out these have been very valuable as we have started to use .NET in 2002.
The book is in two parts. The first part is a short (100 page) tutorial on enterprise application architecture. The bulk of the book is the reference to forty or so patterns. All of these patterns are ones that I've seen in the field, usually on many different programming platforms.
Each pattern describes details of how it works and when to use it, together with code examples in Java, C# or both. (I picked these languages because most software developers can read them, not because of any particular coupling or opinions about the language).
The main topic areas are: how to layer an enterprise application, how to organize domain logic, how to tie that logic to a relational database, how to design a web based presentation, some important principles in distributed design, and handling of what we call "offline concurrency" - concurrency that spans transactions.
I've been fortunate enough to have some excellent contributors to this book, most notably Dave Rice - who wrote a good tenth of it. Also joining in are Matt Foemmel, Edward Hieatt, Robert Mee, and Randy Stafford
The book has won two awards: a productivity award from Software Development magazine and a best java book award from JavaWorld.com.
书评:
Charles Ashbacher
Flower没有给出关于企业应用(Enterprise Application)的精确定义,而是更愿意列举出它们大多数所共有的一组特性。一般而言,它们都是非常大型的系统,具有许多的用户界面屏幕,用来进行并发访问和海量数据的更新。在几乎所有情形中,必须要对数据进行持久化,事实上其往往具有非常强的持久性,这意味着它必须能在整个软件迭代,操作系统更换,硬件变更,以及人员和程序员流动的过程中留存下来。
此外,企业应用通常必须要与其他应用进行通信,这些应用往往同样大型和复杂。例如工资和病例,信用卡处理,保险理赔处理,银行,以及外汇贸易。简而言之,就是大多数驾驭现代全球经济体系的程序,它们许多都是当前所使用的最复杂的软件项目。最后,所构造的程序必须让「那些并非是它们创建者的人们」能够“容易和快速地”对其进行改变,以适应快速变化的条件,并且通常无需程序员任何输入。由于投入如此之多,必定会存在一组最佳的实践,这便是本书所要阐述的内容。
Fowler所论述的软件构造模式通常都比较小,它们描述的是专门的操作,而不是演示一个大的构架形态。每个具体模式的提出方式是,首先用一句话的描述来列出该模式的意图,以及用一个UML图演示它的结构。接下来的部分便描述了模式如何进行工作,何时使用它,以及一个或多个「使用源代码的框架来演示该模式具体实现」的示例。C#和Java都会在示范中被用到,它们不会造成理解上的问题。语言和上下文(context)如此类似,以至于任何人都能理解其中的任何一种,将不会在代码的阅读和理解上有任何的问题。
这是在封面上列出的五十一个模式中的一些示例:
- Lazy load-在这里对象将只装载当前需要的数据,但是要对「需要的所有其他数据的链接(link)」进行维护。
- Front controller-一个单独的处理者(handler)对象,其负责合并(consolidate)所有针对一个web站点的请求。然后它将这些请求发送给专门的服务对象(如安全,国际化问题,以及针对特定用户和位置的具体显示)。
- Optimistic offline lock-用来防止在执行并发业务事务时发生冲突。解决方案是当冲突被检测出时对事务进行回滚。
- Server session state-将会话的数据以串行化(serialized)的形式保存在服务器上。
尽管这些示例的必要性通常都极为简单,但它们确实展示了针对通用软件开发问题的一些最有效的和业已测试的解决方案。因此,这是一本任何企业应用的软件构造者都不应该没有的书。很难相信会构造出一个没有涉及到解决许多本书所列的这些问题的企业应用。
我唯一要抱怨的就是偶尔会出现一些不好的英文。例如,第100页上的短语,“The only reason I’ve concentrating on Java . . .”,以及第119上出现的短语“One factor that comes into this is comfortable used the development teamis . . .”。当然没有一本书不会出现错误,但这种错误如此频繁,不得不让人怀疑最终编辑工作的质量。
没有什么是比「构建永久运行IT相当事物(IT equivalent)的高效软件」更难的事情了。这便是企业应用所设想的,如果你的目标是致力于构建一个企业应用的话,那么让你自己走到正确的轨道上来,并研读本书。你以及其他每个与软件打交道的人将会获得一份更好的经验并作为回报。
Joel Semeniuk
无论什么技术平台,构建企业应用都不是一件容易的工作。当这样去做时,方案架构设计师和开发者需要召集行业中其他人所积累下来的经验。这些设计和实现的最佳实践通常会被表示成软件的设计模式。作为当今面向对象软件开发的一位主要的权威人物,Martin Fowler抓住了这许多模式的本质,并将它们写到他的Patterns of Enterprise Application Architecture书中。
Martin Fowler这本书是为致力于设计和构建企业应用的软件架构设计师、设计者和程序员而写。这本书的主要目的是要建立一个工作词汇表(working vocabulary)以及通用企业模式的定义集,以希望读者在开发企业解决方案时能够做出更有见地的决定。注意,本书所表示的模式并不针对任何具体的平台或技术,并且提供Java和C#两种示例,这一点十分重要。但是,作者并没有对「像J2EE和Microsoft .NET这样不同软件开发平台可能更适用的模式」提供一些基本的指导。
如果你参与一个企业应用的设计和实现,便会有诸多「在你的参考书库中应该有这本书一席之地」的理由。尽管我认为它并没有对设计模式的“总体轮廓(big picture)”给出足够的论述,但本书依然是一本组织良好的精品佳作。作者很好地运用了形式化、模型化以及叙述性的混合手法,来定义和描述每个模式的上下文(context)。在书的第二部分会对本书前几章所泛泛描述的模式给出详细的说明,使其成为极佳的参考指导。正因如此,就请步入企业软件模式的世界,本书将带你即刻启航。
评论
当我在他(Fowler)的站点上看到这本书时,我便阅读了其大部分“进行中”的版本,并完全喜欢上了它- 那时我才刚刚开始接触设计模式,因此无法从一个“富有经验”的角度来评论它。尽管如此,基于我所能够记起的(以及现在大幅提高的设计模式的知识),我认为它十分值得推荐。
评论
我现在正在阅读这本书,而且我必须要说的是它让我非常高兴。我想向软件工程领域的每个人高度推荐它(尤其是你正在为每个人谈论的所有这些模式疑惑时)。令人高兴的是为许多我已经实现的模式取了名称(我只是不知道它而已),并且也从中获得了一些好的想法。
Sam Gentile
非常值得一读。我和John Lam在Win-Dev上进行了长时间的讨论,我们认为这是一本具有重要地位的书,或许更甚于GOF一书。GOF这本书在范围上其实比较小,关注软件的构造。Martin的书则将那些更加重要的素材(如何与数据库进行沟通,可伸缩架构等模式)分门别类。非常之好。
Robert Hurlbut
我同意这是一本非常好的书。我一直关注着Martin在其站点上所写的内容,直至最终出版(这时他拿下了所有文章并将它们替换成链接到其书的页码)。绝对是一本“经典”之作!
Phil
的确是一本非常好的书。我仍然没有看到一种模式可以表示复杂的多分支条件(multi-branch conditional logic)逻辑:
if this then
{
if that or theother then
{
}
else if here then
{
}
else if now then
{
}
else
{
}
}
评论
这是我所发现的关于J2EE和.Net模式的最佳图书。我想它注定会成为经典。我发现关于「何时进行分布式,Unit Of Work,Domain Model和Data Mapper模式」的论述极为有用。它改变了我考虑企业应用的方式。
就其范围而言,我想它处于原先Gamma等人所著的“设计模式”与一本像“J2EE模式”书之间的位置。“设计模式”描述了能够适用于任何类型应用的既有模式。“J2EE模式”则从一个平台的角度来描述模式(尽管它们许多也同样适用于其他的平台)。Fowler的书描述了一组能够工作于某种类型应用(业务应用)的模式,但它更适用于多种平台。
这本书要好于“J2EE模式”,“J2EE模式”这本书没有很好地论述哪些J2EE部分需要避免,以及哪些“模式”实际上是为平台本身的问题而工作的(例如,“Composite Entity”模式)。
我非常不同意第一位评论者的观点。Fowler确实论述了「模式所工作的最佳平台」。书的第一部分给出了一个很好的线路图(road map),以确定能够在你的应用中使用哪组模式。他明确地提到.Net会引导你进入Table Module的方向,而使用J2EE你可能不会使用这个模式。
就框架用到的模式而言,我依然发现「了解框架所实现的模式」是非常有用的。这样你便会知道需要选择哪些框架。我们最近正在进行O/R mapping工具的选择过程。阅读Unit Of Work,Data Mapper,Repository,Lazy Load和Identity Map章节,将对这个过程*非常*有帮助。同样,阅读Front Controller模式则给了我一些关于「如何最好地利用Struts框架」的新思路。我完全不同意“学习与这些框架相关的模式将不会带来很多价值”的观点。在这里,无知绝不是福。
最后,关于「本书“只是”收集和命名某些已经存在的模式,从而降低了它的价值」的观点同样无聊。许多开发者发现这些业经实践的真正模式是非常有用的。对通用的模式命名并进行清晰的描述是非常有帮助的。这正是最初“设计模式”一书所要做的内容。按照这个逻辑,我猜想最初的那位评论者可能只给了“设计模式”三颗星。
这是一本伟大的书。
评论
这本书给出了基于层式架构(他没有涉及过滤器/管道模式)企业解决方案的模式目录。它为许多企业相关问题提供了多种可能的解决方案(使用C#和Java)。基于J2EE/.NET/CORBA框架的应用都会存在这些大多数问题。如果使用者已经阅读了J2EE设计模式,设计模式(Gang of Four)的书,并且在3-4个企业多层应用上工作过,那这本书便十分有意义。这些解决方案非常容易付诸实施,至少在基于J2EE应用服务器的解决方案中是这样。
顺便说一句,这本书在Amazon上已经脱销,我从Barnes & Noble上订购一本并且也获得了不错的折扣。
缺点:
- 没有随书附带的CD:-)
- 没有使用所有(高级)语言工具(使之易于阅读)
评论
这确实是一本关于构建企业应用的非常好的读物。我喜欢作者给出了当前最常用到的软件平台(如Java和.NET)的示例。不管怎样,作者对Java所给出的细节要比.NET更多,并且他论述的模式并不总是具有那样的通用性。并没有很好地涉及Table Module相关的事情。我有一个问题提请注意,任何愿意就这个事情提供帮助的本书读者,请与我联系。
总之,我喜欢阅读这本书,并且我相信它物有所值。