java代码规范

前言

  1. 一个软件的生命周期中,80%的花费在于维护,代码规范降低了金钱成本和时间成本;
  2. 几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护,代码规范减少了工作交接过程中的交流成本。
  3. 规范可以改善软件的可读性,可以让程序员尽快而彻底地理解新的设计和代码,节约了时间,提高了工作效率。

编程规约

  • 命名规范
  1. 命名总体原则和概述
  • 名字应该能够标识事物的特性,并且与业务挂钩。
  • 名字一律使用英文单词,而不能为拼音。
  • 名字可以有两个或三个单词组成,但不应多于4个,控制在3至30个字母以内。
  • 在名字中,多个单词用大写第一个字母(其它字母小写)来分隔。例如:IsSuperUser。
  • 命名避免和以下关键字冲突
    如:Base,Date,Class……
  • 方法名、参数名统一使用驼峰命名法(Camel命名法),除首字母外,其他单词的首字母大写,其他字母小写,类名每个组合的单词都要大写;
    正例:localValue/getHttpMessage()/inputUserId
  1. 方法
  • 增加/插入的方法用add作为前缀;
    正例:add*/addGrade()
  • 删除的方法用delete作为前缀;
    正例:delete*/deleteGrade()
  • 更改/更新的方法用update作为前缀;
    正例:update*/updateGrade()
  • 查询/获取单个对象的方法用find作为前缀;
    正例:find*/findGrade()
  • 查询/获取多个对象的方法用query作为前缀;
    正例:query*/queryStudentList()
    在具体任务开发中,如果有特定的命名约定,则在相应的软件开发计划中予以明确定义及上报质量管理部审计组。
  1. 枚举 (Enum)
  • 对于 Enum 类型和值名称使用 Pascal 大小写。
  • 命名不能缩写,枚举内的内容可以缩写。
  • 命名禁止加Enum 后缀。
  1. 参数
  • 参数名称使用Camel大小写
  • 参数名称可缩写
  1. **属性 (property) **
  • 以名词或形容词命名。
  • 使用 Pascal 大小写。
  • 禁止缩写。
  • javabean属性命名尽量使用常规的驼峰式命名规则
  • 属性名第一个单词尽量避免使用一个字母:如eBook, eMail。
  • boolean属性名避免使用 “is” 开头的名称,因为javabean规范的boolean取值操作是isXXX
  • 在类属性的名称中包含类名是多余的,如 Book.BookTitle。而是应该使用 Book.Title。

6.常量 (const)

  • 禁止缩写。
  • 采用完整的英文大写单词,在词与词之间用下划线连接,如:DEFAULT_VALUE。
  • 命名尽量简短,不要超过16个字符
  • 同一组的常量可以用常量类封装在一起,便于引用和维护
  • 代码中用到常量的,用静态常量表示,
    正例:
    Private final static String SUCCESS=”success”;
    Private final static String ERROR = “error”;
    调用:类名.SUCCESS
  1. 字段和变量
  • private、protected 使用 Camel 大小写。
  • 禁止使用public。
  • 字段命名规范:驼峰命名 比如:studentName,studentId
  • 对于主键字段, id命名:如:studentId,需要加上与实体类相关的名称。
  • 对于时间类型的字段,采用dateTime, 格式:YYYY-MM-dd HH:mm:ss
  • 布尔变量名应该包含 Is,这意味着 Yes/No 或 True/False 值,如 fileIsFound。
  • DataSet类型的变量以ds开头,DataTable类型的变量以table开头
  • 在变量名中使用互补对,如 min/max、begin/end 和 open/close。
  • 即使对于可能仅出现在几个代码行中的生存期很短的变量,仍然使用有意义的名称。仅对于短循环索引使用单字母变量名,如 i 或 j。
  • 对不易清楚识别出该变量类型的变量应使用类型缩写作其前缀,如字符串使用strXXX,boolean使用isXXX,hasXXX等等。
  • 命名尽量简短,不要超过16个字符
  1. 静态字段
  • 使用名词、名词短语或者名词的缩写命名静态字段。
  • 使用帕斯卡(Pascal)命名法,又叫大驼峰命名法,每个单词的第一个字母都大写;
    正例:int MyAge;
    char MyName[10];
  1. 集合
  • 用名词加集合名称的方式来命名,第一个单词首字母小写,如:

  • 禁止使用单个字母如l,m来命名。

  • 数组应该总是用下面的方式来命名:

  1. 泛型
  • 以一个大写字母(建议优先使用T)表示类的类型,以一个小写字母(如:t)表示类名。
  1. JS代码
    Js中不要用alert用$.message.alert
    datagrid加在数据时,尽量使用js的方式加载,而不是在jsp的table中编写url等信息,这样可以使我们的datagrid加在数据是更加的灵活。
  2. 分页信息获取
    分页时,pageNum或pageSize取值时,用三目运算符?:
