这篇文章提出一些代码质量准则, 将这些准则融入日常写代码的习惯中,尽量保证在自然意识的状态下写出BUG很少的代码,减少写出藏有大量BUG的代码的几率。此准则供约束我个人编程行为使用,也供大家参考。 多读和借鉴优秀的源代码, 不求多写, 但求有意识地克制自己随手写代码的惰性。
推荐书籍: 《代码质量》, 《整洁代码之道》, 《Writing solid sode》, 《代码大全》
写在前面的话:
写代码不仅仅只是实现指定需求; 多想想所要实现需求的相关联事物,比如关联的外部子系统,关联需求等。
跳出当前视角,尽量从更宏观的角度审视原有代码; 多用设计性的思维来看待和完成编程工作。
写代码不是简单地敲键盘,其间会涉及到很多的微决策,正是这些微决策会慢慢磨练出一个人的思考和决策能力。
准确理解API, 尽可能理解自己所编写的每一行代码, 至少要从代码的语义上确定无误。
1. 写朴实自然的代码。尽量遵循惯用法和大众用法,以及所用编程语言地道的方式。奇淫巧技可以贴在论坛里供大众观摩欣赏,但不宜放在生产环境。
2. 逻辑清晰、简洁、紧凑。写代码就如同说话一样,想清楚了再说。说出口就应该是简洁、有条理、干脆利落的,不要罗嗦,拐弯抹角。
3. 写代码前规划一下思路,做一点设计性的思考工作; 约束条件、资源、算法和流程先用草图勾画清楚。
5. 代码风格保持一致性。 包括缩进、空行、换行、操作符两边的空格、命名等。可以在 K&R 《TCPL》 的风格基础上建立自己的风格。
6. 考虑所有的输入,限定合法输入的范围,拒绝非法输入; 尽可能使用成熟的库、框架和数据交换格式(例如XML和JSON),而不是手工解析。
7. 保证输出内容正确完整,格式清晰; 若输出依赖于某些变量,要保证当变量修改时能够同步到输出。
8. 使用成熟的算法; 必要的话,验证所采用计算方法的正确性。
9. 捕获所有的异常。将错误隐藏在底层,保证高层视图的正确性;给出合理的提示信息及错误源信息。
10. 注释简洁扼要,标明隐含的不易猜测的含义; 必要的时候写明引用出处; 标注作者信息及联系方式以供交流。
11. 跳出当前视角,尽量从更宏观的角度审视原有代码; 使用重构尽可能消除重复的代码。
12. 涉及并发的代码要尽可能审慎, 把事情的机理和风险理解清楚了再动手。
13. 隔离易出错部分, 将复杂、晦涩、容易出错的手工解析代码隔离在系统的小角落范围。
14. 分离可变和不可变部分。
15. 建立单元测试和回归测试。
16. 理解和遵循已有规范。仅在有充分理由并与相关人士做好沟通之后少量违例。
下面是一些细节和注意事项:
16. 涉及范围(数组、集合等)的代码要特别注意空值及边界情况。
17. 涉及多个与或非复合条件判断时要小心,正确使用与或操作符; 此外,不要误敲操作符,比如将 && 写成 & 。== 写成 = 。
18. 关联变量或方法要注意同步修改。比如 java 的 equals 与 hashCode 方法; 圆类的 边长与面积字段。
19. 保证传递参数的数目、类型和顺序正确;准确理解 API , 尽量传入合法且有意义的值。
20. 延迟初始化,使用有意义的初始值,该初始值可以作为默认值。
21. 防止计算溢出、缓冲溢出、SQL 注入等常见安全问题。
22. 避免大量创建不可变对象,尽量重用对象; 用完后及早回收,预防内存不足和泄漏。
23. 最好不要复制/粘贴代码, 尽管很便利; 如果有可能, 抽出共性作为公用子例程。
24。尽量不要使用全局变量,共享变量。
25. 不确定多个复合操作的优先级时,将操作加括号。
26. 在操作对象引用或指针时,先进行非空检查。若为空,可以给出提示信息、返回默认值,或者什么都不做。
【未完待续】