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

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

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

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. RAC迁移至单机考虑几大因素

    数据库迁移几大因素 1. 停机时间 2. 源端,目标端 操作系统平台,版本,对应的数据库版本 3. 数据量 4. 外界因素,存储空间,网络等

  2. Promise {<pending>

    场景:在create-react-app whatwg-fetch的项目中,想获取请求返回的数据, componentWillMount() { console.log(this.props) con ...

  3. 题目1458:汉诺塔III(不一样的汉诺塔递归算法)

    题目链接:http://ac.jobdu.com/problem.php?pid=1458 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

  4. Sublime PlantUML环境配置

    参考[http://www.jianshu.com/p/e92a52770832]在安装中遇到不少问题,总结一次成功的步骤如下 一.安装步骤: 1)准备java  环境 jdk1.7 2)安装Subl ...

  5. 将Linux系统的字体全改成中文

    # 修改字符集,否则可能报 input/output error的问题,因为日志里打印了中文 $ localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 $ export ...

  6. Egret容器的鼠标默认事件

    容器的鼠标默认事件   touchEnabled touchChildren touchThrough DisplayObject false \ \ DisplayObjectContainer f ...

  7. AD添加LOGO的方法

    1 将logo图片转换成单色的BMP 图像.简单的方法是使用Windows自带的画图程序,在将图片另存为时, 在文件类型下拉列表中选择单色.bmp即可.我们以Altium为例,如图所示将蓝色logo另 ...

  8. 静态时序分析基础STA

    静态时序分析SAT   1.   背景 静态时序分析的前提就是设计者先提出要求,然后时序分析工具才会根据特定的时序模型进行分析,给出正确是时序报告. 进行静态时序分析,主要目的就是为了提高系统工作主频 ...

  9. 【CF662A】Gambling Nim 线性基

    [CF662A]Gambling Nim 题意:n长卡牌,第i张卡牌正面的数字是$a_i$,反面的数字是$b_i$,每张卡牌等概率为正面朝上或反面朝上.现在Alice和Bob要用每张卡牌朝上的数字玩N ...

  10. vim ctrl+v垂直选取产生 e353错误

    原因是/etc/vim/vimrc中map ctrl+v为其他作用了 解决方法: 删除掉map<C-V>...项即可