诊断Java代码:设计可扩展的应用程序,第1部分

随着对能应付日益增长的各种信息处理任务的软件系统需求的增长,找到能降低新的代码项目的生产成本的办法对软件公司是一种诱惑。最明显的办法之一是提高其它项目的代码的可重用程度。

在程序员设计一个新系统时,由此出现的更常见的问题中的两个是:

系统应该有多大的可扩展性?

我能使系统具有多大的可扩展性?

如果原始系统被设计成可扩展的,那么重用代码是最佳的办法。否则,重用代码时碰到的困难可以容易地抵消任何已获得的生产率。但是,要设计成可扩展的,在软件设计中就要考虑各种各样的新问题。

我将在本文讨论一些办法,这些办法能使一个软件系统对将来的项目是可扩展的。

忠告

在进行任何努力之前,请让我澄清一下,我不是主张在所有情况或者甚至大多数情况下都为了可扩展性进行设计。有利于许多设计的可扩展性选择常常会妨碍其它需要考虑的因素,例如性能或可测试性。可测试性最好的系统常常也是最简单的系统,但可扩展性设计却常常会大大增加系统的复杂性。

幸运的是,也有可扩展性最好的设计也是最简单的设计的时候,但能兼顾二者的时候真是太少了。

因为这个原因,我建议只在您能肯定得益会大于花费时才采用可扩展性策略。这通常意味着您 知道系统将会被以一定的方式扩展。

在极端编程著作中,常常把可扩展性的收益和购买股票期权相比较:您早先购买了期权,因此在将来您可以容易地扩展系统。如果最终您行使了这一期权,则可以获利颇多。

但如果您从未行使这一期权,则您将损失掉期权的价格并且没有任何回报。所以,“买主须谨慎!”

下面,我们来看看术语 可扩展性的各种定义方式。当讨论程序的可扩展性时,我们所指的本质上有三种不同类型 ― 黑箱可扩展性和两种类型的 白箱可扩展性。图 1说明了可扩展性类型的差别。

黑箱可扩展性

黑箱可扩展性是指这样一种方式:不直接扩展原始代码即可扩展程序。这通常通过使用配置语言或向导来完成,向导引导您完成对系统的扩展。

税务程序就是一个示例,这个程序包含一种配置语言,用于指定各种税务申报表。当政府发布新的税收申报表时,只需通过用配置语言说明新的税收申报表的结构即可扩展该系统。

黑箱可扩展性最适合用于研究这样的专有组件和框架,这里原始开发小组的业务模式要求两条:

程序是专有的(非开放源代码)

外界开发者在定制组件的功能性方面有一定程度的灵活性

支持用户定义脚本或宏的程序(如 Emacs、MS Office 等等)就是具有黑箱可扩展性的系统的示例。

白箱可扩展性

白箱可扩展性,相反地,是指可以通过修改或添加源代码对程序进行扩展的方式。我喜欢把白箱可扩展性区分为两个子类型: 开放箱和 玻璃箱。

时间: 2024-10-27 10:26:40

诊断Java代码:设计可扩展的应用程序,第1部分的相关文章

诊断Java代码: 设计可扩展的应用程序,第2部分

