一、ADT的设计

静态检查、动态检查、使用不可变的类型、值、引用等都有助于减少bug。

bug是不可能完全避免的,要将bug限定在一个小范围内,使得程序尽早出问题。例如下图,前置条件要求x>=0,虽然说违反了前置条件方法怎么做都行,但最好还是今早报错。

二、断言

开发阶段在代码中嵌入,检验某些条件是否成立。如果断言失败,会抛出AssertionError。

断言有两种形式,第二种中的message是在断言失败的时候抛出的信息:

在控制流复杂时可以使用断言机制,确保程序永远不会执行到某个地方。但如果程序发布出去运行了,最好不要使用assert而是直接抛出AssertionError,因为assert有可能被取消:

断言主要在开发阶段使用,用来避免引入错误和发现bug,在实际运行阶段,一般不再使用断言,避免降低性能。

不要在断言中写一些程序需要执行的语句,因为断言是可能被取消的,比如说某一步是从列表中删除元素,要确保列表中有这个元素并且成功删除了:

对于程序外部的事情,不要使用断言,例如文件不存在等。断言只用来判断代码是否有问题、是否符合规约,外部的问题需要用异常机制去处理(6-2)。

断言用来确保正确性,异常用来确保健壮性;断言来处理绝不应该发生的情况、错误的情况,异常来处理你预料到可能发生的不正常情况。

对于前置和后置条件:

前置条件:如果参数来自于外部(public),则使用异常处理;如果参数来自内部(private),使用断言去处理,因为这时如果assert出错,说明别的方法的代码有错误。

后置条件:无论public还是private的方法,都可以使用断言来判断后置条件,因为后置条件是程序运行得到的,这时断言出错就说明是程序中的错误。

三、防御式编程

1、处理非法输入

检查,抛出异常或者退出。

2、隔离舱

接收到的外部数据都认为是dirty的,要处理干净。例如将输入的各种是、否、yes、no、Yes转换成true、false等等。

隔离舱外部的函数应该使用异常处理,这一部分是不能确保正确的;隔离舱内部应该用断言,因为隔离舱要确保这些数据的正确性。

此外,防御式编程还会增加代码复杂性,提高运行成本,而且防御式代码本身也可能存在着缺陷。总而言之,我们需要针对实际问题,制定好相应的防御策略。

6-3 断言与防御式编程相关推荐

  1. 7.3Assertions and Defensive Programming断言与防御式编程

    7.3Assertions and Defensive Programming断言与防御式编程 1.回忆:设计ADT 2.Assertions 声称 --What to Assert and What ...

  2. Cocosd-x”设计模式“之五 :防御式编程”模式“

    这一篇将来学习防御式编程模式,其实它并不是一种标准的设计模式,使用它主要是为了提高程序的健壮性,其实这是软件开发中一个我们必须熟悉的模式,因为在程序代码中,很多地方往往存在一定的不确定性,如果我们对于 ...

  3. 编程范式:函数式编程防御式编程响应式编程契约式编程流式编程

    不长的编码生涯,看到无数概念和词汇:面向对象编程.过程式编程.指令式编程.函数式编程.防御式编程.流式编程.响应式编程.契约式编程.进攻式编程.声明式编程--有种生无可恋的感觉. 本文试图加以汇总和整 ...

  4. Defensive Programming 防御式编程(Defensive Programming)

    Defensive Programming 防御式编程(Defensive Programming)是提高软件质量技术的有益辅助手段 怎么理解呢?防御式编程思想的理解可以参考防御式驾驶: 在防御式驾驶 ...

  5. 华山论剑之契约式编程与防御式编程

    背景 事情的来由还要从几十几亿年前的一次星球大爆炸说起,sorry,背错台词了,是从几天前讨论接口返回数据和几个月前讨论课件本地数据结构说起,简单的说,就是碰到约定好的内容出现异常,是我们在程序中内部 ...

  6. 契约式编程与防御式编程

    背景 事情的来由还要从几十几亿年前的一次星球大爆炸说起,sorry,背错台词了,是从几天前讨论接口返回数据和几个月前讨论课件本地数据结构说起,简单的说,就是碰到约定好的内容出现异常,是我们在程序中内部 ...

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

    目录 前言 8.1 保护程序免遭非法输入数据的破坏 8.1.1 三种方式处理"垃圾进" 8.2.2 思考:程序输出时也应该增加防御 8.2.3 保留"证据" 8 ...

  8. 读书笔记:《代码大全第2版》 05.创建高质量的代码之防御式编程

    文章目录 防御式编程 1.保护程序免遭非法输入数据的破坏 2.断言 3.错误处理技术 4.异常 5.隔栏(Barricade) 6.线上代码中该保留多少防御式代码 7.总结 防御式编程 防御式编程的主 ...

  9. C/C++ 踩过的坑和防御式编程

    相信你或多或少地用过或者了解过 C/C++,尽管今天越来越少地人直接使用它,但今天软件世界大多数软件都构筑于它,包括编译器和操作系统.因此掌握一些 C/C++ 技能的重要性不言而喻. 这场 Chat ...

最新文章

  1. IOS,十六进制颜色和RGB颜色的宏定义
  2. 前端各种类型文件的转换
  3. Oracle 基础练习
  4. matlab imfilter函数,Matlab的imfilter函数用法详解
  5. Caffe编译代码的时候报各种未定义未声明
  6. jQuery中调用方法,动态拼接传字符串参数格式
  7. 74款android开机动画,修改Android系统开机动画
  8. 新浪微博html5,新浪微博接入Html5游戏 注重轻量碎片化
  9. 黑马程序员全套Java教程_Java基础教程_API(十四)
  10. iPad横竖屏代码适配
  11. 通俗易懂的傅立叶级数理解
  12. VS2008——调试方法大全
  13. 红颜本无心 奈何为祸水
  14. 图片像素大小怎么调整,批量调整图片像素
  15. 衰老,其实是一种疾病?
  16. 比较经典的点线特征的SLAM算法
  17. 经常失眠怎么办?失眠最快入睡的方法
  18. Python:百分制转五分制
  19. 关于Chrome播放视频黑屏解决办法。
  20. PyTorch 入门与实践(七)循环神经网络(RNN)

热门文章

  1. hello ,test livewriter
  2. 借助FLASH技术美化VBA操作界面
  3. java多线程之生产者消费者问题
  4. 8.0系统机器激活XPOSED框架失败The Xposed framework is not installed
  5. 阿里云服务器linux系统上安装git版本控制系统
  6. VCL已死,RAD已死(插播)
  7. 【Java从0到架构师】日志处理 - SLF4J、Logback、Log4j 2.x
  8. c++指定在某一线程运行_iPhone11升级iOS14运行速度测试:结果有点小惊喜
  9. FineBI与FineReport对比
  10. 报表开发之自定义函数