第七章软件结构的健壮性——断言与防御式编程

上一节提到了错误和异常的处理,其主要面对的是健壮性(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也有,个人感觉挺好用的,也确实能发现一些小问题,对自己代码不自信的朋友可以去试试玩玩看。

猜你喜欢

转载自blog.csdn.net/qq_37549266/article/details/80739980