概述
上一节提到了错误和异常的处理,其主要面对的是健壮性(robustness),而这一节我们会提一些技术,侧重于正确性(correctness)
1.断言(Assertions)
断言:在开发阶段的代码中嵌入,检验某些假设是否成立,若成立,表明程序运行正常,否则表明存在错误。(assert)
如果出现了AssertionError,也就意味着内部的某些假设被违反了。这时就应该找bug了兄弟们!
断言可以增强程序员对代码质量的信心:对代码所做的任何假设都保持正确。
另外说一句断言是代码中对程序员所做的假设的文档化,并不会影响运行时的性能,在实际使用的时候assertion语句都会被忽略。也就是说这就是一种不用你删除的辅助测试用的代码。
常用方法:assert + 布尔表达式 + 错误信息(可有可无)
栗子!
那么我们什么时候用断言呢?(因为断言语句运行的时候会被忽略啊)
当我们设计一个ADT时,内部不变量、表示不变量(checkRep)、控制流不变量、方法前置条件、后置条件都可以用断言。
断言主要用于开发阶段,避免引入和帮助发现bug,实际运行阶段不再是用断言。总之断言的主要目的是为了开发阶段调试程序、尽快避免错误。
另外记住程序之外不受控制的事,不要乱断言!比如文件/用户输入等等。断言只是检查程序内部状态是否符合规约,断言一旦false程序也就停止执行了,其无法保证不出现类外部的错误,外部错误要靠异常机制去处理!
注:java默认是关闭断言的!如果要使用,记得打开啊啊啊啊!(断言非常影响运行时性能)
断言和异常区别:
- 使用异常是为了处理你“预料到可以发生”的不正常情况
- 断言处理的,是程序中@@决不能@@发生的情况
最后唠叨一句:开发阶段可以用断言尽可能的消除bug,在发行的版本中则用异常处理机制处理漏掉的错误。
2. 防御式编程
1. 从非法输入中保护程序:
- 对来自外部的数据仔细检查(如文件、网络数据、用户输入等)
- 对每个函数的输入参数合法性进行仔细检查,并决定如何处理非法输入
2. 设置路障(Barricade)
类的public修饰的方法接收到的外部数据都应被认为是肮脏的(dirty),需要处理干净后在传递到private修饰的方法。——隔离舱
可以采用操作间技术。
“隔离舱”外部的函数应使用异常处理,“隔离舱”内的函数应使用断言。(proxy代理设计模式,思想就是隔离,如果不清楚可以去之前写的看可维护性设计模式)
3. debugging Aids(debug 助手)
大家自己了解下吧,就不赘余了……
4. findBugs工具
一个帮你找内在bug的工具,eclipse上有插件,其他的IDE也有,个人感觉挺好用的,也确实能发现一些小问题,对自己代码不自信的朋友可以去试试玩玩看。
最后
以上就是紧张苗条为你收集整理的第七章软件结构的健壮性——断言与防御式编程1.断言(Assertions)2. 防御式编程的全部内容,希望文章能够帮你解决第七章软件结构的健壮性——断言与防御式编程1.断言(Assertions)2. 防御式编程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复