测试与正确性论证的效果差异

测试,或者说用断言进行黑箱测试,用大量的数据进行“覆盖性测试”,目的是当分支覆盖率达到100%也就是理论上来说所有可能的输入都已经测试过了,而输出结果均是正确的,那么我们理论上可以说这部分程序是没有问题的。这种测试方法的好处就是,问题暴露得十分明显,某一组数据错了,就知道问题发生的情况是什么了,复现性也很强。其实平时我们自己debug的时候用的就是这种方法,只不过那时我们测试量比较小,并没有做到全覆盖,而是向着我们感觉可能会出错的方向进行测试,导致测试以后仍然感到不安,害怕仍然存在着某些bug自己没有发现。现在有了全覆盖的测试,这种方法比较好实现,效率也比较高,只是不可以完全验证程序逻辑的正确性。

正确性验证,就是通过分析需求写出正确的规格,然后论证程序在规格的任意划分下,都符合规格所要求的过程。这种验证方法偏向于验证程序的思路、逻辑是否正确。严格按照这种方法执行,可以验证程序是否有按照我们所希望的那样执行,但由于是理论上的分析,所以需要严谨细致的推论,因此可能会比较耗费时间。

无论是这两种哪一种测试方法,都让我学会了如何准确性较高的测试自己的程序(发现更多的bug),都使我受益匪浅。


OCL语言和JSF规格的对比

对象约束语言,即OCL语言是一种形式化语言,它主要用于表示UML模型中施加于模型上的约束。OCL具有如下特点:

1、OCL是一种精确的,无二义性的语言。

2、OCL是一种规范说明性语言,所有有关实现的问题都不能用OCL来表达。

3、OCL是一种纯表达式语言,它是具有没有任何副作用的申明性语言。

4、OCL是一种类型化语言,即OCL中的每一个表达式都是具有类的。

5、OCL不是一种程序设计语言,不能用OCL编写程序逻辑和控制流程。

它和JSF规格的相同点在于它们都是形式化的约束语言,在程序中唔二义性,结构上也具有相似性,OCL主要包括的不变量,前置条件,后置条件,监护规则分别对应JSF对应着repOK(),REQUIRES,EFFECTS和MODIFIES。

他们的不同点在于作用的时间不同,OCL主要是在编写程序前,理论建模时刻对每个类进行明确的约束,而JSF主要在功能实现前进行约束以确保程序逻辑实现正确。


第十四次作业模型图

1. 类图

2. UML时序图

3. 状态图


课程总结

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

第一章的多项式计算和傻瓜电梯,主要是为了使我们从面向过程编程转变到面向对象编程,在写代码的过程中体会面向对象的思想。

第二章主要是线程安全的学习,引入线程的概念,运用多线程来提高工作效率,同时也就引入了线程安全的问题,如何保证进程互斥和资源共享是我们本章需要思考的问题。

第三章主要是抽象和规格化设计,通过写规格来增强代码的可读性、可移植性,让我们写的代码可以为他人所用。

第四章是测试与论证,随着程序规模的逐渐增大,人工测试难以保证程序的正确性(其实哪怕程序规模小人工测试也很难完全覆盖),所以无论是自动化测试还是正确性论证,都是为了通过理论层面论证程序的正确性。

2. 梳理与进步

程序肯定是写得比以前好很多,无论是在程序结构还是可读性上,从一开始的数量少但功能贼多的类(GOD类)到一点点每个类的功能相对均衡,各个类可扩展的空间也多了不少。可读性上,命名风格向大佬们学习基本也能做到精简且明晰,同时也按照课程要求写了详细的JSF(虽然有些还是很长很长很长很长),可读性改观了许多。

测试方面,从一开始的只能靠乱想例子,寝室共享一波数据,到现在的覆盖性测试,还有正确性论证,使得测试的过程更加有条理,结果更加可信。

3. 对工程化开发的理解

emmmm工程化开发就是很多很多很多人一起写代码,所以自己写的代码就会被自己的队友所使用,因此本着“以人为本”的思想,我们就要让自己的程序可以很方便的被别人使用,就像一个很标准的、契合的齿轮,可以帮助整台机器运转,与其它部件共同合作完成各项功能,而不是因为自己的不契合而导致整个团队延缓开发速度甚至项目失败。

4.  期望与建议

首先感谢老师与助教这一学期以来的辛勤付出,使我在编程能力和思想上都有了很大的提升。期望的话,希望可以明确一下教学目标,感觉有些要求本身就相悖,比如说,一方面指导书并为对所有情况进行详细的要求说明,是为了锻炼大家理解自行设计的能力;而另一方面,由于互测这种竞争机制,同学又会在issue或是助教群中对每一种详细的情况应该如何处理进行询问,希望得到官方的回答,以此来规范自己或是挑别人的bug。窃以为,如果真的为了提升自行设计的能力,不如就不要在指导书已经发出以后,再进行各种要求,否则这和一开始就规定好有什么区别?还大大增加了学生与助教、助教与老师之间交流的时间成本。如果说需要进行某些硬性要求,就在一开始的时候将指导书写清楚,毕竟指导书永流传,一次修改福泽学弟学妹。

