测试与正确性论证的效果差异及优缺点

测试实际上就是对程序进行的一种黑箱测试,利用各种各样的测试样例去检验程序是否能够给出正确的结果。其中的单元测试则是将整体的测试拆分成单元来进行,但其仍然躲不开黑箱测试的形式。而正确性论证虽然也是从各个方法入手,但其并不是盲目的对比输入输出是否一样,而是从逻辑上梳理某个方法运行过程中仅可能出现的输入(即前置条件)和针对这些输入仅可能给出的结果(后置条件),从而在确保各个方法实现均正确的情况下将其组合起来成为一个正确的系统。

从效果上来讲测试由于并不能穷举所有的情况,而正确性论证我认为实际上是对各种情况的抽象和归类,从而将无穷变为有穷,其效果也明显优于测试。但正确性论证如果要梳理清楚各种逻辑的关系,其复杂程度要高于测试很多, 因此做起来也相对复杂,测试只需要设计各种测试样例并且自动运行查看结果即可,相比而言较为简单。

OCL调研及与JSF的异同

OCL (Object Constraint Language) 即对象约束语言,是一种指示用户建模系统中的限制方式,它是UML可选的附加内容,可以用来更好的定义对象的行为,并为任何类元指定约束。

OCL是一种精确无二义性的语言,并且是一种规范说明性语言,能够用来约束UML图中的对象。

与JSF的异同:

相同:

均使用了数学的方法(谓词逻辑、集合论)来表达对对象和方法的约束,都采用了自然语言和数学符号折衷的方式

均是一种声明式的语言,即内容中不包含具体实现

都包含前置条件和后置条件的声明,也都包含不变式相关逻辑

不同:

OCL中没有JSF的MODIFIES,但多出了“监护规则”。除此之外OCL非常注重类型的声明,并且细化了各种容器,相比之下JSF均抽象为数组来表达了。

第十四次作业类图、顺序图、状态图

学期总结

四个单元模块知识点之间的关系

第一单元我认为主要是初步认识面向对象思想,掌握类属性方法等元素以及继承、多态等OO的基本思想,顺便学会如何使用Java编写OO程序。第二单元主要面向OO当中的多线程编程,在前一个单元的基础上利用面向对象的方式编写多线程程序。第三单元主要是JSF的引入,以及设计方面的更高级要求(如SOLID、规格)。第四单元则是对于测试和正确性论证的学习,即一个程序写到最后要确保写的是对的。

这四个单元我认为前两个单元主要更侧重编程技术方面,实际上学习多线程编程除了掌握并行的思想外,更重要的其实是怎么在多线程如此混乱的情况下让程序跑出自己想要的结果(想起了OS中的互斥和同步的关系),因而技巧方面更重一些。而后两个单元则更侧重设计以及编程之后验证的部分,前者让我们养成良好的设计思想,我认为规格化的开发思想在程序规模增大的时候才能体现其优势;而后者让我们确保了自己程序写的是对的,能够经过各种各样的检验。

自己的进步

一个学期以来写了多项式、电梯三部曲、IFTTT、出租车四部曲这么多程序,可以说进步应该还是有的。

从设计和代码质量上,一开始代码耦合高,第一次ALS电梯一个方法有200行,到后来程序逐渐变得层次清晰,最后第13次和14次作业对电梯进行了解耦,将原先200行的方法拆分成很多个,每个的行数都较短。原先因为DRY做的不好,重复代码较大导致经常出现改一处忘了改另一处的情况之后也变得很少了。

虽然第一单元的程序几乎没什么bug,但设计思路方面的不清晰导致多线程部分有所翻车,但在对程序的构思逐渐形成合理的模式后,这种情况在出租车有了很大改善。

对工程化开发的理解

我是从大二才开始听说“工程化思想”这一词的,印象最深刻的实际上也是上学期的计组,老师不断的强调“工程话思想”。实际上工程化思想我认为只有当程序需要达到一定规模时才能看出其优势,无论是这学期OO到最后代码量很大的出租车还是上学期完成的计组实验都可以说明这一点,而这两者相比于真正的工程而言更是小巫见大巫。

虽然到现在为止我还没有接触过真正的工程化开发,对于作业也仅仅是利用了一点“思想”而已,因此我的理解还只能停留在空想的阶段。我理解的工程化开发,首先是一种模块化的设计,整个程序是由多个模块构成的,这些模块满足所谓的“高内聚、低耦合”关系,单独来看虽然不能做什么但组合到一起才能完成很复杂的工作。其次作为一个“工程”,必定是一个相对长久的概念,因此需要很多个人“前仆后继”的进行努力。因此在工程化开发中我认为规格很重要。如何让大家编程的点子统一起来,同时让大家编写的一个个”模块“最后能顺利的组合在一起是一个需要重视的问题。规格设计以及接口这一概念在其中充当了非常重要的角色。

对课程的期望和建议

1. 在写作业的时候很多问题我都是从同学的口中得知在”他们班的群里“助教说了什么什么要求,很多时候这些要求没有被通知到,也出现了最后申诉中两人互飙微信群截图的情况。希望可以有一种统一的要求通知机制(比如对于各种问题能及时梳理到issue),能够统一口径并且减轻助教答疑和同学们追问的压力。

2. JSF方面首先我感觉可以借鉴一下OCL语言,例如其中的各种容器。其次课件中经常使用多项式以及数组等等来举例子,在这些方面的确JSF可以清晰的表达规格,但对于出租车等复杂逻辑而言没有很好的参考价值。希望课上能多一些较为复杂的例子。

