首页>参考读物>计算机科学与技术>软件与程序设计

J2EE反模式
作者 : Bill Dudney, Stephen Asbury, Joseph K.Krozak, Kevin Wittkopf
译者 : 苏金国 刘瑛 等
出版日期 : 2005-11-30
ISBN : 7-111-17702-9
定价 : 49.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 370
开本 : 16开
原书名 : J2EE Antipatterns
原出版社: John Wiley & Sons
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

“书中的真知灼见来自于专家们的成功解决方案,可以助你成功实现J2EE应用。”--Bill Brown,反模式的布道者
  如今有许多已发布的软件中都存在着大量的bug,运作得十分糟糕。遗憾的是,通常我们很难准确地找出是哪里出了问题,需要做哪些工作才能让情况好转。本书以全新的视角,针对J2EE,为读者奉上了大量找出并修正反模式 (即不好的编码和设计习惯) 的工具。本书作者分析了开发J2EE应用时常犯的错误,并且清楚地指出了该如何进行重构以摆脱困境。
  本书首先以模板的形式来介绍某种反模式,描述其症状和后果,并指出其产生的典型原因,然后逐步对代码实现进行转换,从而得到一个更好的设计。对于每一种反模式,作者都提供一些实际的例子和代码,而且至少提供了一种重构方案。读者可以使用这些方案,轻松编写出表现更好、运行更快的J2EE程序。书中涵盖50多种J2EE反模式,其中涉及Java编程的许多热点问题:
  ●误算带宽需求
  ●JSP会话中有太多数据
  ●每个servlet中都有公共功能
  ●消息驱动bean中目标超载
  ●J2EE服务层次选择不当

图书特色

图书前言

如今发布的太多软件往往都是漏洞百出,运作得也很糟糕。遗憾的是,通常很难准确地找出是哪里出了问题,以及需要做哪些工作才能让情况好转。反模式正是衔系在“问题”和“解决方案”之间的“救命线”。
  本书对于如何识别不好的代码以及如何采用J2EE进行设计提供了一些实用的建议,并介绍了可以让代码变得更优秀的方法。在书中,读者将了解到诸多J2EE反模式,这里不仅会给出典型编码和设计错误的形式化定义,还会提供一些存在反模式的实际代码示例。对于每一种反模式,都至少提供了一种重构方案(通常会提供多种重构方案)。对每个反模式的介绍都是一个能让你了解如何让代码变得更好的过程。
  在设计和开发任何应用程序时,我们认为,你应当同时兼顾到构建应用的一些正面(模式)和反面(反模式)的例子。我们都想用更好的办法去构建更好的软件,希望能从自己和别人的失败中得到教训。例如,在一个典型的J2EE应用开发中,通常会有一个包含多层的体系架构,数据库层保存应用程序所用的数据,Enterprise JavaBeans(EJB)层要与数据层交互,并包含业务逻辑,Web层则提供用户界面。构建各个层时犯错误的机会是很多的。一种典型的错误就是让Web层直接与实体EJB交互。采用这种方式编写的应用程序存在很严重的性能问题。随后出现的会话外观(Session Faade)模式 [Alur,Crupi,Malks]可以用来避免所写应用程序性能低下的问题。不过,原来的一些应用程序在编写时并没有使用此模式,所以还需要对这样一些应用程序进行修正。但是你大可不必把原来的代码全盘扔掉,再从头来过,第9章提供了一种称为外观(Faade)的重构模式,其中介绍了可以采取哪些实用步骤来修正性能差的问题。

J2EE中的反模式
  J2EE作为一种体系架构,不仅功能相当强大,而且非常灵活。然而与日常生活中的其他情形一样,鱼和熊掌不可兼得。在J2EE中,一方面我们可以在功能和灵活性方面大有收获,但另一方面又不得不放弃简单性。
  J2EE领域的覆盖面极广,从数据库访问到基于Web的表示可谓一应俱全。J2EE中的许多库(或部件)本身就已经很复杂了,单是这些库就完全可以用整本书来介绍。在图1中可以看到J2EE所覆盖的一些领域。
  本书中所介绍的反模式涉及J2EE的绝大多数概念。几乎J2EE API的每一部分都存在反模式,从数据库访问到使用JavaServer Pages(JSP),无一例外。
