好的软件:
可维护性
可测试性
可靠性
性能
简洁
可移植性
华为 Program SMaRT 定义
高效
可移植
简洁
可维护
可靠
可测试
编程规范
排版:
原则
团队一致
规则:
- 在不同概念之间增加空行
- 将逻辑紧密相关的代码放在一起
- 控制一行的宽度,不要超过120个字符
- 控制一行的宽度,在不同的概念间增加空格
- 控制采用缩进来区分不同层次的概念(4个空格)
建议:
- 将局部变量的作用域最小化
- if,for,do,while,case,swich,default等语句自占一行,且if,for,do,while必须加括号
- 控制文件的长度,最好不要超过500行
注释:
尽量用代码来解释自己
1. 注释解释代码的意图
2. 保证注释与代码一致
3. 注释与代码相邻,上下方
4. 不要用注释保留废弃代码
5. 不要用注释记录修改日志
命名
原则:
团队为包、类、方法、变量取一个号名字
规则:
- 禁止使用魔鬼数字
- 常量命名,由全大写单词组成,单词间用下划线分隔,且使用static final修饰
- 变量、属性命名,使用名词,并采用首字母小写的驼峰命名法
- 方法的命名,用动词和动宾结构,采用首字母小写的驼峰命名法
格式如下:
get+非布尔属性名()
is+布尔属性名()
set+属性名()
has+名词/形容词()
动词()
动词+宾语() - 类和接口的命名,采用首字母大写的驼峰命名法
- 包的命名,由一个或若干个单词组成,所有的字母均为小写
建议:
数组声明用 int [] index ,而不用 int index []
变量和类型
原则:
谨慎使用静态成员变量
规则:
1. 避免随意进行类型强制转换,应改善设计,或在转换前用instanceof进行判断
2. 需要精确计算时不要使用float和double,建议用long,BigDecimal等
3. 不能用浮点数作为循环变量,精度问题会导致错误
4. 浮点型数据判断相等不能直接使用==,做减法,取绝对值和极小值对比,double用1E-6对比
5. 避免同一个局部变量在前后表达不同的含义
6. 不要在单个的表达式中对相同的变量赋值超过一次
方法
原则:
- 短小
- 单一,一个方法仅做一件事情
- 单一抽象层次原则
- 命令与查询职责分离
规则:
- 不要把方法的入参当作工作变量/临时变量,除非特别需要(在方法里定义一个临时变量运算)
- 使用类名调用静态方法,而不要使用实例或表达式来调用
建议
- 应明确规定对接口方法参数的合法性检查 由 调用者负责还是由接口方法本身负责
- 谨慎使用可变数量参数的方法
- 对接方法的参数个数不宜过多
包、类、接口
原则:
- 类和接口的设计应该遵循面向对象SOLID设计原则
- 类的设计应遵循迪米特法则
- 类的设计应遵循 Tell,Don't ask 原则
规则
- 除提供给外部使用的全局变量外,应尽量避免类成员变量被外部直接访问
- 避免在无关的变量或无关的概念之间重用名字,避免隐藏(hide)、遮蔽(shadow)和遮蔽(obscure)
- 不要在父类的构造方法中调用可能被子类覆盖的方法
- 覆写equals方法时,应同时覆写hashCode方法
- 同一次运行中,同一个对象如果equals方法中信息没变,多次调用hashCode返回值必须相同
- 两对象调用equals方法相同,则他们的hashCode方法也必须返回相同值
- 两对象调用equals方法不同,他们调用hashCode方法,不要求返回值不同
异常
原则:
只针对真正异常的情况才使用exception机制
规则
- 对可恢复的情况使用受检异常(checked exception),对编程错误使用运行时异常(runtime exception)
- 不要忽略异常
- 方法注释和文档中要包含所抛出异常的说明
- 方法抛出的异常,应该与本身的抽象层次相对应
- 在finally 块中不要使用return、break或continue使finally块非正常结束
- 不要直接捕获受检异常的基类Exception
建议
- 对第三方API抛出的大量各类异常进行封装
- 一个方法不应该抛出太多类型的异常
语言特性
规则
- 运算和表达式 不要写复杂的表达式,将难懂的语句封装到方法里,用方法名自注释
- 运算时应避免产生溢出 BigInteger
建议
运算采用括号明确运算的优先级
控制语句
- 在switch语句的每个case、和default中都放置一条break语句
- 采用for-each代替传统的for循环
泛型
在集合中使用泛型
其他
新代码不要使用已标注为@deprecated 的方法
测试
基本概念
定义:测试是一个包含计划,准备和测量活动的过程,其目的是确认
被测系统的特性,并指出需求和实现之间的差异。
目的
发现缺陷
增强对质量的信心
为决策者提供信息
预防缺陷
分类:
- 是否需要执行: 静态测试、动态测试
- 测试不同阶段:单元测试,系统测试,集成测试,验收测试
- 是否需要了解内部结构:黑盒测试,白盒测试
静态测试方法:
1. 代码检查工具检查
2. 走读
3. 检视
动态测试方法:构造测试实例,执行程序,分析输出结果
1. 等价类划分
2. 边界值分析
3. 决策表分析
4. 判定条件覆盖
5. 条件组合覆盖
单元测试
对模块做测试,叫单元测试
软件开发生命周期
需求分析--架构设计--规格说明--编码--单元测试--集成测试--操作系统测试
Junit
单元测试框架
Test 测试接口
TestCase 测试集 多个测试
TestSuite 测试用例、套件 只有一个