高质量代码开发总结
2016-02-29 20:15
197 查看
编写代码本身不是一件很复杂的事情。按照一定的逻辑,配合一定的IDE工具,撸起袖子马上就可以干起来。但是不可否认,人与人开发代码的质量还是有差别的。有的同学虽然写代码写了很长时间,但是常常眉毛胡子一把抓,要结构没有结构,要逻辑没有逻辑,更谈不上扩展、测试和性能分析了。那么,个人怎么写出质量还可以的代码呢?
1. 设计清楚代码的流程和状态机
2. 将流程、图标用markdown标记出来
3. 分析清楚将来代码的部署环境
一般的编译工具都会对不合理的code给出告警,但是这种告警是非常weak的。所以,我们还会使用第三方工具来检测代码中还有什么风险。windows上用的比较多的就是pclint,linux上用splint比较多。
总之,基本流程应该是这样的,
Startdesigncodestatic checkunit testdynamic testjenkinsEnd
结构分析和设计
谈到写代码,大家都喜欢一边code一边思考。按照我个人的经验来说,这不是一种很好的方法。要写出质量还可以的code,必须在逻辑上是经受得起考验,无论是状态机还是异常情况的考虑上都必须是完备的。然而在写code的时候,你的精力常常是分散的,根本没有办法考虑清楚每一种情况。所以,在code之前还不如把数据结构拆开来,好好分析一下代码的逻辑和流程,至少做到手到、笔到才可以。相关的一些工作都可以在这段时间完成,1. 设计清楚代码的流程和状态机
2. 将流程、图标用markdown标记出来
3. 分析清楚将来代码的部署环境
编译代码之前再好好阅读一遍
编写好code之后,很多同学都喜欢马上运行,恨不得马上就见到效果。但是,一步到位的情况是很少发生的。或多或少,你的代码会有这样那样的问题,与其在将来才发现这些问题,还不如从头到尾阅读几遍,自己讲给自己听。如果觉得不好意思,可以改成默念的形式,买一只小挂件放在电脑旁边对着它讲也可以。读个几遍之后,一般的编译错误都可以被你发现的,或者说逻辑十分简单的错误也是逃不了你的法眼的。做好了这一步,就可以开始编译调试了。
学会用pclint等代码检测工具检查你的code
一般的编译工具都会对不合理的code给出告警,但是这种告警是非常weak的。所以,我们还会使用第三方工具来检测代码中还有什么风险。windows上用的比较多的就是pclint,linux上用splint比较多。学会单元测试
各个编程语言都有自己的编程框架,c有cunit,cpp有cpp unit,java有junit。编写单元测试的目的就是测试function对各种输入的响应情况,有没有异常的情况发生。随着测试用例,其实我们对code的信心也会越来越强,不然每一次发布软件的时候,都是胆战心惊的。单纯的黑盒测试是根本没有办法从coverage上面覆盖到所有情况的,所以除了dump功能的function之外,配套的单元测试是十分有必要的。检测内存泄漏
对于一般的上层软件来说,打交道最多的就是内存,设备空间它也访问不了,中断也没法做,异常也没法处理。所有的资源都需要通过syscall向os申请才可以,这时候检测内存泄漏就十分必要了。一般的客户端程序对于内存泄漏可能看得没有那么重,但是server确实避免不了的,毕竟它是需要长时间运行的。好在有现成的工具可以帮助我们检测内存泄漏的相关情况,linux上用的比较多的就是valgrind。还不清楚的同学可以去好好试一试。性能分析
按照我个人的经验,软件的性能分析其实是十分伤脑经的,但是也是有规律可循的。一般来说,对于app来说,花费时间最多的地方就是memory copy,lock,database, socket这几个方面。当然,如果这几个方面如果都做得还可以,不妨可以从业务本身的角度去进行分析和优化,这常常也会有不错的收获。好在现在有很多的工具可以帮助我们分析一下软件的瓶颈究竟在哪,windows下用的比较多的就是vtune,linux是gprof。自动化集成测试工具
像jenkins这样的自动化集成测试工具在企业里面用的比较多。如果自己写的软件比较大,也可以用这种方法。如果只是几千行的小代码,不妨写一个bash脚本,把所有要做的动作用脚本串起来,效果也很不错。不停重构
很多时候,代码是需要不停重构的,这时候只要按照上面的逻辑不停迭代就可以了,当然测试用例也开始发挥它的作用了。总之,基本流程应该是这样的,
Startdesigncodestatic checkunit testdynamic testjenkinsEnd
相关文章推荐
- thinkphp3.2架构及源码理解
- java中值类型和引用类型的区别
- 《Java实战开发经典》第五章5.8
- Django学习-01
- 102. Binary Tree Level Order Traversal
- 南阳ACM 题目275:队花的烦恼一 Java版
- 南阳ACM 题目275:队花的烦恼一 Java版
- c语言中字符数组和字符指针的区别
- 107. Binary Tree Level Order Traversal II
- Java验证辛钦大数定理
- 基于FPGA的音频信号的FIR滤波(Matlab+Modelsim验证)
- 白话Spring(基础篇)---参数注入
- C++中输入带有空格的字符串
- java中的匿名内部类总结
- Java中值类型和引用类型的区别
- 呵呵!手把手带你在 IIS 上执行 Python
- C# string类Remove函数未生效
- 将java源码打成jar包
- java学习2-round和flour和字符串
- classloader类加载器——java类的加载方式