图1J2EE概览

反模式
  所谓反模式就是重复地应用某些代码或设计,而这些代码或设计会导致不良的后果。这种不良后果可能是性能很差,代码很难维护,甚至是项目完全失败。反模式以一种详细或特定的方法来捕捉代码错误。
  本书中的反模式将采用一种模板形式来介绍。通过这个模板,有助于确保得到一致的形式化定义,从而使反模式的学习更为容易。这个模板还提供了一种方法,由此可以从不同视角来阐述反模式的有关信息。有些人可能会从“症状及后果”发现其代码中存在的反模式,还有些人则可能根据“典型原因”找出隐藏的反模式。这个模板由两部分组成,先是一个目录(catalog)项列表,这些目录项都是些短语或名字而已,后面的详细(detail)项列表则较为复杂,其中每一项都会做更为深入的说明。这些目录项和详细项如下所列。

目录项
 也称为。在此列出与该反模式关联的一个或多个替代名。
 常出现的领域。这一项会指出该反模式最有可能出现在哪些领域中。
 重构方案。这一项会列出可以采用哪些适当的重构方案来改进代码和设计,从而消除反模式。
 重构方案类型。这一项会列出针对该反模式可以应用哪些类型的重构方案。
 根本原因。这一项会提供出现该反模式的根本原因。对这些问题做了妥善修正后,就可以很好地避开该反模式。
 不平衡的外力因素。这一项会说明项目中存在哪些不协调或不平衡的外力因素。一种反模式冒出时,往往是因为存在着一些外力,这些外力可能会导致一些问题,而这些问题正是该反模式的根本原因。不过,不要奢望在所有方面都达到平衡。
 奇谈怪论。这一项会引用一些言论,你经常会从一些开发人员或管理人员口中听到这些说法,他们的项目就饱受着反模式之苦。

详细项
 背景。这一部分会介绍所述反模式的背景,并从个人角度提供该反模式的一些实际例子。这种反模式会对各种项目带来哪些影响?该反模式是如何出现的,或者是如何被注意到的?这些有关内容也将在这一部分加以说明。
 一般形式。反模式往往是以在此所述的形式暴露的。你可以在这里找到必要的信息,从而帮助你判断你的应用程序是否遭遇到反模式陷阱。这一部分还包括一些图表或代码,这样你就能对在此所讨论的概念有一个具体的认识。
 症状及后果。症状就是应用开发中的“痛处”,这些症状能够很好地指示出反模式的存在。后果则说明了如果对反模式置之不理,任由它对你的设计和代码“找麻烦”,会导致什么样的结果。
 典型原因。这一部分会介绍出现该反模式的“根本原因”的一些具体体现,还会提供一些相关实际例子的信息,这些实际的问题在过去曾导致项目出现过这种反模式。
 已知的例外情况。所谓例外情况是指,即使存在这种反模式,也不会对项目带来负面影响。
 重构方案。这一部分详细介绍了针对这个反模式如何采用有关的重构方案,从而最有效地消除应用程序中的反模式。
 其他变种。这一部分会重点强调一些重要例子,从中可以了解到这种反模式如何依具体情况不同而存在差异。
 示例。这一部分会提供一个例子,从这里我们可以了解到存在反模式的代码或设计会是什么样子。
 相关解决方案。这一部分包含了一些其他反模式的相关资料,这些反模式通常会与此反模式一同出现,另外此部分还可能包括其他一些有助于解决此反模式的重构方案。

