« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | | | | |
| 公告 |
关注电子政务、大型企业应用开发、Web、Workflow、MOM、MDA、RCP、GEF email:gmluyang@gmail.com
|
Blog信息 |
blog名称:SixSun的Blog 日志总数:152 评论数量:372 留言数量:13 访问次数:2381107 建立时间:2004年12月13日 |

| |
[设计模式]诊断 Java 代码 文章收藏
SixSun 发表于 2006/12/6 13:39:12 |
原文:Eric Allen http://www-128.ibm.com/developerworks/cn/java/j-diag/index.html好像此连载还出了一本书<java Bug 模式>
===================================
诊断 Java 代码
500)this.width=500'>
500)this.width=500'>
500)this.width=500'>
500)this.width=500'>
500)this.width=500'>
500)this.width=500'>
500)this.width=500'>
500)this.width=500'>
订阅:
500)this.width=500'>
developerWorks 时事通讯
500)this.width=500'>
500)this.width=500'>
500)this.width=500'>
500)this.width=500'>
Eric Allen博士研究生, Rice 大学 Java 编程语言小组,Cycorp, Inc.2001 年 2 月
欢迎访问诊断 Java 代码,这里是隔周更新的 developerWorks Java 技术专区,讨论您日常编程工作的 Java 解决方案。所有论文,包括第一篇,都可以在这里找到
错误模式:简介 2001 年 2 月 首篇介绍了错误模式的一些概念,这对于提高您发现和纠正代码中错误的能力很有帮助。您将了解一个最常见的错误模式,它是您开始识别和避免更复杂错误模式的基础。
Dangling Composite 错误模式 2001 年 3 月 在 Java 编程中,最常见(也是被抱怨最多)的重复错误之一是无效指针异常。捕捉到其中一个错误的产生原因,真的会让您对您当初的择业决定产生怀疑。在诊断 Java 代码的这部分中,我们通过把和无效指针异常联系在一起的最常见的一个类型编成目录,来继续我们的错误模式检查,并一步步分析一个含有无效指针异常的类的示例。然后我们回顾了几种能帮您减少这种类型错误的编程技巧。
Null Flag 错误模式 2001 年 3 月 为开发健壮的程序,我们用异常情况来替代空指针,但这却把控制流限制在方法调用和返回的普通方式,同时也掩盖了异常情况在那里发生的迹象。Eric Allen 在本栏中展示了这种错误模式(他称之为 Null Flag 错误模式)怎样产生不可预料的结果,而且调试起来也非常困难。与我们讨论过的其他错误模式一样,你可以应用某种编程技巧来减少这种类型错误的发生。
Double Descent 错误模式 2001 年 4 月 类型转换错误信息通常表明在递归下行一个复合数据结构时出现概念性错误,虽然它通常比其它错误更易调试,但也具有更多隐蔽的错误行为。在诊断 Java 代码的这部份中,Eric Allen 讨论了程序员该到哪里查找此模式的错误,如何识别它,以及为了减少它的出现,程序员能做些什么。
Liar View 错误模式 2001 年 4 月 GUI 一般是基于模型-视图-控制器体系结构设计的。其中,视图是从模型中分离出来的。这种分离对自动测试是一个挑战,因为我们很难确认模型中的状态改变是否在视图中得到了相应的反映,这样就产生了臭名昭著的 Liar View。诊断 Java 代码的这部分讨论的就是 Liar View 错误模式。
Saboteur Data 错误模式 2001 年 5 月 当一个程序由于数据毁坏而崩溃时,要找到原因是很难的。即使一个程序很好地运行了很长一段时间,它还是经常可能在处理内部数据的过程中彻底崩溃。本文讨论的就是导致这种崩溃的错误模式,它为什么存在以及在发生之前或之后清除它的几种方法。
Broken Dispatch 错误模式 2001 年 5 月 在象 Java 语言这样的面向对象的语言中,方法是可重载和可覆盖的,即便在中等复杂程度的程序中,方法调度也会给代码管理带来困难。在本周的诊断 Java 代码中,Eric Allen 讨论了由这些困难导致的错误模式,概述了由于参数不匹配导致的错误方法调用的征兆,同时给出了应对这个问题的一些办法。
提高 Java 代码的性能 2001 年 5 月 很多算法用尾递归方法表示会显得格外简明。编译器会自动把这种方法转换成循环,以提高程序的性能。但在 Java 语言规范中,并没有要求一定要作这种转换,因此,并不是所有的 Java 虚拟机(JVM)都会做这种转换。这就意味着在 Java 语言中采用尾递归方法将导致巨大的内存占用,而这并不是我们期望的结果。Eric Allen 在本文中阐述了动态编译将会保持语言的语义,而静态编译则通常不会。他说明了为什么这是一个重要问题,并提供了一段代码来帮助您判断即时(JIT)编译器是否会在保持语言语义的同时做尾递归的代码转换。
用记录器对方法调用的正确性作测试 2001 年 6 月 用 JUnit 进行单元测试是确保您的代码库完整性的有效手段,但要对一些您想查验的不变量作单元测试则需要更高的技巧。在诊断 Java 代码的这部分中,Eric Allen 讨论了写一个单元测试的方法,以确保一系列方法调用按正确的顺序出现。
Imposter Type 错误模式 2001 年 7 月 当在字段中用特定的标记来区别对象的类型时,如果关联的数据被标记标错了,就可能会产生错误 — 这就被称为 Imposter Type 错误模式。在诊断 Java 代码的这部分中,Eric Allen 诊察了这种错误的征兆及原因,详细说明了防止这种错误的方法,并讨论了一种试探性的混合实现:它虽不使用 imposter type,但最终还是有许多相同的弱点。
Split Cleaner 错误模式 2001 年 7 月 Java 编程语言的特色之一是存储自动管理,它把程序员从使用内存后忘记释放它的错误中解放出来。尽管如此,许多程序还是得处理资源问题,例如文件及数据库连接,这些都必须在使用之后显式地释放掉。跟手工管理存储一样,程序员在手工管理资源时也会犯很多错误。其中一个就是本周要讨论的话题 — Split Cleaner 错误模式。
Fictitious Implementation 错误模式,第 1 部分 2001 年 7 月 Java 语言避免了很多支持多继承的语言所特有的问题 — 部分是因为它把对接口不变量的规定限制在类型说明上。但这个限制结合糟糕的说明文档会产生问题:如果对接口如何实现做了错误的假定,那在运行时会碰到令人沮丧的错误。本文(第 1 部分,共 2 部分)概述了会导致这类错误的编程习惯及避免的办法。
Fictitious Implementation 错误模式,第 2 部分 2001 年 7 月 这个两部分系列的第二篇文章演示了两个解决这种虚假的实现错误的方便的工具。Eric Allen 向您显示了如何使用断言和单元测试作为可执行文档,使您的代码更安全,可移植性更强。
孤线程(Orphaned Thread)错误模式 2001 年 11 月 在多线程代码中,使用驱动其它线程所负责的动作的单个主线程是常见的。这个主线程发送消息,通常是通过把它们放到一个队列中,然后其它线程处理这些消息。但是如果主线程抛出一个异常,那么剩余的线程会继续运行,等待更多输入到该队列,导致程序冻结。在诊断 Java 代码的这一部分中,专职 Java 开发者兼兼职捉虫者 Eric Allen 讨论检测、修复和避免这一错误模式。
设计可测试的应用程序 2001 年 11 月 在诊断 Java 代码的这一部分中,Eric Allen 暂停了对具体错误模式的讨论,转而选择讨论关于设计易于、甚至我们乐于测试的软件的问题。他概述了七条设计原则,这些原则能大幅提高您编写测试代码的效率并因此提高结果代码库的健壮性。
设计可扩展的应用程序,第一部分 2001 年 12 月 在诊断 Java 代码的这个部分和即将到来的几个部分中,Eric Allen 将他的讨论集中在判断一个新系统应该有多大的可扩展性、什么时候应用可扩展性是最佳的以及可扩展性与其它因素(特别是可测试性)的关系如何。在这第一篇文章中,他研究了能使一个软件系统具有可扩展性的各种方法以及每种形式的可扩展性各在什么样的环境中最有用。
设计可扩展的应用程序,第二部分 2001 年 12 月 玻璃箱可扩展性是指这样一种方式:在可以查看源代码而不可以修改它的情况下即可扩展一个软件系统 — 它是黑箱设计(在这里构建扩展时不查看原始代码)和白箱(扩展代码直接写入基础代码)设计的间的折衷办法。在这篇文章中,Eric Allen 详述了玻璃箱可扩展性主题并提供了一些关于如何实现它的提示。
设计可扩展的应用程序,第三部分 2002 年 2 月 Eric Allen 讨论了何时设计黑盒可扩展性的系统是有意义的,并提供了如何有效地实现这一设计的一些想法。阅读了本文后,您将知道何时使用黑盒并掌握如何实现它的一些技巧。
设计可扩展的应用程序,第四部分 2002 年 2 月 在本文(“诊断 Java 代码”系列文章之一)中,作者 Eric Allen 展示了 S-expression — 由圆括号分隔的元素列表的语法表示法 — 如何用于提供实用的、轻量型黑箱可扩展性。使用 S-expression 的优势会在一个特定示例的上下文中讨论。作者还详述了 S-expression 的局限性,并提到了什么时候它们可能不是最适合应用程序的。阅读完本文之后,您将了解何时使用 S-expression 创建黑箱可扩展性。
深度优先访问器和中断的分派 2002 年 3 月 在诊断 Java 代码的这一部分中,Eric Allen 讨论了如何通过使用深度优先访问器(Visitor 模式上的一个变体)使增加代码的简洁性成为可能。他描述了它的技术,讨论了它的优点和“错误(gotchas)”,警告读者有关与其使用相关的错误模式,并在特定示例的环境中说明了深度优先访问器。 读完本文后,您将了解如何使用深度优先访问器来获得编码优势,并了解使用这一技术的缺陷。
在规范钢丝上行走 2002 年 4 月 程序规范是任何软件项目中既关键又费时的一个部分。在诊断 Java 代码的这一部分中,作者 Eric Allen 将讨论为什么良好定义的规范对您的代码是必需的,并研究了传统软件工程方法以及极端编程方法,还比较了两者的优缺点。Eric 还讨论了您不希望定义程序规范的方法,并解释了原因。读完本文之后,您将理解如何衡量维护精确的设计规范的成本和收益。
Repl 提供交互式评价 2002 年 4 月 通常,在运行 Java 程序时,必须使用 String[] 输入参数将参数传入,从 main() 方法运行程序。但是如果程序仍在调试中,那么,这可能会成为一项繁重的任务。本月,Eric Allen 讨论对程序中的表达式和语句进行交互式评价的优点,并且提供几个帮助您处理这一任务的 Java repl(“read-eval-print-loop”工具,“读取-评价-打印-循环”工具)。他还讨论交互式评价如何帮助构建 GUI 和探索新的 API。阅读本文后,您将理解在预调试(pre-debugged)程序中交互地诊断小错误的做法及原因,您将能够使用一些 Java 工具来方便您的工作。
连续初始化器错误模式 2002 年 7 月 您经常会看到代码不是仅仅通过调用构造函数对类进行初始化,它还通过一些紧接着的意在设置各个域的动作对类进行初始化。不幸的是,这样紧接着的动作是错误的高发地带,会带来连续初始化(run-on initialization)类型的错误。在诊断 Java 代码的这一部分中,Eric Allen 探讨了连续初始化器(Run-on Initializer)错误,讨论了为什么要避免以及如何避免它,并演示了如何将它可能带来的损失降到最低。请单击本文顶部或底部的讨论在讨论论坛与作者和其他读者交流本文的心得。
平台相关性“gotcha 问题” 2002 年 8月 一次编写,随处运行。这是承诺,但 Java 语言有时候并不能做到。诚然,JVM 把跨平台互操作性的程度提到了前所未有的高度,然而,规范和实现级别上的一些小毛病却使得程序无法在多平台上表现出正确的行为。在本文中,Eric Allen 讨论了 Java 编程中要留意的一些与平台相关的方面,如尾递归调用以及内建的供应商、版本和操作系统相关性。
拥护静态类型的理由” 2002 年 9月 许多流行语言 — 例如 Ruby、Python 和其它所谓的“脚本编制”语言 — 已不再把静态类型检查作为提高代码的可靠性的一种手段。尽管如此,静态类型检查仍是防止引入错误和进行错误检测的强大武器库中的重要武器之一。在本文中,Eric Allen 陈述拥护静态类型检查的理由,解释为什么我们要为 Java 语言支持它而高兴,讨论怎样改进它。请通过单击文章顶部或底部的讨论来参加本文的讨论论坛,与作者和其他读者交流本文的心得。
Java 编程中的断言和时态逻辑 2002 年 9月 虽然传统断言可以增加对 Java 代码执行的检查次数,但有许多检查不能用它们来执行。弥补这一缺陷的方法是使用“时态逻辑”,它是一种用于描述程序状态如何随时间而更改的形式体系。在本文中,Eric Allen 将讨论断言,介绍时态逻辑并描述用于处理程序中时态逻辑断言的工具(下一篇文章将检查以前的错误模式和时态逻辑的应用程序)。
将时态逻辑用于错误模式 2002 年 11月 时态逻辑(temporal logic)是一种用来描述程序状态如何随时间而更改的形式体系。本文是 Eric Allen 关于时态逻辑和断言的第二篇专栏文章,他讨论了如何通过使用时态逻辑断言防止几种最常见的错误模式。请单击文章顶部或底部的讨论参与本文的论坛,与作者和其他读者分享您关于本文的想法。。
单元测试与自动化代码分析协同工作 2003 年 1月 单元测试和静态分析通常被看作是有助于确保程序的正确性的互不相干的方法。本文研究了这两种方法之间的关系,并讨论了构成每种方法工作构架的工具如何相得益彰。特别地,Eric Allen 讨论了一些可用而又令人兴奋的新应用程序,这些应用程序允许您进一步提升您的单元测试。请单击文章顶部或底部的“讨论”参与本文的论坛,与作者和其它读者分享您的想法。
消除包间的耦合关联 2003 年 3月 在测试程序时,如何应付模拟外部资源和库连接这一艰巨任务?基于组件的编程和去耦包相关性可以解决这个问题。基于组件的软件开发作为促进代码的一种手段而经常受到人们赞誉,另外它还有助于生成可测试代码。Eric Allen 用一些 Jiazzi(一种使用 Java 语言进行基于组件编程的功能强大的自由工具)示例展示了这种编程概念。可以通过论坛提出您对本文的想法,以飨笔者和其他读者。(您也可以单击本文顶部或底部的“讨论”参加论坛。)。
“杀手组合”— mixin、Jam 和单元测试 2003 年 3月 在 Java 语言中获得单继承编程的安全性需要付出极大的代价:有时必须沿着继承层次结构中的多条路径复制代码。要重新获得单继承 Java 代码中所失去的大多数表示,我们可以将 mixin 集成为一个扩展。本月,Eric Allen 解释了 mixin(那些由它们的父类参数化的类)的概念,以及它们如何能协助单元测试。他还描述了基于 mixin 编程的工具,并讨论了将 mixin 添加到您的 Java 代码中的可能方法。在本文的论坛中与作者及其他读者分享您对本文的看法。(也可以单击本文顶部或底部的讨论访问该论坛。)。
轻松掌握 Java 泛型 2003 年 5 月 本月的诊断 Java 代码介绍泛型类型(generic type)和支持它们的特性,计划在 2003 年末发布的 Tiger,也就是 Java V1.5 中打算包含这些泛型和特性。Eric Allen 提供了代码样本,这些样本通过重点描述诸如基本类型的限制、受限泛型和多态方法之类的 Tiger 特性来说明泛型类型的优缺点(即将发表的专栏文章将讨论其它特性,比如 Tiger 中泛型类型的特定表现以及可能扩展为 Tiger 之外的泛型类型)。
轻松掌握 Java 泛型类型,第 2 部分 2003 年 5 月 这个月,Eric Allen 继续讨论 JSR-14 和 Tiger 中的泛型类型(generic type)。他概括了在这些 Java 扩展中强制实施的几个限制,并说明这些扩展语言的编译器所使用的实现策略如何使这些限制必然存在。请在与本文一起提供的论坛中与作者和其他读者分享您对本文的心得。
轻松掌握 Java 泛型,第 3 部分 2003 年 6 月 Java 开发人员和研究人员 Eric Allen 继续讨论 JSR-14 和 Tiger 中的泛型类型,研究在泛型类型中添加对裸(naked)类型参数的 new 操作的支持所带来的问题。
轻松掌握 Java 泛型,第 4 部分 2003 年 7 月 Java 开发人员和研究人员 Eric Allen 讨论了通过泛型类型添加对 mixin 支持所带来的影响,并以此文来结束他对 JSR-14 和 Tiger 中泛型类型的由四部分组成的系列的讨论。在相关论坛中与作者及其他读者分享您对本文的看法。
关于作者Eric Allen 毕业于 Cornell 大学,获得计算机科学和数学的学士学位。他是 JavaWorld上 Java 初学者论坛的主持人,也是 Rice 大学 Java 编程语言小组的博士研究生。他的研究涉及在源程序和字节码层次方面的正式语义模型和静态分析工具。目前,他正在为 NextGen 编程语言(泛型运行时类型的 Java 语言扩展)实现一个源程序到字节码的编译器。可通过 eallen@cs.rice.edu与 Eric 联系. |
|
回复:诊断 Java 代码 文章收藏
实验室家具(游客)发表评论于2008/4/23 15:52:09 |
公兴搬家公司 植发 肉毒素 顺产 乳房整形毛发种植 公兴搬场公司重睑 B超溶脂减肥 丰胸实验室家具 溶脂胎记 乳腺纤维瘤去除胎记 实验室设备双眼皮 上颌前突保乳手术 下颌角收缩毛孔 超声波测厚仪眼袋手术 |
|
» 1 »
|