高质量编程
高质量代码————编写的代码能够达到正确可靠、简洁清晰的目标,各种边界条件是否考虑完备、异常情况处理、稳定性保证易读易维护
1. 编程原则
尽管各种语言和语法各不相同,但高质量编程遵循的原则是相通的。
简单性:消除“多余的复杂性”,以简单清晰的逻辑编写代码
可读性:代码是给人看的,不是给机器。可读性有利于后期维护。
生产力:团队整体工作效率非常重要
2. 编码规范
代码格式:使用格式化工具
注释:解释代码实现的原因
(公共符号始终要注释包中声明的常量、变量、函数以及结构都需要添加注释,不明显的也不简短的公共功能需要注释, 库中的任何函数都必须进行注释)
命名规范:简洁胜于冗长,见名知意
控制流程:避免嵌套,保持正常流程清晰。坚持线性原理,处理逻辑尽量走直线。(比如两个分支都含有return语句,则可以去除冗余的else)
错误和异常处理:尽可能提供简明的上下文信息链,方便定位问题。
性能优化
前提是满足正确可靠、简洁清晰等质量因素。
性能优化是综合评估,有时候时间效率和空间效率可能对立。避免常见的性能陷阱可以保证大部分程序的性能,普通应用代码不要一昧地追求程序的性能,越高级的性能优化手段越容易出现问题,在满足正确可靠、简洁清晰的质量要求的前提下提高程序性能。
map预分配内存:
- 不断向map添加元素的操作会触发map的扩容
- 提前分配好空间可以减少内存拷贝和Rehash的消耗
- 建议根据实际需求提前预估好需要的空间
字符串处理(使用StringBuilder):
- 使用+拼接性能最差,每次都会重新分配内存
- 字符串是不可变类型,占用内存大小是固定的
- 内存扩容策略,不需要每次拼接重新分配内存
使用空结构体节省内存:
- 空结构体struct{}实例不占据任何的内存空间
- 可作为各种场景下的占位符使用,节省资源
性能优化原则
- 要依靠数据不是猜测
- 不要过早优化
- 不要过度优化
- 要定位最大瓶颈而不是细枝末节
优化工具
业务服务性能优化:
对逻辑相对复杂的程序进行性能调优
- 服务:能单独部署,承载一定功能的程序
- 依赖:Service A的功能实现依赖Service B的响应结果,称为Service A依赖Service B
- 调用链路:能支持一个接口请求的相关服务集合及其相互之间的依赖关系
- 基础库:公共的工具包、中间件
流程
- 建立服务性能评估手段
- 分析性能数据,定位性能瓶颈
- 重点优化项改造
- 优化效果验证