《代码大全2》第8章:防御式编程

防御式编程的主要思想是子程序应该不因为非法的输入值被破坏,就好比开车时的防御式驾驶:你无法预估其他司机将会做什么,但你要采取措施保证当他人做出危险动作时自己不受伤害。防御式编程的核心其实是承认程序始终存在问题,需要不断地被完善。

保护应用程序不受外部错误输入破坏的主要思路有三种:检查所有来源于外部的程序的值,检查子程序所有输入参数的值、决定如何处理错误的输入数据。然而防御式编码的最佳方式是一开始就不要在源码中引入错误,使用迭代式设计、写代码前先写测试用例等等,都有助于防止引入错误。

以下根据书中内容简要介绍防御式编程应用到的主要方法:

1.断言(assertion): 目前大部分的面向对象编程语言都支持断言操作。断言对于大型的复杂程序和或对可靠性要求极高的程序极其有用,可以帮助程序员快速地排查出程序里不匹配的接口和错误等。一般来说,应该用断言来注解并验证前条件和后条件,避免把需要执行的代码放到断言中;用错误处理代码来处理预期会出现的的状况,用断言来处理绝不应该发生的状况;对于复杂、生命周期很长、需要高健壮性的程序,应该先使用断言再处理错误。

2.错误处理技术:针对不同的情景,作者介绍了以下错误处理技术:返回中立值(没有危害的数值)、换用下一个正确数据、返回与前次相同的数据、换用最接近的合法值、把警告信息记录到日志文件中、返回一个错误码、调用错误处理子程序或对象、显示出错信息、关闭程序等等。需要注意的是,以上这些错误都不是通用额。开发人员需要根据实际需求,具体来说健壮性和正确性哪个更迫切以及高层次设计的决策等等,来挑选合适额错误处理操作。

3.异常:作者提醒读者不可以过度依赖异常,由于如何安全使用异常的传统和经验相对较少,所以作者建议程序员多考虑一下异常的替换方案。异常和断言类似,都是用来处理真正例外的情况,不能用异常来推卸可以在处理局部错误的责任。另外,使用异常时应注意:避免在构造函数中抛出异常、在适当的抽象层次抛出异常、把项目中对异常的使用标准化等等。

4.隔栏barricade):隔栏是一种容损策略,和防火墙的原理类似,即把某些接口选为“安全区域”的边界,对于穿越安全区域边界的数据进行合法性校验,但数据非法时快速反应。隔栏的思想使得错误处理和断言有了更为清晰的区分,隔栏外部区域应该被假定为不安全的,故使用错误处理技术;隔栏内部应该使用断言,因为既然进入隔栏内部的数据已经是被清理过的,那错误肯定是存在于程序中若不是由外部输入所导致的。

5.辅助调试代码:开发人员不必把产品版的限制强加在开发版上,开发期间在速度和资源上做出一点牺牲,添加辅助调试代码,实际上是大有裨益的;甚至可以使用进攻式编程,在开发阶段把可能出现的错误都挖掘出来并进行处理。当然,程序开发人员还需要在移除辅助调试代码上做好计划,用版本控制工具来管理开发版和产品版,还可以尝试编写自己的预处理器、使用调试存根等等。

当然,物极必反,过度的防御式编程也会引起问题,包括增加程序的复杂度、在添加防御代码时引入新的错误,因此,开发人员应该做好对防御的需求有清晰的认识,因地制宜地调整进行防御式编程的优先级。在产品代码中保留多少防御代码,也是需要认真思考的。

