Defensive Programming
防御式编程的中心思想:子程序应该不因传入错误数据而被破坏,哪怕是由其他子程序产生的错误数据。这样的思想其实也一直渗透在我们实际的编程过程中,比如要全面地考虑非法输入。书中这样概括防御式编程的基本方法:检查所有来源于外部的数据的值;检查子程序所有输入参数的值;决定如何处理错误的输入数据。
我们在检查非法输入的时候常使用if-else语句来判断数据的合法性,再根据不同的条件进行不同的处理。刚开始读断言这一节的时候,我以为这就是一种断言机制。读到后面,才明白错误处理代码与断言还是有本质区别的,错误处理代码用来处理预期会发生的情况,而断言用以处理绝不应该发生的情况。断言通常不放在需要执行的代码中。
在不同的情况下,我们需要使用不同的错误处理技术。我们常用的是返回中立值,比如需要对非负数操作时,非法情况返回-1,处理指针时返回空指针等等。我们也可以跳过某一个错误数据,返回上一个或下一个正确数据。错误处理技术有时更侧重正确性,有时更侧重健壮性。读到这里,我才对正确性和健壮性的含义有了更加清晰的认识,正确性是指永远不返回不正确的结果,而健壮性意味着要不断尝试,哪怕有时作出一些不准确的结果。
The Power of Variable Names
好的名字可以提高代码的可读性,不仅针对自身,在团队项目中,一份代码不可避免需要经过多人的阅读,这时候一个好的变量名就显得尤为重要。我曾经看到过一份代码中变量的命名要么是x,y,z这些,要么就是拼音。这样的变量名真的一下子让人失去了去阅读它的欲望。
一个好记的名字反映的通常都是问题,而不是解决方案。
变量名的长短是否合适其实与它是否正确而又清晰地反映了信息有关。以下是一些常用原则:
1)像一些常用的限定词Total、Sum、Average、Max、Min、Record、String、Pointer等等,常放在变量名的最后。
2)对仗词的使用要有规则。
3)在for循环中我们常喜欢使用i、j、k,对于状态变量我们喜欢用flag1、flag2,对于临时变量我们喜欢使用temp,但最好取一个更有实际意义的名字,可以让自己和别人一眼就能明白它背后的含义。
4)有用的布尔变量名:done、error、found、success、ok等等。5)常量我们不要用值的英文或者const等含糊不清的词语。
命名,不仅是在个人编程中需要养成的良好习惯,在团队协作中,它更应该是一种规则,这也是我们需要制定代码规范的原因。