int pageNum = Integer.parseInt(page == null ? "1" : page);
int pageSize = Integer.parseInt(rows == null ? "15" : rows);
  • 注释规范
  1. 注释原则
  • 一般情况下,源程序的有效注释量必须在30%以上。
  • 避免使用装饰性内容,保持注释的简洁。
  • 注释信息不仅要包括代码的功能,还应给出原因,不要为注释而注释。
  • 除变量定义等较短语句的注释可用行尾注释外,其他注释当避免使用行尾注释。
  • 注释类型:javadoc注释,失效代码注释(eclipse下ctrl+shift+/),代码细节注释 //。
  • 对类、方法、变量等的注释需要符合JavaDoc规范,对每个类、方法都应详细说明其功能、条件、参数等,并使用良好的HTML标记
  • 格式化注释,以使生成的JavaDoc易阅读和理解。
  • 如果注释太复杂说明程序需要修改调整,使设计更加合理。
  • getter、setter方法不用注释
  • 注释不能嵌套
  • 生成开发文档的需要用中文编写
  • 如果需要注释的内容太多,需附加文档进行说明, 注释时加上"参见《****》"
  • 距离较远的}必须注释
  • 复杂的分支流程必须注释
  • 代码质量不高但能正常运行,或者还没有实现的代码用//TODO:声明
  • 存在错误隐患的代码用//FIXME:声明
  1. 注释格式
    单行注释:
//……”

块注释:

/*……*/

文档注释:

/**……*/

Javadoc注释标签语法:
@author 对类的说明 标明开发该类模块的作者
@version 对类的说明 标明该类模块的版本
@see 对类、属性、方法的说明 参考转向,也就是相关主题
@param 对方法的说明 对方法中某参数的说明
@return 对方法的说明 对方法返回值的说明
@exception 对方法的说明 对方法可能抛出的异常进行说明
类(接口)注释
正例:

 /**
* 类的描述
* @author Administrator
* @Time 2012-11-2014:49:01
*
*/
public classTest extends Button {
  ……
}

构造方法注释
正例:

public class Test extends Button {
  /**
   * 构造方法 的描述
   * @param name
   *       按钮的上显示的文字
   */
  public Test(String name){
     ……
  }
}

方法注释:
方法注释+姓名+时间+java开发版本

全局变量注释:
正例:

public final class String
   implements Java.io.Serializable, Comparable<String>,CharSequence
{
   /** xxxxxxxxxxxxxx*/
   private final char value[];
   /** xxxxxxxxxxxxx */
   private final int offset;
   /** xxxxxxxxxxxxx */
   private final int count;
   /** xxxxxxxxxxxxx */
private int hash; // xxxxx
……
}

字段/属性注释:
正例:

public class EmailBody implements Serializable{
   private String id;
   private String senderName;//发送人姓名
   private String title;//不能超过120个中文字符
   private String content;//邮件正文
   private String attach;//附件,如果有的话
   private String totalCount;//总发送人数
   private String successCount;//成功发送的人数
   private Integer isDelete;//0不删除 1删除
   private Date createTime;//目前不支持定时 所以创建后即刻发送
   privateSet<EmailList> EmailList;
……
}

修改代码注释:
页面注释:
如:显式注释:在html中存在注释:
隐式注释:可以使用java中的“//”、“/…./”,以及JSP中自己的注释:“<%-- 注释内容 --%>”

<%-- 
-创建人 
-创建时间 
-版本号 
-文件名 
-备注 
-修改人 
--%>
  • 格式规范
    2.3.1总原则
  1. 采用eclipse作为开发工具,编码风格总体和eclipse编码风格一致。
  2. 写代码时,不必特意设定空格、对齐等;写完一个方法或一个类后,用eclipse的格式化工具完成格式化即可,快捷键:CTRL+Shift+F
  3. 注意:Eclipse格式化工具默认会进行空格、缩进排版,会自动在两个函数间加入空行,但不会自动修改函数体内的空行——即:函数
  4. 体内语句间如果需要空行,则要手工加入。
    2.3.2 声明
    每行只能声明一个变量,如:

禁止:

2.3.3空行规则
头注释与import 与package之间

方法间空一行

