Welcome 微信登录

首页 / 软件开发 / JAVA / 诊断Java代码: 设计可扩展的应用程序,第2部分

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

随着信息处理任务(和与之相关的成本)多样性的增长,很明显,在技术预算紧缩的形势下,增大代码重用的程度是一种有效的设计(和商业)策略。如果系统的可扩展性是您的目标,那就问问您自己,“系统应该具有多大的可扩展性以及我能使系统具有多大的可扩展性?”然后考虑以下事实:

增加可扩展性的代价是性能和可测试性的降低。

可测试性最好的系统通常也是最简单的系统;增加可扩展性常常增加复杂性。

要制定一个成功的可扩展设计计划,关键的一点是知道您计划将来怎样扩展该系统。

在本系列的 第 1 篇文章中,我概述了系统可能展现出来的各种可扩展性形式 ― 黑箱设计以及两种 白箱设计,即 玻璃箱和 开放箱。接下来,我们将更深入地探讨这些形式。

我们将从玻璃箱可扩展性开始我们的旅程。

玻璃箱中的对等元素

早些时候,我已把玻璃箱可扩展性定义为这样一种方式:软件系统可在源代码可以被查看而不可以被修改时被扩展。主要有两种方向,程序可顺着这些方向成为玻璃箱可扩展,它们是:

数据的扩展

这些数据的功能性的扩展

选择使一个程序顺着这个两维空间中的任意一维可扩展都将影响到程序的结果体系结构。在多数情况下,这个决定也将对性能产生影响。

数据作为可扩展的一维

让我们首先来考虑最自然地包含在面向对象语言(例如 Java)中的可扩展性的维 ― 数据。在面向对象的语言中,某些最本质的构造(即类层次结构、接口和抽象方法)主要是为了允许顺着该维的可扩展性而被包括。

要扩展一个复合数据结构以包含新的子类型,只需定义一个被声明成继承原始复合数据结构的根的新类就可以做到。例如,考虑如下简单的用于二叉树的类层次结构:

清单 1. 一个简单的用于二叉树的类层次结构

abstract class Tree {
}
class Branch extends Tree {
private int value;
private Tree left;
private Tree right;
public Branch(int _value, Tree _left, Tree _right) {
this.value = _value;
this.left = _left;
this.right = _right;
}
public Tree getLeft() {
return this.left;
}
public Tree getRight() {
return this.right;
}
public int getValue() {
return this.value;
}
}
class Leaf extends Tree {
}