软件构造-犯错的艺术——健壮性与正确性,异常,防御式编程,debugging与test的思考与总结

健壮性与正确性

健壮性与正确性是不同的——一个倾向于使程序尽可能保持运行,即使遇到错误,一个倾向于使程序尽可能正确,不在意保持运行

异常

异常分为两种——checked exception与unchecked exception

二者的区别在于:

  • checked exception需要显式的处理,说白了就是编程者必须要么用catch抓住它,然后在try中想办法处理掉,要么显式的将这个异常扔到调用的上一级方法,也就是甩锅。总而言之,你永远不能无视checked exception
  • unchecked exception则完全相反,你不捕捉不到它们。因为这些异常一旦产生,就像接到了烫手山芋一样,容不得我们再把他保留著或者throw到上一级方法,这些异常会在其产生的地方直接中止程序,并在控制台打印错误信息。

异常使用的注意事项

  • catch 不能独立于 try 存在。
  • 在 try/catch 后面添加 finally 块并非强制性要求的。
  • try 代码后不能既没 catch 块也没 finally 块。
  • try, catch, finally 块之间不能添加任何代码。

关于异常的LSP原则

  • 如果子类型中override了父类型中的函数,那么子类型中方法抛出的异常不能比父类型抛出的异常类型更广泛
  • 子类型方法可以抛出更具体的异常,也可以不抛出任何异常
  • 如果父类型的方法未抛出异常,那么子类型的方法也不能抛出异常。

那么结合我之前对继承关系的理解,——前置条件不能加强,后置条件不能减弱

如果父类抛出了一个异常,子类抛出一个更具体的异常——?

这我能理解。因为异常也可以看做方法的后置条件,后置条件不能减弱,固异常变得更加具体是完全符合的

如果父类抛出了一个异常,子类可以不抛出异常————???

那么这个就只能够理解为”不抛出任何异常是比抛出某一种异常更加具体的条件。”, 我们可以就这样理解,不跑出异常相当于把异常抛出的条件无限加强。

防御式编程

防御式编程(Avoiding debugging),顾名思义,就是为了减少bug的出现而采用的一系列措施。

第一道防线:不让bug产生

听起来很厉害哈哈哈哈,说得倒轻巧。

其实这第一道防线的意思就是减少bug的一些编程技巧,比如说:

  • 静态检查
  • 动态检查
  • 使用immutable的对象
  • 使用immutable的引用

第二道防线:缩小bug的影响范围

也就是老生常谈的fail fast

使用Assertion是一个重要技巧,但是哪些东西需要使用asserrtion呢,这也有一些套路的

  • 需要assert的

    • 方法参数的条件(前置条件)
    • 方法的返回值的条件(后置条件)
  •   不需要assert的
    • java中的算式等从语法角度不会犯错的(也就是不要试图用assert寻找虚拟机的错误)
    • 外部的错误(比如说用户的输入,文件的存在性等,这个我们管不着)

其它方法

  • Incremental Development
  • Modularity
  • Encapsulation

Debugging

。。。。。。(这里真的没有什么内容啊)

Testing

测试用例很重要,但是也很繁琐。本学期软件构造课的实验中,对我来说的最大的噩梦就是为自己的代码写test用例了。

如何选择测试用例

简而言之,就是通过对方法的输入空间和解空间,根据方法的特性来设定测试用例。

一个简单的例子:

如果要测试BigInteger.multiply(BigInteger b)

如何划分?

  • 正值,负值与0
  • 很小的值,很大的值
  • 特殊值(比如0,-1,1)

然后只要按照这些划分来写测试用例即可。

这是一个很浅显的例子,事实上ppt与mit的reading中都明确给出了关于等价类划分的一套证明,但我认为如果要理解测试用例的书写,只需要理解

  • 错误经常发生在边界条件处
  • 对每一种情况选择一个代表元素

即可。

Documenting test strategy

选择测试用例的划分是编程时经常用到的技巧,但是对于考试题来说,还必须会将测试用例书写下来才行。不要到考场上才慌慌张张想着怎么排版按什么格式

白盒测试与黑盒测试

黑盒测试就是在不知道方法的内部实现的情况下,只根据前置条件和后置条件对方法进行测试,这是最常用的。

而白盒测试则是对方法的内部实现进行测试 例子?

原文地址:https://www.cnblogs.com/giere/p/11074043.html

时间: 2024-10-08 04:31:19

软件构造-犯错的艺术——健壮性与正确性,异常,防御式编程,debugging与test的思考与总结的相关文章

【软件构造】第七章第一节 健壮性和正确性的区别

第七章第一节  健壮性和正确性的区别 第七章:进入软件构造最关键的质量特性 --健壮性和正确性. 本节在1-2节的基础上,重申了Robustness and Correctness的重要性,澄清了二者之 间的差异,并指明了在软件构造中处理二 者的典型技术(防御式编程.异常处理. 测试.调试等) Outline 健壮性(Robustness)和正确性(correctness) 如何测量健壮性和正确性 Notes ## 健壮性(Robustness)和正确性(correctness) [健壮性] 定

