分享
 
 
 

诊断 Java 代码:设计轻松的代码维护

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

本月,Eric Allen 解释了在使代码更易于维护的同时,避免和控制无理由的变化怎么会是保持代码健壮性的要害。他集中讨论了诸如函数样式代码编写之类的概念,以及标记字段、方法和类的方法来处理并防止可变性。Eric 还解释了本任务中单元测试和重构的角色,并提供了协助实现重构的两个工具。在相关论坛中与作者和其他读者分享您对本文的看法。(您也可以单击本文顶部或底部的“讨论”,访问该论坛。)

有效调试源自良好的编程。设计易于维护的程序是程序员面临的最困难挑战之一,其部分原因在于程序通常并不是由那些编写代码的程序员维护的。为了有效维护这样的程序,新程序员必须能够快速了解程序的工作原理,假如程序员能够单独理解整个程序中各个小部分,那么就可以轻易地了解程序的工作原理。

通过讨论可变性、可译码性、私有方法、最终方法、最终类、本地代码、单元测试以及重构问题,我们将简述编写程序的一些方法,以帮助使程序更易理解和维护。

可变性和可译码性

首先讨论可变性问题。假如在一个程序的计算期间,其每一部分所处理的数据都没有被该程序的其它、远程部分更改,那么就很轻易单独理解该程序的各个部分。

太多信息

例如,请考虑一个使用容器类实例的程序,可以修改其中的成分链接。每次将容器从程序某一部分上的方法传递到该程序其它部分的方法,以及每次调用 new 表达式(其中容器被作为参数传递)时,容器就可能脱离调用方法的控制发生改变。

在我们首先理解调用方法调用的每个方法如何修改容器之前,我们不能真正确保我们理解了调用方法,由此我们诊断错误的能力也就更差。假如这些被调用的每个方法都依次调用其它修改方法,那么维护程序员为了理解单个方法必须阅读的代码总量会迅速增加,多得无法控制。

由于这个原因,对可变容器和不可变容器使用不同类会非常有利。在不可变版本中,容器的字段可以标记成 final。

求助于函数样式

相对于修改旧数据,为构造新数据而进行代码编写称为函数样式,因为程序的方法与数学函数相似,其行为是根据每个输入所返回的输出来单独描述的。

函数样式经常被忽略的优点是相当轻易单独理解程序的个别组件。假如方法所操纵的数据决不会被其主体中执行的任何操作改变,那么程序员要理解该方法必须做的就是理解那些操作返回的结果。将之与前面的一个方法调用几个其它方法的方案相对照,那个方案中的其它几个方法都修改这一方法所操作的数据结构。

Java 语言的一个相当好的特性是它答应我们使用 final 要害字(作为类型检查器的伪指令)来声明何时我们要使某个数据成为不可变。

使用 final 要害字来避免变化是“钉住”类的方法行为的一个好方法。每次修改字段时,都有可能改变引用该字段的方法的行为。另外,将字段标记为 final 让阅读程序的其他程序员立即知道:不管整个程序有多大,决不要修改该字段。例如,请考虑下列表示不可变列表的类层次结构。

清单 1. 表示不可变列表的类层次结构

abstract class List {...}

class Empty extends List {...}

class Cons extends List {

private final Object first;

private final List rest;

}

这些类中的所有字段都被标记成 final。要确保这些类的实例不可变,这样做够了吗?不太够。当然,即使字段被标记成 final,该字段本身的组件可能不是 final,记住这一点很重要。当那些组件更改时,引用那些组件的程序的任何部分可能会被修改,而不管字段本身是否改变。在上面的示例中,尽管列表的组成元素不能被修改,但是我们必须检查那些元素本身没有包含可能被修改的非最终字段。

在这种情形中,尽管列表可能包含可变元素,但是我们可以看到存储在给定列表中的元素序列由于以下原因而不可变:Empty 列表(即,长度为零的列表)的实例根本不包含任何元素;因此不能修改它们。Cons(非空列表)实例包含两个字段,都是 final。第一个字段包含该列表的第一个元素,它不能被修改;第二个字段包含一个列表,其中包含所有剩余元素。假如这个列表的内容不可变,那么该包含列表也不可变。

但是包含在这第二个字段中的列表比包含列表的长度小一,所以假如我们知道长度为 n 的所有列表都不可变,那么我们就知道长度为 n + 1 的列表也不可变。因为我们已经知道长度为零的列表不可变,所以我们也知道长度为 1、2、3 等的列表同样不可变。

跟踪与此类似的数据结构连接会很乏味,但当您能确定这种结构的全局特性(诸如不可变性)时,这样做是值得的。

控制变化

防止出现不期望的变化的最佳策略就是尽可能避免所有变化。只有当出现一定要改变的原因时(例如,当这样做大大简化了代码结构时),我们才应该使用它。当可以避免变化时,所产生的好处是巨大的(在较低的维护费用和增强的健壮性方面)。

即使存在一定要改变数据的原因,最好还是设法控制那种变化,从而尽可能限制可能产生的破坏。迭代器和流是数据结构的极佳示例,这些数据结构明确设计成通过答应我们以常规的、定义良好的形式利用一系列元素,而不是明确修改这些元素的某个句柄来控制变化。

私有方法

就如同将字段设置成 final 有助于限制对字段值产生外部影响一样,将它们设置成 private 有助于限制它们对程序其它部分产生的影响。假如字段是私有的,那么我们可以确信该程序的其它部分都不与它直接相关。假如我们除去了该字段,并替换了该类数据的内部表示,那么我们只要关心修正该类内部的方法,以正确访问新数据。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有