释”)。应注释出一个局部变量用于做什么、在哪里适用、为什么要用等等,使代码易读。 3. 仅将局部变量用于一件事。一旦将一个局部变量用于多个原因,就明
显降低了它的一致性,使它难于理解。同时也增加了代码因为局部变量旧值的意外负面影响而产生问题的可能性,这些旧值来源于前
面的代码。的确,局部变量的重新利用需要较少的内存,因而更高效,但是复用局部变量降低了代码的可维护性,使代码脆弱。这常常让由于不必分配更多内存而带来的小节省变得不值得。
关于声明的一般注释
在代码行间,如在一个 if 语句作用域内,声明的局部变量对于不熟悉你的代码的人来说是难于找到的。
一种取代在第一次使用局部变量之前声明它们的方法是在代码的前部声明它们。函数应该简短,参见(第 2.4.5 节“写出简短单独的命令行”),所以要去代码顶部判断局部变量用途的工作并不是很糟。
成员函数参数标准
有关成员函数参数的重要标准集中在参数应如何命名和说明。参数指成员函数的实参。
命名参数
参数命名遵循与局部变量命名完全一样的约定。对于局部变量,名字隐藏是一个问题。 示例: customer inventoryItem photonTorpedo in e
一个可行的取代方法,例如 Smalltalk,是采用局部变量的命名约定,但在名字之前加入“a”或“an”。加上“a”或“an”有助于让参数与局部变量和字段区分开来,避免名字隐藏的问题。这种方法较好。
示例: aCustomer
anInventoryItem aPhotonTorpedo anInputStream anException
注释参数
成员函数的参数在采用 javadoc @param 标识的头文件中注释。应说明:
1. 参数用来做什么。需要注释出参数用来做什么,以便其他开发者了解使用参数的上
下文。
2. 任何约束或前提条件。 如果一个参数的值域不能被成员函数接收,则应让调用者知道。
可能一个成员函数只接收正数,或者字符数小于五的字符串。
3. 示例。如果应传递什么样的参数不明显,那么应该在注释中给出一个或多个例子。 采用参数类型接口。若合适的话,不要只说明参数类型属于哪一类,如 Object,而应说明属于哪个接口,例如 Runnable。这样的好处是,这种有赖于环境的方法更具体 (Runnable 比 Object 更具体),或者在支持多态性(不坚持一个参数是一个类的层次结构中某个类的实例,而说明它支持一个特定的接口,这意味着它只用多态地适应你的需要即可)上是一个更好的方法。
类、接口、包和编译单元的标准
这一章集中讲述类、接口、包和编译单元的标准和指南。类是一个可以让对象创建的模板。类包含字段和成员函数的声明。接口是公共标识的定义,包括成员函数和字段。使用接口的类必须支持这些函数和字段。包是一个相关类的集合。最后,编译单元是声明类和接口的源码文件。因为 Java 允许编译单元放在数据库中,所以一个单独的编译单元可能不与一个源码文件物理上直接相关。
类的标准
类的一些重要标准基于:
? 命名约定 ? 注释约定 ? 声明约定 ? 公共和保护接口
命名类
标准 Java 约定是使用完全的英文描述符,所有单词的第一个字母要大写,并且单词中大小写混合。 类名应是单数形式。 示例:
Customer Employee Order OrderItem FileStream String
注释类
以下的信息应写在文档注释中紧靠类的定义的前面:
1.类的目的。开发者需要了解一个类的一般目的,以判断这个类是否满
足他们的需求。养成一个注释与类有关的任何好东西的习惯,例如:
它是否是一个模式的一部分,或是使用它时有什么要引起注意的限制 [AMB98]。
2.已知的问题。如果一个类有任何突出的问题,应说明出来,让其他的
开发者了解这个类的缺点/难点。此外,还应注明为什么不解决问题的原因。注意:如果问题仅仅针对一个成员函数,那么它应直接与那个成员函数相联系。
3.类的开发/维护历史。通常要包含一个历史记录表,列出日期、类的作
者和修改概要。这样做的目的是让进行维护的程序员了解过去曾对一个类所做的修改,是谁做了什么样的修改。
4.注释出采用的不变量。不变量是指一套有关实例或类在所有“稳定”
时间片内为“真”的声明。“稳定时间片”是指在一个成员函数被对
象/类调用之前和立刻调用之后的时间 [MEY88]。通过说明一个类的不变量,你让其他的开发者了解应该如何使用一个类。 5. 并行策略。任何采用 Runnable 接口的类应充分说明它的并行策略。
对许多程序员来说,并行编程是一个新的而且复杂的题目,所以需
要投入一些额外的时间来确保人们能够读懂你的东西。说明你的并行策略以及为什么选取这个策略而不是其它策略这很重要。常用的并行策略 [LEA97] 包括下面一些内容:同步对象;停滞 (balking) 对象;警戒 (guarded) 对象;版本 (versioned) 对象;同步策略控制器;接收器。
类的声明
一种让你的类容易被理解的方法是用一致的方式来声明它们。Java 中常用的方法是按如下顺序声明一个类:
公共成员函数 公共字段 被保护成员函数 被保护字段 私有成员函数 私有字段
[LAF97] 指出,构造函数和 finalize() 应该首先列出,可能是因为这些将会是另一个开发者为了解如何使用一个类而首先查看的成员函数。此外,因为我们有一个要求将所有字段声明为私有的标准,所以声明顺序实际应变为:
构造函数
finalize()
公共成员函数 被保护成员函数 私有成员函数 私有字段
在每一个成员函数分组内,常将函数按照字母表的顺序列出来。许多开发者在每个组内有选择性地列出了静态成员函数,然后列出实例成员函数,再在这两个子分组内按照字母表的顺序列出成员函数。这两种方法都可用,你只需选用一种并且一直用它。
将公共和保护接口最小化
面向对象程序设计的基本点之一是最小化一个类的公共接口。这样做有几个理由:
1.可学习性。要了解如何使用一个类,只需了解它的公共接口即可。公共接口越小,类越容易学习。
2.减少耦合。当一个类的实例向另一个类的实例或者直接向这个类发送
一条消息时,这两个类变得耦合起来。最小化公共接口意味着将耦合的可能降到最低。 3.更大的灵活性。这直接与耦合相联系。一旦想改变一个公共接口的成
员函数的实现方法,如你可能想修改成员函数的返回值,那么你很
可能不得不修改所有调用了该成员函数的代码。公共接口越小,封装性就越大,代码的灵活性也越大。
尽力使公共接口最小化这一点明显地很值得你的努力,但通常不明显的是也应使被保护接口最小化。基本思想是,从一个子类的角度来看,它所有超类的被保护接口是公共的。任何在被保护接口内的成员函数可被一个子类调用。所以,出于与最小化公共接口同样的理由,应最小化类的被保护接口。
首先定义公共接口。大多数有经验的开发者在开始编写类的代码之前
就先定义类的公共接口。 第一,如果你不知道一个类要完成怎样的服务/行为,你仍有一些设计工作要做。第二,这样做使这个类很快地初具雏形,以便其他有赖于该类的开发者在“真正的”类被开发出来以前至少可以用这个雏形开始工作。 第三,这种方法给你提供了一个初始框架,围绕着这个框架你构造类。
接口标准
接口的一些重要标准基于:
? 命名约定 ? 注释约定
命名接口
Java 的约定是用大小写混合的方式命名接口,并且每个单词的第一个字母要大写。虽然象 Singleton 或 DataInput 这样的描述性的名词经常用来命名一个接口,但是较受欢迎的 Java 约定是用象 Runnable 或 Cloneable 这样的描述性的形容词来命名 [GOS96]。
可替代的其它办法:
在接口名前加前缀“I”。[COA97] 建议在一个接口名的前面附加上字母“I”,结果使名字变为如 ISingleton 或 IRunnable 这样。这种方法有助于