2.3.4空格规则
需要增加空格的地方有:
情形 示例
在大多数运算符之前和之后 if (a + b > c)
“(” 的前面 例如:if ((a>b) && (c>d)) 不要写成 if((a>b)&&(c>d))
例外:表示函数调用的括号不用加空格。如:getData(param1);
|, &, ||, && 前后 if (a>b && c>d)
“=” 前后 a = 100;
三元操作符 ? : 的前后 maxValue = a>b ? a : b;
函数调用的各个参数之间 getData(param1, param2, param3);
比较符前后 a > b //不强制
case 的后面 case “none”
语句表达式之间 for (expr1; expr2; expr3)

2.3.5大括号规则

 书写规则:
if (expression) (推荐)
{

        }

2.3.6对齐规则
 当方法参数过多时当在每个参数后(逗号后)换行并对齐。
 当控制或循环中的条件比较长时当换行(操作符前)、对齐并注释各条件。
 变量定义最好通过添加空格形成对齐,同一类型的变量应放在一起。

2.3.7缩进规则
使用一个“Tab”为每层次缩进(默认4个空格,有的规范也要求2个空格,依要求而定,所有IDE都可以设置)。
按层级缩进,缩进层级不能超过5层,否则需要拆分函数

2.3.8小括号规则
 不要把小括号和关键词(if 、while等)紧贴在一起,要用空格隔开它们。如:
if (true)
{

        }

 不要把小括号和函数名紧贴在一起。
 除非必要,不要在Return返回语句中使用小括号。因为关键字不是函数,如果小括号紧贴着函数名和关键字,二者很容易被看成是一体的。
 尽量不要在返回语句中使用()。
2.3.9语句规则
语句总则

  1. 统一使用Eclipse格式化工具进行格式化,默认快捷键:Ctrl+Shift+F

  2. 尽量避免强制类型转换。如果不得不做类型转换,尽量用显式方式。

  3. If else 中的业务代码行数太长,否则就要考虑用函数封装

  4. 避免在表达式中用赋值语句

  5. 避免对浮点类型做等于或不等于判断

  6. 杜绝魔法数字, for循环的最大数等也要用变量代替,以便知道是什么含义

  7. 对象比较运算,常量放在前面,比如"aaa".equals(str)

  8. Boolean的"假"判断格式:if(false==isMax) 而不用if(!isMax),因为非符号"!"不清晰

  9. 如果一段带有业务逻辑的代码超过两次用到,就将其封装成一个方法

  10. 单个循环也要用{}

  11. 每个变量仅有一个唯一的用途

  12. 单个函数执行单个功能并与其命名相符

  13. 消除所有编译器警告

  14. 常数变量声明为final

  15. 每个if-else if-else语句都有最后一个else以确保处理了全集

  16. 对于流操作代码的异常捕获有finally操作以关闭流对象,比如:

  17. 对同步对象的遍历访问必须进行代码同步处理

  18. 在对Map对象使用迭代遍历过程中保证没有做增减元素操作

  19. If else判断语句避免头重脚轻,比如if的代码段过大,else的代码很短,这时候要调整结构。

  20. 每一行最多包含一条语句。
    循环语句

  21. 务必检查,杜绝死循环

  22. 即使循环体只有一条语句,也要用花括号括起

  23. 尽量不用空语句,特殊情况用到空语句,写好注释,告诉读者这不是bug

  24. 循环中禁止使用访问数据库的操作,循环内部如果需与数据库交互,而应提前一次性读取出。

Switch-case

  1. 语句switch中的每个case各占一行。

  2. 所有的非空 case 语句必须用 break; 语句结束。例:

    1. 语句switch中的case按字母顺序排列。
  3. 为所有switch语句提供default分支。
    2.3.10模块化规则
    某一功能,如果重复实现一遍以上,即应考虑模块化,将它写成通用函数。并向小组成员发布。同时要尽可能利用其它人的现成模块。

2.3.11函数复杂度规则
单个函数的功能不能过于复杂,不能超过以下限定:
 单一功能子函数代码不得超过50行、形参个数不得超过7个、程序嵌套深度不得超过7层。
 圈复杂度必须在15以内,对程序的修改或扩展不得增加其原有圈复杂度。

2.3.12编码风格规则
编码过程中需遵循以下风格习惯:
 代码未写,文档先行,注释必须按照固定统一范式撰写。
 关系运算必须常量在左、变量在右。
 不许使用复杂的运算表达式,必要时添加括号而不依赖于优先级。
 魔鬼数字需用宏定义替代。
 局部变量必须初定义、避免不必要的内存操作、内存操作必须考虑异常处理。

2.3.13版本管理规则
本项目中,每个任务在完成一个稳定的版本后,都应打包并且归档。源码包的版本号由圆点隔开的两个数字组成,第一个数字表示发行号,第二个数字表示该版的修改号。具体用法如下:
 当源码包初版时,版本号为 V1.00;
 当源码包被局部修改或bug修正时,发行号不变,修改号第二个数字增1。例如,对初版源码包作了第一次修订,则版本号为 V1.01;
 当源码包在原有的基础上增加部分功能,发行号不变,修改号第一个数字增1,例如,对V1.12版的基础上增加部分功能,则新版本号为 V1.20;
 当源码包有重要修改或局部修订累积较多导致源码包发生全局变化时,发行号增1。例如,在 V1.15 版的基础上作了一次全面修改,则新版本号为 V2.00。

数据库规约

发布了94 篇原创文章 · 获赞 33 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览