《代码大全2》读书笔记 Week4的更多相关文章

  1. 《程序员思维修炼》读书笔记——week4

    <程序员思维修炼>读书笔记——week4 PB16061441 陈昶金 这周读的是Andy Hunt的著作<程序员思维修炼>,这本书对于我这种刚刚入门的新手很友好,大多是讲一些 ...

  2. 【前端阅读】——《程序员思维修炼》摘记&读后感&思维导图

    前言:这是一本介绍如何用脑的书,并从思维的角度(以程序员为例),介绍如何从新手成为专家.作者带领着读者(我)共同经历一次有关认知科学.神经学.学习和行为理论的旅程,探索人类大脑令人 惊奇的工作的机制, ...

  3. [Java程序员面试宝典]读书笔记

    ClassLoader具备层次关系,且不止一种.不同的类装载器分布创建的同一个类的字节码数据属于完全不同的对象,没有任何关联 通过Class.forName(String className),能够动 ...

  4. Java入门(1) —— 变量、运算符、分支结构和程序员思维的理解

    1.计算机语言的发展史: 机器语言:机器语言是指一台计算机全部的指令集合. 汇编语言:为了减轻使用机器语言编程的痛苦,人们进行了一种有益的改进:用一些简洁的英文字母.符号串来替代一个特定的指令的二进制 ...

  5. 《高效能程序员的修炼》读后感 By Yong Zhang

    想不到我工作中经常GOOGLE搜寻技术问题的stack overflow网站的创办人竟然是<高效能程序员的修炼>一书的作者!看了一遍全书,果然名不虚传. 本书更多的从人文角度而非技术角度去 ...

  6. 读书笔记 Week4 2018-3-29

    读书笔记 Week 4 <我是一只IT小小鸟> 首先不得不说,这周的个人编程任务占据了我绝大多数的精力.,虽然在接触到题目的第一时间就有了大致的思路,但当我真正上手开始编程的时候,却几乎每 ...

  7. 一位程序员如何修炼成CTO

    几乎整个互联网行业都缺CTO,特别是一些草根背景的创业者,这个问题更加显著.从我自己的感受,身边各种朋友委托我找CTO的需求,嗯,算下来超过两位数了,光最近一个月就有3个,而且这三家都是刚拿了A轮的. ...

  8. 促使团队紧密协作[高效能程序员的修炼-N1]

    在Jeff看来,团队里最重要的事情,是人与人之间地协作和沟通!所有的问题,其实都是人的问题.“不管什么问题,那总是人的问题”-温伯格.即,让你和团队陷入困境的最快的方法,就是认为技术是决定性的因素,而 ...

  9. 软工读书笔记 week4 ——《黑客与画家》下

    因为时间有限,只对书中后半部分几个篇章进行了阅读.        一.另一条路       作者以他自己为例,在那个没人知道什么叫“软件运行在服务器时”的时代,他和朋友选择创业时,没有选择写传统的桌面 ...

随机推荐

  1. kafka安装指导

    本篇博客主要讲解在虚拟机安装之后,从如下五个方面进行讲解kafka的安装过程. (1)如何配置虚拟机网络 (2)如何安装JDK (3)如何安装zookeeper (4)如何安装kafka (5)kaf ...

  2. docker x509: certificate has expired or is not yet valid

    系统环境:centos 6.5 内核版本:2.6.32-696.1.1.el6.x86_64 程序版本:Docker version 1.7.1, build 786b29d/1.7.1 问题:下载镜 ...

  3. Passive Event Listeners——让页面滑动更加流畅的新特性

    Passive Event Listeners - 被动事件监听器 在写webapp页面的时候,Chrome 提醒 code 1 <code>[Violation] Added non-p ...

  4. Python之小测试:用正则表达式写一个小爬虫用于保存贴吧里的所有图片

    很简单的两步: 1.获取网页源代码 2.利用正则表达式提取出图片地址 3.下载 #!/usr/bin/python #coding=utf8 import re # 正则表达式 import urll ...

  5. bzoj4544 椭圆上的整点

    我会所有推理..... Q1:真的这么暴力的统计答案? Q2:蜜汁统计答案.... Q3:为什么不考虑3在不同的位置的情况

  6. 2018-10-19-C#-GUID-ToString-

    title author date CreateTime categories C# GUID ToString lindexi 2018-10-19 9:4:44 +0800 2018-4-1 10 ...

  7. termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfsetospeed - 获取和设置终端属性,行控制,获取和设置波特率

    SYNOPSIS 总览 #include <termios.h> #include <unistd.h> int tcgetattr(int fd, struct termio ...

  8. Docker部署web环境之Lanmt

    2. 案例二 整套项目多容器分离通过docker-compose部署lanmt环境 详细的安装准备环境,省略,配置以及部署参考案例一即可 即可实现批量创建web,也可以实现多web共用一个php或my ...

  9. Codeforces 348D DP + LGV定理

    题意及思路:https://www.cnblogs.com/chaoswr/p/9460378.html 代码: #include <bits/stdc++.h> #define LL l ...

  10. 图像元数据编辑软件:MetaImage使用流程讲解

    MetaImage是唯一的macOS工具,允许在处理所有类型的标签格式时编辑,读取和写入元数据.在时尚的界面中导航,您可以更改图像元数据的所有内容,并对数百张相似的照片进行相同的编辑. https:/ ...