软构6-3笔记

高分请讲解下,软构6-3笔记
最新回答
碍人

2026-10-25 22:47:02

软构6-3笔记

一、防御式编程

  1. 最好的防御:不要引入bug。

    在编码过程中,应尽可能遵循最佳实践,减少bug的产生。

  2. 限制bug范围:

    如果无法完全避免bug,应尝试将其限制在最小的范围内,如一个方法或小模块内部,避免其扩散。

    尽快让程序在出现错误时失败,这样更容易发现和修复bug。

  3. 检查前置条件:

    检查前置条件是防御式编程的一种典型形式,确保方法在被调用前满足特定的条件。

二、断言(assert)

  1. 定义:

    断言是在开发阶段的代码中嵌入的,用于检验某些“假设”是否成立。

    如果假设成立,程序继续正常运行;如果假设不成立,则抛出AssertionError,表明内部某些假设被违反了。

  2. 使用形式:

    assert condition;:简单的断言形式,仅检查condition是否为true。

    assert condition : message;:在condition为false时,显示message,便于快速定位错误。

  3. 使用范围:

    主要用于内部不变量、RI(代表不变关系)、控制流不变量(如switch-case的default分支)、方法的前置条件和后置条件。

  4. 注意事项:

    断言主要用于开发阶段,避免引入和帮助发现bug。

    在实际运行阶段,应关闭断言,以避免降低性能。

    不要将功能性代码写在condition里面,应先将返回值接收,再对返回值进行断言。

    对于外部问题(如文件丢失),不应使用断言,而应使用异常机制处理。

  5. 开启与关闭:

    Java中,断言默认是关闭的。要开启断言,可以在运行时添加参数-enableassertions或-ea;要关闭断言,可以使用-disableassertions或-da。

    在Eclipse中,可以通过“Run Configurations”对话框中的“VM arguments”来开启或关闭断言。

三、断言与异常的区别

  1. 保证正确性 vs 保证健壮性:

    断言更倾向于保证程序的正确性,用于检查“绝不应该发生”的情况。

    异常更倾向于保证程序的健壮性,用于处理“预料到可以发生”的不正常情况。

  2. 使用场景:

    如果参数来自外部(不受自己控制),应使用异常处理。

    如果参数来自自己所写的其他代码,可以使用断言来帮助发现错误(如后置条件)。

  3. public方法的前置条件:

    按照惯例,public方法上的前置条件是通过抛出特定的、指定的异常的显式检查来进行的。

    可以使用断言来测试非公共方法的前置条件,但通常这样的方法也不写规约。

四、防御式编程的策略

  1. 对外部数据源的检查:

    对来自外部的数据源(如文件、网络数据、用户输入)要仔细检查。

    对每个函数的输入参数合法性要做仔细检查,并决定如何处理非法输入。

  2. 设置路障与隔离舱:

    设置路障(隔栏)是一种容损策略,起到防火墙的作用。

    类的public方法接收到的外部数据都应被认为是dirty的,需要处理干净再传递给private方法,这就是隔离舱的作用。

  3. 操作间技术:

    东西在进入操作间之前要进行一系列处理,确保数据的正确性和安全性。

  4. Proxy设计模式:

    Proxy设计模式是一种隔离方式,可以用于在访问对象之前进行一系列的检查和处理。

五、防御式编程的缺陷

  • 增加了复杂性、运行时间和维护成本。
  • 防御性代码本身也有可能存在缺陷。
  • 因此,需要设计好何处进行防御,制定相应的防御策略。

六、其他工具

  • SpotBugs插件:一个用于静态代码分析的工具,可以帮助发现潜在的bug。在软构课程的lab4中可能会用到,届时再进行详细学习。

以上即为软构6-3的笔记内容,涵盖了防御式编程、断言、异常处理以及防御式编程的策略和缺陷等方面。希望这些内容对你有所帮助。