3. 多线程其实在这个课程中的位置稍显尴尬,的确很重要,但也导致学习曲线较为陡峭。本学期中期OS课上我们也接触了很多并发相关的概念,其中PV操作讲的那些并发经典例子其实对多线程理解有不少帮助。第一次多线程电梯之前那节多线程的课对于多线程电梯来说有点“不够”,导致多线程电梯写的云里雾里。希望在多线程的起步教学这方面可以增加一些内容帮助理解。

OO第四次阶段性总结的更多相关文章

  1. OO第四次博客作业!

    oo第四次博客作业 一.测试与正确性论证比较 测试只是单方面片面的证明对于当前的输入程序是正确的,测试只能证明程序有错误,不能说明程序是对的. 正确性论证是程序达到预期目的的一般性陈述,是通过规范化的 ...

  2. OO第四次课程总结分析

    OO第四次课程总结分析 测试与正确性论证的效果差异及优缺点 测试,即使用测试样例来验证我们的程序是否能完成相应功能的过程.测试数据的产生基于前置条件和后置条件,通过执行测试数据检查方法输出是否满足需求 ...

  3. 【OO学习】OO第四单元作业总结及OO课程总结

    [OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...

  4. OO第四单元(UML)单元总结

    OO第四单元(UML)单元总结 这是OO课程的第四个单元,也是最后一个单元.这个单元只有两次作业,相比前三个单元少一次作业.而且从内容上讲这个单元的作业目的以了解UML为主,所以相对前三个单元比较简单 ...

  5. OO第四单元总结及课程总结

    OO第四单元总结及课程总结 一.前言 紧张刺激的OO“昆仑课程”接近尾声,经过一个学期的学习,我的收获和感触颇多,借此博客作业的机会,对自己OO这门课程做一个总结.本博客主要有以下五个方面,一是第UM ...

  6. OO第四单元博客作业

    OO第四单元博客作业 BUAA_1706_HugeGun 目录 第四单元作业架构设计 四个单元架构设计及OO方法理解 四个单元测试理解与实践演进 课程收获 一点建议 第四单元作业架构设计 ### 第十 ...

  7. OO第四单元总结及学期总结

    目录 OO第四单元总结及学期总结 第四单元三次作业架构设计 第十三次作业 第十四次作业 第十五次作业 四个单元中架构设计及OO方法理解的演进 第一单元 第二单元 第三单元 第四单元 四个单元中测试理解 ...

  8. OO第四单元——基于UML的UML解析器总结&OO课程总结

    OO第四单元--基于UML的UML解析器总结&OO课程总结 前言:一学期愉快(痛苦)的OO课程学习结束了,OO几个单元作业都各有特色,实验也各有特色,仔细回味起来,不再是单纯的敲代码(但自己还 ...

  9. OO第四单元总结暨期末总结

    OO第四单元总结暨期末总结 目录 OO第四单元总结暨期末总结 第四单元三次作业架构与迭代 整体感受 HW1 HW2 HW3 四个单元架构设计与方法演进 Unit1 Unit2 Unit3 Unit4 ...

随机推荐

  1. Android.mk(4) 依赖:目标编程的模式

    https://www.jianshu.com/p/3777a585a8d0 另一种范式 我一直觉得,Makefile确实是C/C++程序员的良配,因为Makefile所使用的两种范式都是C/C++程 ...

  2. git分支的相关问题

    场景:github上准备展示vue打包的项目,做预览的功能,首先创建了分支,gh-page,然后成功将dist文件上传到了gh-page分支中,但是,在Settings的时候,发现 并没有gh-pag ...

  3. [转载]几个有趣的Linux命令

      本文给大家介绍几个有趣的Linux命令. 1. pv 命令 有时候我们在电影屏幕上看到一些字幕一个个匀速显示出来,像有人在边敲键盘,边显示一样.Linux上的pv命令可以实现这种效果. 默认情况下 ...

  4. mysql架构图

    整体架构图 访问控制图

  5. mysql select缓存使用详解

    mysql Query Cache 默认为打开.从某种程度可以提高查询的效果,但是未必是最优的解决方案,如果有的大量的修改和查询时,由于修改造成的cache失效,会给服务器造成很大的开销,可以通过qu ...

  6. nginx作为下载文件服务器

    1.前言 当我们希望分享自己的文件时,有多种方式,局域网可以采用共享,rtx传输,qq传输,发送到邮箱,直接u盘拷贝等等.但最简单的就是开启本地服务器,其他电脑通过网页的方式直接下载,这里介绍使用ng ...

  7. 跟bWAPP学WEB安全(PHP代码)--PHP代码注入

    ---恢复内容开始--- 背景 今天我们换一个方式来分析这个漏洞,从渗透的角度去搞. 渗透过程 测试漏洞 先来看看,观察URL是:http://192.168.195.195/bWAPP/phpi.p ...

  8. VUE单独页面body css设置

    使用created周期用JS来处理BODY的样式 export default { beforeCreate: function () { document.getElementsByTagName( ...

  9. angular开发控制器之间的通信

    一.指令与控制器之间通信,无非是以下几种方法: 基于scope继承的方式 基于event传播的方式 service的方式(单例模式) 二.基于scope继承的方式: 最简单的让控制器之间进行通信的方法 ...

  10. 理解Buffer

    Buffer对象是Node.js用来处理二进制数据的一个接口.JavaScript比较擅长处理Unicode数据,对于处理二进制格式的数据(比如TCP数据流),就不太擅长.Buffer对象就是为了解决 ...