重构方案
  所谓重构方案(refactoring)是一种原则性的方法,通过改造代码的实现,从而得到更优的设计,而对外部所见的行为表现不会带来变化。
  要想成功地进行重构,关键是要有一组好的单元测试。仅仅是单元测试这个主题,就可以用整本书的篇幅来介绍,而且这方面的书也确实不少。不过,我们起码应该知道,如果没有预先设定的一组单元测试,你永远也无法肯定你的重构是否成功,特别是在你的重构不影响外部所见行为表现的情况下。
  本书中的重构方案也同样采用一种模板的形式来介绍。实际上,这个模板借用自Martin Fowler那本享有盛誉的《Refactorings》(Fowler,2000)。与介绍反模式的模板类似,重构模板提供了一种以标准化形式介绍重构的方法,通过这个模板,我们可以更容易地学习重构方案的有关内容。该模板的形式如下。
 重构图。每个重构图部分都包含一条说明问题的语句(一个句子或一个短语描述,指出代码或设计中存在什么问题,需要加以修正),还包含一条有关解决方案的语句(一个句子或一个短语描述,指出需要做什么工作来修正上述问题),另外还包含一个相关的图(一个简单的图,以图的形式说明需要做什么工作来修正上述问题)。这里的图可以是一个需要重构的代码段或UML(统一建模语言,Unified Modeling Language)设计图,紧接着还会提供一个视图,由此我们可以了解到应用了重构之后的代码或UML图会是什么样子。
 动机。这一部分说明为什么要应用此重构方案。这里通常包含有关的描述,指出采用此重构方案将会避免或减少哪些不良后果。
 方法步骤。这一部分会介绍如何通过一个循序渐进的过程,将代码从当前的不好状态调整到一种较好的状态。
 示例。这一部分包含一个受反模式影响的代码或设计例子。针对这种不好的代码或设计,将分别应用重构的各个步骤,直到重构完成。

为什么写这本书
  如何从头开始新建一个J2EE项目,在这方面有许多不错的书籍可供参考,但这些书籍对于如何让你现有的应用程序表现得更好却无济于事。本书介绍了开发J2EE应用时经常容易犯的错误,并且提供了相应的重构方案,以帮助你摆脱这些问题。本书的目标就是,指出应用开发中通常会犯哪些错误,并提供必要的工具来修复出了问题的地方,从而帮助你成为一个更好的J2EE开发人员。重构方案提供了一些实用的建议,你将由此了解到,如何将受反模式所累的设计和代码转变为一个更简洁、更可维护的应用程序。换句话说,这不是一本介绍如何来完成J2EE设计和开发的书,相反,本书要介绍的是在设计和开发过程中存在哪些常见的错误,以及如何进行修正。
  在写这本书时我们有许多收获,如果你能像我们一样有这么多收获,或者至少了解到其中的一部分,我们的目的和希望也就达到了。在我们多年构建J2EE应用的体验中,曾经见过(自己也曾写过)一些很糟糕的代码,这些代码都有很不好的后果。通过捕获一些最常见的问题,你会看到你的代码将工作得更好、更快,而且也无需你像原先那么费劲。我们希望,你能从我们的错误中吸取教训,并成为一个更优秀的J2EE开发人员。

致谢
  首先要向Christ致以最诚挚的谢意,感谢他一直以来对我的教诲,正是他不懈地鼓励我最大限度地发挥自己的潜能,才使我能够超水平发挥。还要感谢我的好妻子Sarah,没有她的支持和爱,我是无法支撑下去的。另外要谢谢我可爱的孩子们,是你们让我的生活像现在这样多姿多彩。Andrew、Isaac、Anna和Sophia,你们就是快乐的化身。我的父亲总是教育我说,只有站起身来,持之以恒地前进,不断地加油,最后才能登上山顶。谢谢您告诉我这些。
  感谢Jack Greenfield鼓励我换个角度想问题。在你的督促之下,我的思维变得更加活跃,谢谢你,Jack。还要感谢John Crupi和Bill Brown,你们为这本书的内容提供了极有价值的反馈。由于你们的努力,才使这本书更出色。最后,我要感谢Eileen Bien Calabro,能把我那乱七八糟的草稿变成纯正英语的书稿绝不是一件容易的事,由于你的贡献我才得以奉上这样一本比原先强得多的书。我在写这本书的时候学到了许多东西,希望你也能有同样的收获。——BD
  我要感谢以前以及现在一直与我一起,共同为AntiPatterns这本书做出努力的人们,不管你们是不是清楚你们的贡献有多大,在此都要致以感谢。我要特别感谢我的妻子Cheryl;结婚12年以来,对你,我最好的朋友和妻子,感谢之情无以言表。——SA
  我要感谢我亲爱的妻子Jennifer,她无尽的耐心、爱与支持永远是我的后盾。感谢上帝赐给我美丽的女儿,Kristina,我的小甜心,只要你想做,就去做,没有做不成的!还要感谢我的好兄弟Raymond,你的智慧总是能指引我前进。最后,还要感谢我的母亲为我付出的爱、鼓励和无私的奉献。——JKK
  我想把这本书谨献给我一生中的最爱。首先,要献给我的妻子和最好的朋友,Catherine,以此感谢在我写这本书时她给予我的不变的爱、支持和鼓励。没有你,我什么也做不了!这本书还要献给我的两个出色的女儿,你们总是精力充沛,不断地感染着我。
  我要感谢这本书的所有合作者们,感谢大家艰苦的劳动和所做出的卓越贡献。在此要特别感谢Bill Dudney邀请我参与这本书的编写(说实话,我有些不请自来!),还要感谢他费心尽力地协调和审阅我们完成的书稿,以保证全书的内容统一。
  我还要感谢Wiley 技术出版公司的所有工作人员(特别是Eileen Bien Calabro),是大家艰苦的努力、无私的指导和无尽的耐心,才使我有勇气投入写作。——KW