OO Summary Ⅳ的更多相关文章

  1. OO Summary Ⅲ

    规格化设计的发展历史 (这一部分并没有找到答案,于是参考了好黄和温莎莎的blogs) 1950年代,第一次分离,主程序和子程序的分离程序结构模型是树状模型,子程序可先于主程序编写.通过使用库函数来简化 ...

  2. OO Summary Ⅱ

    [第五次作业——多线程电梯] 类图 度量 协作图 设计分析: 多线程电梯是我第一次接触多线程,因此真的是无(瞎)从(g)下(2)手(写),感觉仿佛只是用一个调度器来调度3部电梯但又总觉得好像哪里不太对 ...

  3. OO unit1 summary

    Unit 1 summary 一.前言 三周左右的学习,OO第一单元顺利结束了,个人认为有必要写个blog来反思总结一下自己第一单元的学习情况,以便更好地进行后面的学习. 之前从来没有写blog的习惯 ...

  4. OO unit4 summary

    Unit4 一.第四单元作业的架构设计 第四单元个人认为主要是考察对于层次结构的理解,即如何理解并处理好UML图的树状结构组织,在理好层次之间以及层次内部的相互关系之后,就只剩下代码实现的问题了.但是 ...

  5. OO unit3 summary

    Unit3 ​ JML(Java Modeling Language) 是用于对 Java 程序进行规格化设计的一种表示语言,它对于方法内部具体是如何实现的并无要求,只是对方法的接口以及行为进行限制, ...

  6. OO unit2 summary

    Unit2 一.第一次作业 1.UML 2.Sequence Diagram 3.同步块设置与锁处理 采用了生产者-消费者模式,用共享对象来连接不同的线程. 第一次作业中,我有三个线程:Receive ...

  7. ABAP OO的八大理由

    原贴地址:http://scnblogs.techweb.com.cn/abaplv/archives/127.html 几年前SAP BASIS 4.6为ABAP扩展了OO功能,这是很多传统的ABA ...

  8. 【作业2.0】HansBug的5-7次OO作业分析与小结,以及一些个人体会

    不知不觉又做了三次作业,容我在本文胡言乱语几句2333. 第五次作业 第五次作业是前面的电梯作业的多线程版本,难度也有了一些提升.(点击就送指导书) 类图 程序的类图结构如下: UML时序图 程序的逻 ...

  9. 第一节:从面向对象思想(oo)开发、接口、抽象类以及二者比较

    一. 面向对象思想 1. 面向过程(OP)和面向对象(OO)的区别: (1):面向过程就是排着用最简单的代码一步一步写下去,没有封装,当业务复杂的时候,改动就很麻烦了 (2):面向对象将复杂的业务分离 ...

随机推荐

  1. springboot之启动方式

    我们在ideal中启动springboot项目时时不需要加载Tomcat容器的,直接在启动类启动就行了,原因是springboot项目中默认包含了内置Tomcat //springboot项目必须引入 ...

  2. Golang atomic

    原子操作函数 分为下面系列函数,其中Xxx可以是Int32/Int64/Uint32/Uint64/Uintptr/Pointer其中一种. 1.SwapXxx系列:交换新旧值: // SwapInt ...

  3. PyMongo官方文档翻译——VNPY

    PyMongo是MongoDB数据库的python模块 VNPY默认的数据库,没有采用SQL类型的数据库,而是采用No-Sql类型的MongoDB数据库, 对于想了解VNPY内部结构的童鞋,多多少少会 ...

  4. js插件---bootstrap-datepicker.js是什么

    js插件---bootstrap-datepicker.js是什么 一.总结 一句话总结:选择时间的插件 时间选择插件 1.datepicker如何默认选择当前天? 直接给datepicker对应的i ...

  5. php爬虫最最最最简单教程

    php爬虫最最最最简单教程 一.总结 一句话总结:用的爬虫框架,却是用的自己的例子(因为网站结构的变化,作者的例子不一定好用) 爬虫框架 自己例子 1.发现自己的运行效果和作者的不一样怎么办? 耐下性 ...

  6. Windows 下 Redis 服务无法启动,错误 1067 进程意外终止解决方案

    1.检查端口是否被占用 2.修改 Windows 服务里的 Redis 服务为本地系统服务(修改方式见下文) 方法: 1.看系统日志 桌面计算机/此电脑(Win10名称)右键打开管理,或 Win+R ...

  7. 请问WCF 跟 WebService之间的相同跟异同

    https://social.msdn.microsoft.com/Forums/zh-CN/c06420d1-69ba-4aa6-abe5-242e3213b68f/wcf-webservice W ...

  8. pandas选择单元格,选择行列

    首先创建示例df: df = pd.DataFrame(np.arange(16).reshape(4, 4), columns=list('ABCD'), index=list('5678')) d ...

  9. android -------- Android Studio调试运行时ADB not responding

    最近有我朋友问我一个android studio的调试运行问题,我记得以前也是遇到过得,所以 来写一下    ADB not responding.If you'd like to retry, th ...

  10. 4.1.4 Nim

    Problem description: 有n堆石子,每堆各有ai颗石子.A和B轮流从非空的石子堆中取走至少一颗石子.A先取,取光所有石子的一方获胜.当双方都采用最佳策略时,谁会获胜? 1<=n ...