在刚学习软件构造课程时,由于刚开始使用JAVA写程序,对许多格式规范不了解,对规约,注释的书写内容及规范也不清楚,导致写好的程序惨不忍睹。经过一段时间的学习,进行了简单的整理总结,其中可能有遗漏或错误,欢迎指出。
目录
命名规则
对于JAVA的命名规范有很多,这里我们只对一般情况采用的命名规则的几个简单要点进行总结。
总体规则
一、项目名全部小写;
二、包名全部小写;
三、类名首字母大写,其余组成词首字母依次大写;
四、变量名,方法名首字母小写,如果名称由多个单词组成,除首字母外的每个单词的首字母都要大写;
五、常量名全部大写;
六、对于JAVA编程中的所有命名规则,都需要遵守以下规则:
1、名称只能由字母、数字、下划线、$符号组成。
2、不能以数字开头。
3、名称不能使用Java中的关键字。
4、坚决不允许出现中文及拼音命名。
类命名规则
JAVA中类的命名采用大驼峰法(即帕斯卡命名法),即类名由一个或多个单词组成,每个单词的第一个字母大写,单词中的其他字母小写。
JAVA中的类名一般由名词或名词短语组成,表示这个类的具体内容,应避免采用x1,x2此类无意义的命名,也可以增加形容词,表示类具有某种功能。
测试类要以Test结尾;异常类要以Exception结尾作为标识。
类名不应过长,当类名较长时可以适当的采用缩写,但所有命名中的缩写都应该保持一致。
方法命名规则
JAVA中方法的命名采用小驼峰法,即方法名由一个或多个单词组成,第一个单词小写,此外每个单词的第一个字母大写,单词中的其他字母小写。
方法名应该见名知义,一般为动词短语表示实现的功能,如添加前缀get表示获得值;添加前缀set表示设置值;添加前缀remove表示删除等等。
常量与变量命名规则
JAVA中常量命名一般要求全部大写,单词之间通过下划线 _ 分割。
JAVA中变量命名也采用小驼峰法,第一个单词小写,此外每个单词的第一个字母大写,单词中的其他字母小写。
变量命名尽量采用有意义的单词,尽量写全称;i,j,k等单个字母的变量尽量只作为小型循环的循环索引变量。
不要用同一个变量名表示前后不同的两个变量。
规约
规约是JAVA方法的一个重要部分,有了规约,对客户端和实现者都有益处。
规约的作用
一、规约可以使得客户端和实现者之间达成某种契约,简单来说,规约中描述了我们的方法实现的具体功能以及要应用我们的方法需要满足的要求,有了规约,就有了明确的任务,也就能够判断我们的代码是否实现了功能(可以说我们的程序有了对错之分),也有助于开发者之间的理解;同时由于实现者与客户端达成契约,对于双方都有了明确的要求,调用双方都需要遵守,出现问题后的责任也有了明确的区分,而不是简单的依靠程序员或顾客的“自觉”实现。
二、规约是对我们方法函数的抽象,我们的客户端不需要知道方法是如何被实现的;实现者也不需要了解自己的方法将会如何被应用。规约扮演了一个“防火墙”的角色,实现了解耦的作用,
规约的内容
规约应当指明以下内容:
一、输入和输出的数据类型是什么
二、函数的功能是什么(输入什么内容,返回什么结果),对其正确性的预期
三、函数性能的预期
规约应该包括以下两部分结构:
前置条件:是对客户端的约束,即使用方法时必须满足的条件
后置条件:是对实现者的约束,即方法结束时必须满足的条件
注意事项
一、规约中只讲实现什么,不讲怎么实现,比如我们只需要写“返回数组中的最大值”,而不是“通过遍历比较返回数组中的最大值”
二、在我们的方法中,当前置条件被满足时,后置条件必须满足。而当前置条件不满足时,方法中可以是任意操作而实现者没有提醒的义务,但通过快速失败(如检测并抛异常)可以使得bug更容易被找到。
三、方法应该尽量不修改输入的参数,要求一定要修改时必须在后置条件中声明。
四、可以在规约中说明某个量不可变,以告知客户端避免修改其内容。
五、注意方法规约的格式,开头为/**,之后每行以*开头,最后一行以*/结尾。
/**
* 函数功能说明
*
* @param 参数1 内容说明
* @param 参数2 内容说明
* @return 返回值 内容说明
* @throws 抛异常情况说明
*/
RI、AF及暴露安全性
作为一种良好的编程习惯,这三个内容都应该在抽象数据类型的声明后书写说明。
RI
RI就是Rep Invariant,也就是表示安全性,在RI中需要说明,什么样的表示是合法的,可以是合法表示值的一个集合,也可以是合法表示需要满足的条件。
AF
AF就是Abstraction Function,也就是抽象函数,他是解释表示值与抽象值之间对应关系的函数,我们可以把他当作对合法表示值含义的解释说明(如解释每个rep表示什么内容)。
暴露安全性
暴露安全性常常写作Safety from rep exposure,这部分是一个“自证清白”的过程,简单来说,这里要说明的就是对于我们的内部表示,为什么其不会发生对外泄露,一般来说,如果是对于private的不可变的类型,我们只需要说明其是私有且不可变的即可,但对于可变的类型说明比较复杂,往往需要我们对如何防止其暴露的操作进行说明(比如返回值是其一个副本而非其本身)。