图书序言

心理学家说,如果一而再、再而三地重复做同一件事情,并希望会有不同的结果出现,这就说明脑子可能有问题了,可以把这定性为一种精神失常。这种情况对于软件开发过程也同样适用。遗憾的是,我们也经常重复着某些设计,却未曾意识到这些设计会招致许多大问题。在这里就可能存在着一些反模式,我们要引以为。所谓“反模式”(AntiPattern),可以认为是以一种正式模板的形式来表述某种不妥当的实践做法。当然,我们也可以用同样的形式来描述好的实践做法,这就是“模式”。因此,反模式就是某种不好的实践做法,它们很常见,因此有必要把它们正式记录下来。
  一项新的技术引入后,许多人可能都希望能了解技术的细节。在J2EE诞生的前3年间,这种情况尤其明显。在此期间,大批有关如何使用J2EE的书籍问世就是一个明证。其中许多书都是在用我们可以理解的某种语言来介绍J2EE规范。不过,随着J2EE越来越成熟,越来越多的开发人员了解了J2EE的细节,并且已经开始尝试应用J2EE,有关J2EE设计的书籍开始出现了。这些书并不是面面俱到地教你如何使用这个技术,而是把目光更多地聚焦在如何用这种技术来进行设计。《Core J2EE Patterns》(中文版《J2EE核心模式》已由机械工业出版社出版。——编者注)就是一例,就是采用模式的形式来关注最佳实践。
  本书的用途很多。一来它可以用来确认那些不好的实践做法,你应当予以避免。二来它可以提供证据,使你确信某种做法确实是不好的实践。三来,如果参加有关设计的会议,你还可以拿书中的名词来说明设计系统时哪些是不该做的。或者,有些开发高手总认为自己的设计无与伦比(不过,除了管理层会受他们的“蒙蔽”外,所有人都很清楚并不是那么回事),如果你对他们的自负很不以为然,也可以拿这本书来杀杀他们的锐气。
  阅读本书的许多读者对J2EE可能已经很精通。所以,请不要把它当成一本说教“不要这么做,不要那么做”的书来读,而是应该换个角度。如果你看这本书后有新的想法,“哦,我想原先可能不该那么做”,那就对了,这才是读本书的正确观点。我相信本书的作者都很清楚这一点,因为他们不仅告诉你哪里可能做错了,还解释了如何进行修正。这正是本书的妙处所在。
  书中提供了大量绝好的信息。作者用通俗的手法使我们能迅速地理解反模式的实质。正是因为它如此浅显易懂,所以你在进行设计时,完全可以把它当成一个助手放在身边。
  最后还要提醒一句,一定要阅读Web服务反模式这一章(第9章)。尽管对于Web服务不乏争议和困惑,但阅读这一章肯定会让你长久受益。尽情地享用这本书吧。——John Crupi,《Core J2EE Patterns》的著作者之一,Sun公司杰出工程师
  参加本书翻译的人员有:苏金国、刘瑛、林琪、范松峰、杨健康、张莹、易竞、程龙、卢、江健、丁小峰、陈永志、牛亚峰、高强、何跃强、孙春娟、张伶。

作者简介