玻璃箱可扩展性是指这样一种方式:软件系统可在源代码可以查看而不可以修改时被扩展 ― 它是黑箱设计(在这里构建扩展时,不查看原始代码)和开放箱设计(扩展代码直接写入到基础代码)的折衷.因为新的扩展直接建立在原始代码基础上,但不改动原始代码,所以,玻璃箱设计或许是扩展一个软件系统最有效.最安全的方法.在 诊断 Java 代码的这一部分中,Eric Allen 详述了上个月谈及的玻璃箱可扩展性主题.读完本文后,您将知道什么时候使用玻璃箱,并将获得一些如何实现它的提示. 随着信息处理任务(和与之相关的成

诊断Java代码: 设计可扩展的应用程序,第4部分

在 上个月的专栏文章中,如果您掌握以下几点的话,那么您会明白,底层代码的可用性不会成为问题: 如何识别配置脚本 如何选择允许哪种配置 识别哪种环境要求黑箱可扩展性 衡量可扩展性所带来的构建复杂性 当提供此扩展性给配置脚本时,您 实际上正在构建一种语言. 您还认识到,考虑到应用程序的黑箱可扩展性,使用 S-expression 是一种快速建立一种配置语言的有效手段.我们将在本文深入研究 S-expression,并提供了一个如何用这些 S-expression 来快速方便地为特定应用程序建立配置语

诊断Java代码: 设计可扩展应用程序,第3部分

对应于我们上一篇" 诊断 Java 代码"中所讨论的透明盒可扩展性,黑盒可扩展性是指,在源代码既不能查看也不能修改时,可以扩展软件系统的方法.通常通过系统配置或使用特定于应用程序的脚本语言来进行这样的扩展.在本专题中,Eric Allen 讨论了何时设计黑盒可 扩展性的系统是有意义的,并提供了如何有效地实现这一设计的一些想法.阅读了本文后,您将知道何时使用黑盒并掌握如何实现它的一些技巧. 我已在以前的文章中谈到了代码重用设计策略的重要性(主要是因为各种信息处理任务的差异和相应费用的增加

诊断Java代码

诊断Java代码: Broken Dispatch错误模式 诊断Java代码: Double Descent错误模式 诊断Java代码: Impostor Type错误模式 诊断Java代码: Java编程中的断言和时态逻辑 诊断Java代码: Liar View错误模式 诊断Java代码: Repl提供交互式评价 诊断Java代码: 单元测试与自动化代码分析协同工作 诊断Java代码: 将时态逻辑用于错误模式 诊断Java代码: 进行记录器测试以正确调用方法 诊断Java代码: 空标志错误模式

诊断Java代码: 进行记录器测试以正确调用方法

用 JUnit进行单元测试是一个功能强大的方法,它可以确保您的代码基础的完整性,但是一些不变量比其他(方法调用序列是其中一种)更难测试.在诊断Java 代码这一部分,Eric Allen描述了怎样在您的单元测试中使用记录器(一种特殊的侦听器),来确保一个方法调用序列按恰当的顺序发生.请点击文章顶部和底部的 讨论,与作者和其他读者在论坛上分享您关于本文的看法. 随着时间的推移,当系统开发人员,维护人员甚至是系统详细说明改变时,JUnit 框架提供一个很好的方法来改善系统的坚固性.通过测试,您可以检

诊断Java代码: Impostor Type错误模式

当使用字段中特殊的标记来区别对象类型时,可能会产生标记对相关数据误贴标签的错误 ― 通称为 Impostor Type 错误模式.在诊断 Java 代码的这一部分中,Eric Allen 对这个错误的症状和起因进行了分析,详细说明了预防错误发生的方法,并讨论了一种吸引人的混合实现方法,这种方法不使用 impostor type,但最后,还是有很多相同的缺点产生.请在 讨论论坛与作者及其他读者分享您对本文的看法. 程序中除了最无关紧要的部分外都要对某些数据类型进行操作.静态类型系统提供了一种方法,

诊断Java代码: 消除包间的耦合关联

测试优先编程(test-first programming)中反复遇到的一个问题是,似乎不可能对程序的许多部分进行自动测试.尤其当程序在很大程度上要利用外部资源和库时,似乎很难对它进行测试,因为没有很好的方法来模拟程序与这些外部资源的连接. 然而,虽然只使用 Java 代码很难测试这样的程序,但有一种类型的编程(带有开发工具)可以解决这个问题 ― 基于组件的编程. 基于组件的编程和 Java 语言 我所说的基于组件的编程是指什么?我只是指,编程时程序的各个单元处于分布状态,而不是象 JavaBe

诊断Java代码:孤线程(Orphaned Thread)错误模式

在多线程代码中,使用驱动其它线程所负责的动作的单个主线程是常见的.这个主线程发送消息,通常是通过把它们放到一个队列中,然后其它线程处理这些消息.但是如果主线程抛出一个异常,那么剩余的线程会继续运行,等待更多输入到该队列,导致程序冻结.在诊断 Java 代码的这一部分中,专职 Java 开发者兼兼职捉虫者 Eric Allen 讨论检测.修复和避免这一错误模式. 用多线程编写代码对程序员大有好处.多线程能使编程(和程序)进行得快得多,而且代码能有效得多地使用资源.然而,跟生活中的很多事情一样,多线

java 登录 代码-Java代码设计登录的问题

问题描述 Java代码设计登录的问题 我在做毕业设计,现在遇到的问题是,我输入帐号和密码,然后选择学生,再点击登录,跳转到学生界面,我不知道为什么跳转不过去,求高手指点,不胜感激!![CSDN移动问答][1] 下面是我写的方法,新手,还望见谅 public void actionPerformed(ActionEvent e) { Connection dbConn = null; Statement stm = null; ResultSet rs = null; if(student.isS