Java 编程规范

好的软件:

可维护性
可测试性
可靠性
性能
简洁
可移植性

华为 Program SMaRT 定义

高效
可移植
简洁
可维护
可靠
可测试

编程规范

排版:

原则

团队一致

规则:

  1. 在不同概念之间增加空行
  2. 将逻辑紧密相关的代码放在一起
  3. 控制一行的宽度,不要超过120个字符
  4. 控制一行的宽度,在不同的概念间增加空格
  5. 控制采用缩进来区分不同层次的概念(4个空格)

建议:

  1. 将局部变量的作用域最小化
  2. if,for,do,while,case,swich,default等语句自占一行,且if,for,do,while必须加括号
  3. 控制文件的长度,最好不要超过500行

注释:

尽量用代码来解释自己

1. 注释解释代码的意图
2. 保证注释与代码一致
3. 注释与代码相邻,上下方
4. 不要用注释保留废弃代码
5. 不要用注释记录修改日志

命名

原则:

团队为包、类、方法、变量取一个号名字

规则:

  1. 禁止使用魔鬼数字
  2. 常量命名,由全大写单词组成,单词间用下划线分隔,且使用static final修饰
  3. 变量、属性命名,使用名词,并采用首字母小写的驼峰命名法
  4. 方法的命名,用动词和动宾结构,采用首字母小写的驼峰命名法
    格式如下:
    get+非布尔属性名()
    is+布尔属性名()
    set+属性名()
    has+名词/形容词()
    动词()
    动词+宾语()
  5. 类和接口的命名,采用首字母大写的驼峰命名法
  6. 包的命名,由一个或若干个单词组成,所有的字母均为小写

建议:

数组声明用 int [] index ,而不用 int index []

变量和类型

原则:

谨慎使用静态成员变量

规则:

1. 避免随意进行类型强制转换,应改善设计,或在转换前用instanceof进行判断
2. 需要精确计算时不要使用float和double,建议用long,BigDecimal等
3. 不能用浮点数作为循环变量,精度问题会导致错误
4. 浮点型数据判断相等不能直接使用==,做减法,取绝对值和极小值对比,double用1E-6对比
5. 避免同一个局部变量在前后表达不同的含义
6. 不要在单个的表达式中对相同的变量赋值超过一次

方法

原则:

  1. 短小
  2. 单一,一个方法仅做一件事情
  3. 单一抽象层次原则
  4. 命令与查询职责分离

规则:

  1. 不要把方法的入参当作工作变量/临时变量,除非特别需要(在方法里定义一个临时变量运算)
  2. 使用类名调用静态方法,而不要使用实例或表达式来调用

建议

  1. 应明确规定对接口方法参数的合法性检查 由 调用者负责还是由接口方法本身负责
  2. 谨慎使用可变数量参数的方法
  3. 对接方法的参数个数不宜过多

包、类、接口

原则:

  1. 类和接口的设计应该遵循面向对象SOLID设计原则
  2. 类的设计应遵循迪米特法则
  3. 类的设计应遵循 Tell,Don't ask 原则

规则

  1. 除提供给外部使用的全局变量外,应尽量避免类成员变量被外部直接访问
  2. 避免在无关的变量或无关的概念之间重用名字,避免隐藏(hide)、遮蔽(shadow)和遮蔽(obscure)
  3. 不要在父类的构造方法中调用可能被子类覆盖的方法
  4. 覆写equals方法时,应同时覆写hashCode方法
    1. 同一次运行中,同一个对象如果equals方法中信息没变,多次调用hashCode返回值必须相同
    2. 两对象调用equals方法相同,则他们的hashCode方法也必须返回相同值
    3. 两对象调用equals方法不同,他们调用hashCode方法,不要求返回值不同

异常

原则:

只针对真正异常的情况才使用exception机制

规则

  1. 对可恢复的情况使用受检异常(checked exception),对编程错误使用运行时异常(runtime exception)
  2. 不要忽略异常
  3. 方法注释和文档中要包含所抛出异常的说明
  4. 方法抛出的异常,应该与本身的抽象层次相对应
  5. 在finally 块中不要使用return、break或continue使finally块非正常结束
  6. 不要直接捕获受检异常的基类Exception

建议

  1. 对第三方API抛出的大量各类异常进行封装
  2. 一个方法不应该抛出太多类型的异常

语言特性

规则

  1. 运算和表达式 不要写复杂的表达式,将难懂的语句封装到方法里,用方法名自注释
  2. 运算时应避免产生溢出 BigInteger

建议

运算采用括号明确运算的优先级

控制语句

  1. 在switch语句的每个case、和default中都放置一条break语句
  2. 采用for-each代替传统的for循环

泛型

在集合中使用泛型

其他

新代码不要使用已标注为@deprecated 的方法

测试

基本概念

定义:测试是一个包含计划,准备和测量活动的过程,其目的是确认
被测系统的特性,并指出需求和实现之间的差异。

目的

发现缺陷
增强对质量的信心
为决策者提供信息
预防缺陷

分类:

  • 是否需要执行: 静态测试、动态测试
  • 测试不同阶段:单元测试,系统测试,集成测试,验收测试
  • 是否需要了解内部结构:黑盒测试,白盒测试

静态测试方法:

1. 代码检查工具检查
2. 走读
3. 检视

动态测试方法:构造测试实例,执行程序,分析输出结果

1. 等价类划分
2. 边界值分析
3. 决策表分析
4. 判定条件覆盖
5. 条件组合覆盖

单元测试

对模块做测试,叫单元测试

软件开发生命周期

需求分析--架构设计--规格说明--编码--单元测试--集成测试--操作系统测试

Junit
单元测试框架

Test 测试接口
TestCase 测试集 多个测试
TestSuite 测试用例、套件 只有一个

posted @ 2018-02-16 09:27  daminzhou  阅读(4027)  评论(0编辑  收藏  举报