Bill Dudney, Stephen Asbury, Joseph K.Krozak, Kevin Wittkopf:Bill Dudney:  Bill Dudney 是一位Java架构师,他参与构建J2EE应用和软件已有5年,从事分布式计算长达14年。他曾与人合作出版了《Jakarta Pitfalls》。
Stephen Asbury: Stephen Asbury 是《Developing Java Enterprise Applications》的作者之一,并著有《Enterprise Linux at Work》,还著有另外4本开发技术方面的图书。
Joseph K.Krozak: Joseph K. Krozak 是Krozak信息技术公司技术开发部的副主管,曾为多家位居财富500强的大公司和中等规模的公司提供高级软件解决方案。
Kevin Wittkopf: Kevin Wittkopf 作为软件架构师和开发人员已有17年以上,他主要关注企业集成、Web服务、消息机制和基于服务的体系架构。

译者简介

苏金国 刘瑛 等:暂无简介

图书目录

第1章分布与扩展
11反模式:本地化数据
12反模式:误解数据需求
13反模式:误算带宽需求
14反模式:超负荷运转的网络中心
15反模式:手持利斧乱砍一气的人
16重构方案
161提前规划
162选择适当的数据体系架构
163划分数据和工作
164为将来扩展做出规划(企业规模的面向对象)
165规划实际的网络需求
166使用特殊化网络
167务求谨慎
168丢掉有问题的硬件
第2章持久存储
21反模式:挖掘机
22反模式:碾压
23反模式:数据观点
24反模式:窒息
25重构方案
251轻量级查询
252版本
253组件视图
254打包整理
第3章基于服务的体系架构
31反模式:多头服务
32反模式:过小服务
33反模式:烟囱式服务
34反模式:客户完成服务
35重构方案
351接口划分
352接口合并
353技术服务层
354跨层重构
第4章JSP的使用和误用
41反模式:忽略事实
42反模式:代码太多
43反模式:嵌入导航信息
44反模式:复制粘贴JSP
45反模式:会话中有太多数据
46反模式:不加限制地滥用TagLib
47重构方案
471bean化
472引入业务流警察
473引入委托控制器
474引入模板
475去除会话访问
476去除模板文本
477引入错误页面
第5章servlet
51反模式:每个servlet中都包含公共功能
52反模式:servlet中的模板文本
53反模式:字符串用于内容生成
54反模式:没有建立连接池
55反模式:直接访问实体
56重构方案
561引入过滤器
562使用JDom
563使用JSP
第6章实体bean
61反模式:脆弱的链接
62反模式:DTO爆炸
63反模式:表面张力
64反模式:粗行为
65反模式:职责过当
66反模式:幻想
67重构方案
671本地动作
672别名
673大批撤离
674扁平视图
675强结合
676双管齐下
677外观
第7章会话EJB
71反模式:到处都是会话
72反模式:过度膨胀的会话
73反模式:过瘦的会话
74反模式:大事务
75反模式:透明外观
76反模式:数据缓存
77重构方案
771会话外观
772分解大事务
第8章消息驱动bean
81反模式:误解JMS
82反模式:目标超载
83反模式:过分实现可靠性
84重构方案
841建构解决方案
842规划网络数据模型
843充分利用各种形式的EJB
第9章Web服务
91反模式:Web服务总能解决问题
92反模式:只要有疑问,就做成Web服务
93反模式:万能对象Web服务
94反模式:细粒度/多交互Web服务
95反模式:也许并非RPC
96反模式:单模式梦想
97反模式:SOAPY业务逻辑
98重构方案
981RPC转向文档型
982模式适配器
983Web服务业务委托
第10章J2EE服务
101反模式:硬编码的位置标识符
102反模式:Web=HTML
103反模式:需要本地代码
104反模式:过度滥用JNI
105反模式:选择了不当的层次
106反模式:未充分利用EJB容器
107重构方案
1071实现解决方案参数化
1072选择最适用的客户
1073控制JNI的边界
1074充分利用J2EE技术
附录A反模式目录
附录B重构目录
附录C网站上的内容
参考文献

教学资源推荐
作者: 郑阿奇 彭作民
作者: 郭文夷 等编著
作者: [美] 艾伦 A. A. 多诺万(Alan A. A. Donovan),布莱恩 W. 柯尼汉(Brian W. Kernighan)著
作者: (美)Y.Daniel Liang 著 阿姆斯特朗亚特兰大州立大学
参考读物推荐
作者: 华为云容器服务团队 杜军 等编著
作者: Donald Thompson;Rob S. Miles
作者: 唐盛彬 编著