编程拾遗

算法、技巧的文章太多,讲一点朴素的Coding方法。

命名

如何命名,讲这个的文章也特别多。

驼峰还是下划线方式,这个其实没有那么重要,关键还是可读性和代码风格的统一。

我这里聊一下我自己的经验。

  • 类型、结构体、枚举的命名
  1. 使用名词。
  2. 越详细越好,不要怕太长。
  3. 不是常用词的话,不要用缩写。
  • 变量、参数的命名,词能达意即可。变量、参数一般可以分作三类:
  1. 数值, 比如xxxCnt,xxxNum,xxxVal,xxxName,xxxPath,注意尽量使用名词。
  2. 布尔值(bool),比如 isXxx,hasXxx,只要加上 is或者has前缀,可读性立马上一个台阶,尽量避免使用 notXxx 或者 isNotXxx,这种否定为 true,肯定为 false的语义会把人搞疯掉的。
  3. 指针、引用, 比如 pXxx,xxxPtr,xxxRef,refXxx,这几种皆可。
  4. 对象、结构体,是什么就叫什么,这个没什么可说的。
  • 函数、接口的命名
  1. 固定前缀后的(如果有的话)第一个单词用动词,比如 xxx_capture_image,OpenXxx,OooInitXxx,CreateXxx等。
  2. 越详细越好,不要怕太长。
  3. 不是常用词的话,不要用缩写。
  4. set/get 成对出现
  5. 输入、输出能在参数命名以及参数类型(const修饰)上体现出来。

另外,名字体现的是用途和用法,使用条件(比如什么时候使用)就不要出现在名字里边儿了,这也是函数、接口仅需实现单一功能的原则。比如,在强光环境下,摄像头需要在强光过曝的情况下使用低曝光采图的接口命名,CaptureImageByLowExp 就比 CaptureImageOverExposure 更加合理。

封装、中间层

这两样东西,做得好了,让人大开眼界,做得差了,让人大跌眼镜。

什么时候需要封装,什么时候需要中间层,这是真的考验人。在最开始写代码的时候,往往会把问题想得简单了,就算经验丰富的程序员,最初设想的框架也架不住不断新增的业务逻辑和需求。所以封装以及添加中间层,多数都发生在代码重构或者代码编写过程中。

那么什么时候,我们才需要封装和中间层呢?简单点说

  1. 调用者和被调用者之间如果存在大量的逻辑、条件判断。
  2. 需要隐藏接口或者类似SDK统一API。
  3. 重复出现在多处的相同代码。

如果不是出于以上几个目的进行的封装,都是过度封装。冗余代码不仅降低可读性,在频繁调用的代码上还会影响程序执行效率。

读代码

如何快速读懂别人的代码?只要读得多了,每个人都能找到自己熟悉的方式。我在这里分享一下自己的方法。

  1. 找入口。可执行程序的代码,找 main 函数。库(SDK等),对应文档找到接口调用顺序,然后找到调用流程的第一个接口。
  2. 不要一次性看超过三层的函数跳转。
  3. 做好记录,当前看到哪一层,哪一个函数。
  4. 注意函数的输出和返回值。输入其实在理解框架的过程中并不太重要。
  5. 不要纠结于算法,主要在于条件判断等逻辑。
  6. 第一遍看流程,第二遍针对底层逻辑,第三遍看异常处理。总之肯定是越看越细的。
  7. 配合自己绘制流程图,能更快理解业务流程。

文件结构

这个也是很多初心程序员最容易忽略的一个事情。源代码的文件结构,头文件放哪儿,源文件放哪儿,每个模块分文件夹,哪些模块在哪些模块之下,makefile文件放哪儿,编译脚本放哪儿,工具、测试代码的文件夹,这些都应该在开始写代码前就有一个规划。在框架设计的时候,如果能够顺带规划好文件结构,那么这个框架才是一个好框架。

调试

如果有方便上手的IDE,那么简单业务的断点调试当然是最好的。但是遇上那些偶现BUG,还是乖乖的加日志吧。近几年都是在Linux下做Android底层开发,所以也就只能讲讲这方面的调试方法了。由于代码编译出来后,是跑在Android手机上的,所以要么搭建 gdb 远程调试,要么还是依据日志。要搭建 gdb 远程调试,说难也不难,就是要准备一套调试工具,用于自测和性能调试没问题,但是如果在测试中遇到的偶现问题,就用不上了,所以我还是更喜欢加 log,和读 log。测试时,要将日志缓存改到4M或者更大,一般4M就够了,但是抓log一定要及时,毕竟Android系统无时无刻不在产生日志,遇到一些丧心病狂的程序,遇到异常就开始循环刷log,如果不及时抓log出来,可能你要的就没有了。log抓出来以后,通过 logtag 或者时间定位问题发生时的 log 范围。接着就要看你对代码以及业务的熟悉程度了,通过 pid 和 tid 来锁定多线程程序,通过日志中的字符串定位到代码前后的位置。如果有段错误,最简单,直接用 addr2line 工具可以定位到具体的某一行代码,再分析如何出现的溢出、空指针等问题。

 

就这样吧,欢迎讨论。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值