软件构造-犯错的艺术——健壮性与正确性,异常,防御式编程,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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/483107.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

地球系统科学简史:理解地球复杂性的多学科探索历程

来源:集智俱乐部作者:Will Steffen, Katherine Richardson等人 译者:晏丽 审校:张澳 编辑:邓一雪 导语我们的地球是一个有生命的有机体,不仅有大气、陆地、海洋之间的物理化学过程,生物也会对环…

数值微分

像这样的由全部变量的偏导数汇总而成的向量称为梯度(gradient),梯度可以像下面这样来实现,这里使用的是用数值微分求梯度的方法。 def numerical_gradient(f, x):h 1e-4 # 0.0001grad np.zeros_like(x) # 生成和x形状相同的数组for idx in …

数据结构与算法——哈希表与字符串

文章目录1.预备知识1.1 最简单的哈希——统计字符个数1.2 哈希表排序整数1.3 哈希映射的问题2.最长回文串2.1 题目描述2.2 C代码实现3.单词规律3.1 题目描述3.2 算法思路3.3 C代码实现4.字母异位词分组4.1 题目描述4.2 算法思路4.3 C代码实现5.无重复字符的最长子串5.1 题目描述…

Science重磅:DeepMind再获突破,用AI开启理解电子相互作用之路

来源:学术头条作者:青苹果编辑:hs排版:李雪薇当电子问题遇到了神经网络,会碰撞出什么样的火花呢?DeepMind 的最新研究向我们揭晓了答案。刊登在最新一期 Science 论文 Pushing the frontiers of density fu…

腾讯-地图:腾讯位置服务

ylbtech-腾讯-地图:腾讯位置服务1.返回顶部 2.返回顶部3.返回顶部4.返回顶部5.返回顶部 1、https://lbs.qq.com/product/miniapp/customized/2、6.返回顶部作者:ylbtech出处:http://ylbtech.cnblogs.com/本文版权归作者和博客园共有&#xff…

2022年六大值得关注的边缘计算趋势

来源: 边缘计算社区关于边缘计算的许多方面并不新鲜,但它仍在快速发展。例如,“边缘计算”包括已经存在了几十年的分布式零售商店分支系统。这个术语也包含了当地工厂和电信提供商计算系统的各种形式,尽管这是一种比历史规范更紧密…

RateLimiter的 SmoothBursty(非warmup预热)及SmoothWarmingUp(预热,冷启动)

SmoothBursty 主要思想 记录 1秒内的微秒数/permitsPerSencond 时间间隔interval,每一个interval可获得一个令牌 根据允许使用多少秒内的令牌参数,计算出maxPermits setRate时初始化下次interval时间,及storedPermits acquire时,计算当前now…

未来已来:全球XR产业洞察

来源:德勤Deloitte编辑:蒲蒲近日,德勤中国科技、传媒和电信行业推出元宇宙系列报告《元宇宙系列白皮书—未来已来:全球XR产业洞察》,聚焦XR产业发展趋势。报告指出,多元融合是元宇宙的演变趋势。在元宇宙发…

谷歌、哈佛联手绘出「百万分之一」人脑神经3D连接图!天量数据竟可塞满14亿块1T硬盘...

来源:神经科技编辑:Yezi审阅:mingzlee7前不久,谷歌和哈佛大学联手发布人脑神经3D连接图,涵盖人脑一百万分之一的信息,但数据已经塞满了1400块1T硬盘!现在,这个研究团队表示&#xff…

python replace()

转载于:https://www.cnblogs.com/JackFang-X/p/11090449.html

解决表单提交的数据丢失问题

解决表单提交的数据丢失问题: 一、问题描述: 当我们在给前台页面设置修改功能的时候,因为有些信息是不允许进行修改的,所以在修改表单中没有相应的修改输入框,但是在修改表单的数据提交的时候,那些不允许修…

科学家即将揭示人类大脑神经网络结构的奥秘

来源:今日头条人类即将迎来了解大脑神经网络结构神秘世界的曙光!哈佛大学神经科学家和谷歌工程师,发布了第一张人类大脑部分的神经网络连接图,大约针头大小的人类大脑组织用重金属染色,切成 5,000,并在电子…

温故而知新,6位顶级CV科学家聚首:计算机视觉中的深度学习方法vs传统方法...

来源:AI科技评论作者:Mr Bear编辑:青暮2021 年 10 月 13 日,来自麻省理工学院、加州大学伯克利分校、伊利诺伊大学香槟分校、华盛顿大学、帝国理工学院的六名顶级人工智能科学家、计算机视觉科学家在 ICCV 2021 大会期间进行了题为…

卷积神经网络(CNN)数学原理解析

来源:图灵人工智能作者:Piotr Skalski编辑:python数据科学原标题:Gentle Dive into Math Behind Convolutional Neural Networks翻 译: 通夜(中山大学)、had_in(电子科技大学&#…

大脑研究正在挑战超级计算,“人脑计划”或需提前部署百亿亿级超级计算机...

来源:DeepTech深科技人脑的复杂性正推动着超级计算释放更多的潜力。据了解,人脑包含大约 860 亿个神经元,可形成数万亿个接触点。如果以细胞分辨率对整个大脑进行成像,甚至会产生数 PB 范围内的数据,这样的的计算量令人…

02 算术、字符串与变量(1)

本章内容 1、交互式命令shell 2、整数算术 3、浮点算术 4、其他数学函数 5、字符串 6、字符串拼接 7、获取帮助 8、类型转换 9、变量和值 10、赋值语句 11、变量如何引用值 12、多重赋值 -------------------------------------- 在学习Python前,我们需要了解数据类…

【数据结构基础】-线性表的顺序实现(数组实现)基本操作

2019.10.10 【数据结构-线性表的顺序结构】 基本操作:初始化,判断是否空表,清空表,获取表中的第i个元素,查找元素,插入元素,删除元素,获取表的元素个数。 抽象数据类型&#xff1a…

机器学习驱动技术是生物学进步的下一个突破

来源:ScienceAI作者:Immunai 联合创始人兼 CEO,Luis Voloch编译:绿萝数字生物学与 90 年代的互联网处于同一发展阶段(早期、激动人心和变革性)。当时,IP 地址的概念还很新,「精通技术…

实现调用API接口

API是一组封装好的函数,通过API,你可以为应用快速扩展功能,而无需理解它们是如何实现的,从而提升开发效率。通常,API服务商会提供API文档,那么如何根据文档来使用API呢? PS:该文章内容来自于阿里…

量子力学与机器学习相结合,预测高温下的化学反应

来源:ScienceAI编辑:凯霞在高温下从氧化物中提取金属不仅对于钢铁等金属的生产至关重要,而且对回收利用也必不可少。但当前的提取过程是碳密集型的,会排放大量温室气体。研究人员一直在探索开发「更绿色」的工艺方法。第一性原理理…