软件构造第六章复习心得

第六章主要讲解了如何增强程序的健壮性,即使在用户不遵守规约时,即输入不满住前置条件时,我们程序员也要保证程序不崩溃,能够继续运行。
本章主要利用的工具即是,异常和断言,需要掌握的思想是防御式编程。

先来看一下异常:
错误与异常分类如下:
软件构造第六章复习心得
Error:
内部错误:程序员通常无能为力,一旦发生,想办法让程序优雅的结束
用户输入错误(有争议), 设备错误, 物理限制

Exception:
异常:你自己程序导致的问题,可以捕获、可以处理
其中RuntimeException: 类的内部代码错误(不应该捕获,应该避免这些错误)
其他异常:调用类的代码错误(应该捕获,用户输入错误,应该预料到然后进行处理)

我们需要处理的即使其他异常,而需要避免RuntimeException。

异常的具体用法,即使用throws,throw,try,catch,finally等语句即可

再看断言:
断言:在开发阶段的代码中嵌入,检验某些“假设”是否 成立。若成立,表明程序运行正常,否则表明存在错误。
断言即是对代码中程序员所做假设的文档化,也不会影响运行时性能 (在实际使用时,assertion都会被disabled)

断言可用于验证:
内部不变量
表示不变量
控制流不变量:
方法的前置条件
方法的后置条件

当不满足前提条件时,此代码通过抛出断言错误异常来终止程序。调用方的错误的影响被阻止传播。

断言的具体用法,使用assert语句判断十分满足要求即可。

在程序什么时候使用断言和异常,这才是重点!

一般来说,我们需要判断的条件就是前置条件和后置条件,前者需要用户输入符合标准,我们无法相信用户的输入,故使用异常处理,增强程序健壮性;后者需要我们的输出符合标准,那么只要编程正确都是可以达到要求的,故使用断言,使得错误尽早发生,方便程序员修改代码。
当然前置条件也有使用断言判断的情况,即只被程序员自己调用的内部ADT,其前置条件完全可以用断言判断,因为一旦出错,也不是用户的问题,而是调用方的代码错误,程序员完全可以通过修改程序其正确

最后提一下防御式编程:

1.保护程序不受无效输入的影响
对来自外部的数 据源要仔细检查,例如:文件、网络数据、用户输入等
对每个函数的输入 参数合法性要做仔细检查,并决定如何处理非法输入

  1. Barricade 设置路障
    类的public方法 接收到的外部数据都应被认为是dirty的,需要处理干净再传递到 private方法——隔离舱
    “隔离舱”外部的函数应使用异常处理,“隔离舱”内的函数应使用 断言。