软件构造复习——7.1健壮性与正确性

一.健壮性和正确性的简单介绍 1.1Robustness  健壮性 1.1.1 定义:健壮性又称鲁棒性,是指软件对于规范要求以外的输入情况的处理能力.所谓健壮的系统是指对于规范要求以外的输入能够判断出这个输入不符合规范要求,并能有合理的处理方式. 简单来说就是系统在正常输入或不正常外部环境下仍能够表现正常的程度. 1.1.2面向健壮性编程的做法 处理未期望的行为和错误终止 即使终止执行,也要准确/无歧义的向用户展示全面的错误信息 错误信息有助于进行debug 1.1.3面向健壮性编程的原则 总是

软件构造 7-1 健壮性与安全性

健壮性与安全性 什么是健壮性与安全性? 如何衡量健壮性与安全性? 健壮性:系统或组件在存在无效输入或压力环境时一颗正确运行的程度. 健壮性编程关注异常终止和异常活动的处理. 健壮性原则:严于律己(满足specification),宽以待人(接受各种输入) 健壮性编程原则(把用户当做小孩) 1.用户会修改代码,而且自己写的还不对 2.用户不会看specification(所以我们应该在他操作错误时返回明确的错误信息帮助其改正) 3.危险行为,我们不应当将信息暴露给用户,以至于产生漏洞,使用户专注于

软件构造 第一章第二节 软件开发的质量属性

?软件构造 第一章第二节 软件开发的质量属性 1.软件系统质量指标 External quality factors affect users 外部质量因素影响用户 Internal quality factors affect the software itself and its developers 内部质量因素影响软件本身和它的开发者 External quality results from internal quality 外部质量取决于内部质量 外部属性: 正确性:按照预先定义的"

哈工大 软件构造课程 复习考点总结(第六、七章)

可维护性的常见度量指标 Cyclomatic complexity 圈复杂度 Lines of Code LoC 代码行数 Maintainability Index (MI) 可维护性指数 Depth of Inheritance 继承的层次数 Class Coupling 类之间的耦合度 Unit test coverage 测试代码覆盖率 Coupling 耦合度 and Cohesion 聚合度 Coupling 耦合度: 模块之间的依赖性. Conhesion 聚合度 功能专一性.高聚

【软件构造】第七章第三节 断言和防御性编程

第七章第三节 断言和防御性编程 本节:第2种技术--断言.防御式编程 Outline 断言 什么是断言 断言的应用场景 防御式编程(不是考点,不加叙述) Notes: ## 断言 [什么是断言] 作用:允许程序在运行时检查自己,测试有关程序逻辑的假设,如前置条件.后置条件.内部不变量.表示不变量.控制流不变量等 目的: 为了在开发阶段调试程序.尽快避免错误 使用阶段: 断言主要用于开发阶段,避免引入和帮助发现bug 实际运行阶段, 不再使用断言 软件发布阶段,禁用断言避免影响性能. [应用场景]

软件构造 第七章第四节 调试

第七章第四节 调试 [bug的常见类型] 数学bug:例如 零除法,算术溢出 逻辑bug:例如 无线循环和无限递归 源头bug:例如 使用了为被定义的变量.资源泄漏,其中有限的系统资源如内存或文件句柄通过重复分配耗尽而不释放.缓冲区溢出,其中程序试图将数据存储在分配存储的末尾. 团队工程bug:例如 评论过时或者评论错误.文件与实际产品的区别 ## 调试的基本过程 Debug是测试的后续步骤:测试发现问题,debug消除问题:当防御式编程和测试都无法挡住bug时,我们就必须进行debug了: D

HIT软件构造课程3.1总结(data type and type checking)

软件构造的理论基础-ADT 软件构造的技术基础-OOP 1.编程语言中的数据类型 类型和变量  类型是变量的集合,在这些变量集合上我们可以定义运算(类似于代数系统?).栗子:boolean,int,double,String 变量是被命名的位置,这里存储着着一个特定的值.类似于萝卜和坑的关系. java中的类型 java的基本数据类型: int,long,char java的对象数据类型 String,BigInteger java中基本数据类型的字母都是小写的,而对象数据类型词节首字母大写 基

软件构造正确性和健壮性

面向健壮性的编程有以下几点要求或优点:处理未期望的行为和错误终止即使终止执行,也要准确/无歧义的向用户展示全面的错误信息错误信息有助于进行debug 健壮性原则:总是假定用户为恶意用户,假定自己的代码会失败把用户想象成一个小孩,可能输出任何东西注意,因为用户很小孩,最好要返回给用户错误提示信息,而且要详细准确无歧义!对自己的代码要保守,对用户的行为要开放. 关于这一点,体现在代码方面,就需要做出策略,是写多个分支进行检查或者是检测错误报错. 原文地址:https://www.cnblogs.co