《编程匠艺》读书笔记之一
第一章 善于防守
- 使程序正确和使程序能用的区别:1. 编写在大多数情况下都能用的代码是很容易的,它对常规的输入集会产生常规的输出集;2. 正确的代码绝对不会崩溃,对于所有的输入集,它的输出都将是正确的;3. 并非所有正确的代码都是优秀的代码,因为有些正确的代码的逻辑可能很难理解,难以维护。
- 在编写代码的时候,你会很容易产生很多设想,例如程序应该如何运行、如何调用、如何输入等。我们经常有以下3种常见的设想:1. 这个函数“绝对不会”被那样调用,传递给我的参数总是有效的;2. 这段代码肯定会“一直”正常运行,它绝对不会产生错误;3. 如果我把这个变量标记为“仅限内部使用”,就没有人尝试访问这个变量。
- 不要做任何设想,没有记录下来的设想会不断的制造缺陷,特别是随着代码的增长。凡是可能出错的事,准会出错。
- 防御性编程是一种细致、拘谨的编程方法。为了开发可靠的软件,我们要设计系统的每个组件,以使其尽可能的“保护”自己,我们通过明确的在代码中对设想进行检查,击碎了未记录下来的设想。这是一种努力,防止我们的代码被以一种错误的方式调用。
- 防御性编程不是检查错误,不是测试,也不是调试。
- 对于防御性编程的反对观点:1. 降低了代码开发的效率;2. 混淆了代码的职责,代码在执行必要的业务逻辑外,也要对各种设想进行判断。
- 对于防御性编程的支持观点:1. 节省大量的调试时间;2. 编写可以正确运行、只是速度有些慢的代码,要好于编写那些大多数时间都正常运行、但是有时会崩溃的代码;3. 我们这里所考虑的大部分防御性措施,并不具有任何明显的性能开销;4. 防御性编程避免了大量的安全问题。
我们可以使用一些编程技巧来进行防御性编程 - 使用好的编码风格和合理的设计。这样可以防范大多数的编码错误。最好地计算机程序的文本是结构清晰的。
- 不要仓促的编写代码。要三思而后行,一方面,要对将要写的代码出现的各种可能情况进行分析;另一方面,一定要在完成与一个代码段相关的所有任务后,再进入下一个环节。
- 不要相信任何人。不要设想所有的一切都运行良好,或者所有的代码都能正确的运行,用怀疑的眼光审视所有的输入和输出,知道你能证明它们是正确的。
- 编码的目标是清晰,而不是简洁。请保持代码简单。不能维护或者难以维护的代码是不安全的。
- 不要让任何人做他们不应该做的修补工作。内部的事情就应该留在内部。在开始编码时就应用防御性策略,要比改进代码时才使用容易的多。
- 编译时打开所有警告开关。编译器的警告可以捕捉到很多愚蠢的编码错误。在任何情况下都应该打开你的编辑器的警告功能,警告的出现总是有原因的。
- 使用静态分析工具。
- 使用安全的数据结构。
- 检查所有的返回值。不要让错误悄无声息的侵入你的程序;忍受错误会导致不可预知的行为。不论何时,都要在适当的级别上捕获和处理相应的一场。
- 审慎的处理内存和其他宝贵的资源。对于在执行期间获取的任何资源,必须彻底释放。不要因为觉得操作系统会在你的程序退出时清除程序,就不注意关闭文件或者释放内存。
- 在声明位置初始化所有变量。即应该将变量的声明和初始化放在一起,这样可以放置对未初始化的变量进行操作。
- 尽可能推迟一些声明变量。可以使变量的声明位置和使用它的位置尽量接近,从而防止它干扰代码的其他部分。不要在多个地方重用一个临时变量,变量重用会使以后对代码重新完善的工作变得一场复杂。
- 使用标准语言工具。
- 使用好的诊断信息日志工具。
- 审慎的进行强制转换。强制转换不仅可能会造成转换一场,还可能造成变量的精度发生变化。
- 我们可以使用约束来对我们的设想进行验证。约束分为:1. 前置条件; 2. 后置条件;3. 不变条件;4. 断言。
- 优秀的程序员:1. 关心他们的代码是否健壮;2. 确保每个设想都显式的体现了防御性代码中;3. 希望代码对无用信息的输入有正确的行为;4. 在编程的时候认真思考他们所编写的代码;5. 编写可以保护自己不受其他人的愚蠢伤害的代码。
- 糟糕的程序员:1. 不愿意去考虑他们的代码出错的情况;2。 为集成才发布可能出错的代码,并希望别人会找到错误;3. 将关于如何使用他们代码的信息仅仅攥在手里,并随时都可能将其丢弃;4. 很少思考他们正在编写的代码,从而产色很难干不可预知和不可靠的代码。
第二章 精心布局
- 编码的风格曾经是、现在是、将来也将继续是程序员之间信仰之争的主题之一。
- 编程样式极大的影响了代码的可读性,没有人愿意使用读不懂的代码。
- 我们的代码一般有3类读者:1. 我们自己,我们不仅需要能够读懂刚刚写下的代码,也需要在多年之后仍然能够明白它的意思;2. 编译器,关注语法,不关注样式;3. 其他人,这类人最重要,也最容易被忽视。
- 什么是好的样式?1. 一致;2. 传统,采取一种业内流行的样式;3. 简洁。
- 括号的样式风格:1. K&R风格;2. 悬挂式风格;3. 缩进式风格;4. 其他风格。
- 好的样式风格不止一种,各种风格的品质和适用性取决于使用的环境和文化背景。选择一种好的编码风格,并坚持使用它。
- 多种风格有助于我们写出更好的代码。
- 对于一个组织来讲,是需要一种内部的编码风格的。这样可以提高代码的质量,并使软件开发更加安全。所有人共同分享同一种风格所带来的好处,远远超出了为了同意而付出的代价,即使不赞同这个标准,你也应该遵守它。
- 当一个组织内么有一个明确的编码风格时,我们需要制定一份。这是一项需要谨慎考虑的任务。应该恰当而坚决的开展。
- 一个良好的个人风格对于整个团队的程序员不一定是最好的。你要创建的标准不应当只适合你自己的审美习惯,它应该使团队的代码合为一体,并避免常见的问题。
创建编码风格时可以采取的策略: - 标准为谁而立?圈定使用范围。
- 赢得广泛参与。有参与才会更乐意遵守。
- 做出成果。最终应该有一份可以理解的文档。
- 使最佳做法标准化。
- 突出重点。
- 避免热点。把罕见且麻烦的情况留给个人决定,前提是不会造成太大的分歧。
- 逐步完善。
- 为推广做计划。
- 创建编码风格时,需要注意掌握分寸,不是规定的越细越好。
- 我们有理由认为:版面漂亮的代码是经过精心设计的代码,格式混乱的代码一定没有好好下功夫。
- 优秀的程序员:1. 避免无意义的争论,对别人的意见非常敏感;2. 谦虚克己,不认为自己永远是对的;3. 懂得版面是如何影响可读性的,并努力写出可能清晰的代码;4. 采用内部样式,即使内部样式与他们的个人偏好相矛盾。
- 糟糕的程序员:1. 闭目塞听,固执己见,认为”我的观点才是正确的“;2. 和每个人争论最琐屑的小事,把这些当成成证明自己优势的机会; 3. 没有始终如一的个人编码风格;4. 对别人代码的风格指手画脚。
作者:李胜攀
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。