1、代码质量
软件质量:满足客户软件需求的能力
高质量的软件产品应该符合用户需求、运行稳定、性能优异、维护简单、文档齐全
代码质量目标
课维护性是代码优化的理论基础,也是代码优化的终极目标
2、代码质量静态检查工具
代码分析技术:
静态分析:对程序代码的检查(不执行程序的情况下分析)
动态分析:程序运行时检查(自动化代码审查,着重于内存、性能和资源的检查)
3、代码质量优化通用准则
(1)避免使用空块
多余的分号、多余大括号、空finally语句
避免使用空类
(2)去掉多余的import
使用哪个就引入哪个,不然降低程序的可读性
(3)用BigDecimal类型进行精确计算
(4)要习惯用泛型代替原生类型
4、方法优化
方法是执行业务逻辑为我们提供服务的最直接的编程元素,因此方法设计的高效与否,方法设计的合理与否都会对系统造成很大的影响。
(1)最小化原则
成员变量、方法的访问权限,尽量减少方法的有效范围、也易于扩展与维护,保护本类数据操作的安全性
封装、数据隐藏
get/set方法的使用
(2)hashCode与equals
任何一个类都继承于Object类,没有重写equals方法,默认对象之间的比较用的是对象地址,没有重写hashCode方法,hash值也是根据对象地址来计算的,实际应用中漏写了就会出现意外结果
也要注意:产生不容易删除的Hash对象
将一个对象添加进入集合中就不要修改其内部参与计算hashCode的属性了,如果修改了,这个对象就不容易被删除了
(3)使用string.equals("string")的弊端
(4)不具有继承关系的类,不要有同名方法
(5)检查方法参数的有效性
(6)优化方法中参数过多过长
把参数提升为类成员变量
引入参数对象
(7)避免使用过时的API
过时的API会存在性能或算法等方面的缺陷
(8)善于用已有的方法
(9)一个方法不宜过长
分解方法/合并方法
6、优化类与接口
类与接口是组建优秀架构体系的最小元素
(1)避免创建不必要的对象
(2)避免使用对象的浅拷贝
clone方法生成一个对象时,不会执行构造方法,只是在内存中进行数据块的复制
浅拷贝的实质就是直接内存栈区的复制
深拷贝的实质是不但拷贝内存栈区而且把拷贝对象所对应的堆区的内容也复制一份
(4)优化类
如果类中有多个成员变量,可以提炼出DTO(Data Transfer Object,数据传输对象)或者DVO(Data Value Object,数据价值对象)
(5)避免在接口中实现代码
接口是一种契约,一种框架性协议
7、正确使用异常
(1)避免定义继承Error或Throwable子类
Throwable类是所有异常和错误的超类,有两个子类Error和Exception,表示错误与异常
异常类Exception类分为运行时异常(RuntimeException)和非运行时异常(非检查异常--由程序逻辑错误引起、检查异常--程序不能编译通过)
(2)避免在finally块中处理返回值
(3)避免使失败失去原子性
数据的操作必须保持原子性,不然对系统会造成致命错误,数据不完整,数据的不整合性
(4)对异常进行封装
自定义异常,捕获异常进行统一处理
(5)避免乱用异常
对一些数据校验、逻辑检查,不要通过异常来实现
异常机制会降低程序的性能
8、优化代码性能
(1)避免在大量字符串拼接时用“+”
不考虑线程安全时,使用StringBuilder
考虑线程安全时,使用StringBuffer
(2)避免在循环体内生成临时对象
对象时放在堆里面的,对象的生成对内存与性能都是有影响的
(3)在频繁插入与删除时使用LinkedList
(4)文件操作后进行清理工作
文件操作对系统资源开销比较大,如果不做清理工作,就会发生内存不足,甚至系统崩溃
代码性能优化只是系统性能优化的一部分,还有硬件设备优化(如设备性能优化、设备数量优化、存储优化)、运行环境优化(如宽带优化)、服务器优化(如负载均衡优化、JVM优化)、数据库性能优化(如连接池优化、复杂SQL优化)等
9、架构优化
(1)单一职责原则
每个类要设计短小精炼、职责分明
分层要清晰
(2)接口隔离原则
类中接口不能太多(太多违背接口隔离原则),不能太少(太少会导致接口泛滥、不利于维护)
(3)依赖倒置原则
依赖倒置原则,高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖于细节,细节应该依赖于抽象
TDD(测试驱动开发)开发模式就是依赖倒置原则最成功的应用
(4)里氏替换原则
子类型应该能够完全替换父类型
具有继承关系的类设计与优化时,要注意
子类可以实现父类的抽象方法
子类不能覆盖父类的非抽象方法
子类中可以增加自己特有的方法
(5)最少知道原则
迪米特法则
软件编程的基本原则就是高内聚低耦合
(6)扩展外部类功能
方法与数据被统一封装是面向对象编程的基本原则
定义本地类、继承开源工具类、在本地工程中使用本地扩展类
开闭原则(OCP)--对扩展开放、对修改关闭
11、代码风格
代码和注释是相辅相成的
单词之间空格不要过多
缩进不要乱
空白行不要多余
代码:正常系代码、异常系代码、注释
Java编程规范
名称要区分大小写(Java对大小写敏感)
包的名称要以功能来命名
包的名称全部用小写、使用网络域名
方法名称要以功能来命名--“动词+名称”形式
不保留被注释掉的代码
不要导入不使用的类、接口
不要导入整个包
可能出现null类一定要做null检测
JSP页面编码用UTF-8,引用部分使用双引号“”,JSP注释采用<%...%>