编码入门
Posted ZhangShuo1999
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编码入门相关的知识,希望对你有一定的参考价值。
一. 编码基本功
1. 前言
根据实践数据可以看出,调试时间占据了我们开发时间中的最大部分,普遍能到60%。如果我们有方法大幅消减调试阶段的时间,效率自然能够大幅提升。
通过什么手段能够做到?
- 写好代码,以模块化为中心指导思想,尽量把代码写清晰,写健壮,少出一些BUG;
- 做好单测,以自动化为中心指导思想,尽量早,尽量低代价,尽量全面,验证所有逻辑,把BUG消灭于萌芽之中;
2. 6步法
这6个步骤,围绕『单测』这个核心,目的是提高单测的效率、效果,让单测可以成为一道『拦河大坝』,把BUG阻断在开发阶段,避免后续『大海捞针』,在大范围代码中定位BUG。
- 设计改善:对设计产出的API进行优化,以及对模块内部结构进行微调,做好分层和解耦。
目的是提升代码的模块性,让代码更容易理解,更容易调试,测试,修改,复用,扩展。
本步骤输出API函数的原型定义。 - 编写单测的用例&代码:在编写函数实现代码前,先编写函数的单元测试代码,利用单元测试来调试函数,降低函数调试的难度和工作量。本步骤输出API函数的单测代码。
- 函数代码实现:编写函数的实现代码,重点关注代码的易理解性,健壮性。利用前一步写好的单测案例进行逐函数调试。本步骤输出API函数的实现代码,完成代码调试。
- 覆盖率分析:在函数编写实现,并利用单测调试完毕后,收集覆盖率数据并分析,根据覆盖率数据衡量单测质量,增补新的单测用例。
- valgrind检测:对于C/C++,单元测试无法发现内存泄漏、溢出、线程类问题。可以利用valgrind对单测运行过程进行检查,排除这几类问题。
- codereview:对于设计类问题,以及只在特定异常场景发生的错误,单测、valgrind检测都无法完全消除。可以通过代码review,人工排除这一类的问题。
3. 设计中注意事项
- 在函数中要检查参数的有效性(可以使用assert),调用函数要检查函数返回值
- memcpy不能对重叠区域进行拷贝,memmove可以
- 释放过的指针要置为null
- 局部变量要初始化
- malloc分配内存要初始化才能使用
- 使用strtol替换atoi
二. 优秀项目
- lua,lua是一门简单快速的脚本语言。lua和C扩展模块之间的参数传递非常独特,是基于栈模型的。这让C代码操作LUA函数参数变得简单而快速。另外LUA语言的API设计非常简洁,头文件结构堪称典范,是学习怎么设计模块接口的好素材。
- git,git是linus在linux外对软件世界的另一卓越贡献。git的第一个版本是linus的个人作品,推荐从这个版本的源码开始阅读。
- cjson
- libevent
- sqlite3
- cmockery
- linux内核
以上是关于编码入门的主要内容,如果未能解决你的问题,请参考以下文章