1、测试与正确性论证的区别java
从哲学的角度来讲,正确性论证与测试的关系就像理论与实践的关系同样。c++
使用测试的方法检验程序正确性确实是一个很是方即可行且普遍运用的方法。能够经过几个简单或复杂的测试样例,迅速地校验程序主要逻辑是否正确,运行结果是否符合预期。可是对于较为复杂的问题来讲,测试样例极可能并不能覆盖全部的状况,所以咱们曾经引入代码覆盖率和分支覆盖率的概念。可是在操做过程当中我发现,即便某个不彻底的测试样例代码覆盖率达到100%,分支覆盖率高于95%,它仍然并不必定彻底检验程序的逻辑是否正确,即便结果符合预期。所以咱们很难经过测试样例说明程序必定正确,即便咱们使用了脚本生成等自动化测试方法,仍然不能全面地测试程序的逻辑是否彻底正确。所以测试这样的方法有着其便捷性,也有着其局限性。程序员
正确性论证是一个全新的思路,咱们把程序的逻辑构形成分支的形式,经过规格总结出在各个分支下程序的预期表现来从宏观的逻辑层面上论证程序是否正确,不去关心程序运行过程当中如何实现,只须要知足规格提到的前置条件和后置条件便可认为程序正确。可是对于复杂问题,构建出程序的逻辑分支便已经十分吃力,程序的复杂逻辑极可能在分析的过程当中遗漏一些错误,所以这并非一个万全的方法。正则表达式
咱们在实践中,应该结合两者进行测试,虽然耗费时间,可是在对程序认知较为深入的状况下,天然更容易思考到比较偏僻和少见的逻辑问题。编程
2、OCL语言安全
OCL语言是对象约束语言,与JSF类似,一样拥有着前置条件和后置条件,可是没有JSF中的Modified属性,有相似的不变式。还有叫作监护规则的约束,即在对象可以从一种状态转变为另外一种状态前其值必须为真的约束。多线程
OCL语言和JSF同样,都只关心方法或对象在运行先后的属性状态,不关心具体的实现过程。单元测试
3、第十四次做业总结学习
以上是第十四次做业的UML类图。测试
以上是第十四次做业的时序图。
4、学期总结
本学期咱们首先学习了面向对象语言的初级应用,完成了一个看起来很不面向对象的Java程序——多项式计算,这个程序因为功能简单,致使其类的功能过于集中,Main类用于录入信息,ComputePoly类用来计算多项式加减,确实是难以感觉到Java面向对象程序与传统面向过程程序的区别(除了程序中多了几个class关键字)。固然如今看来,这个程序还能够写得更面向对象一点,更完美一点。可是对于一个什么都不懂的初学者来讲,用这个做业入门且因为设计需求中对输入的严格要求,你们每每会把注意力集中在java的基本语法学习和正则表达式在Java中的运用之中,反而忽略了面向对象程序的关键。愚觉得,这个做业能够进行一些改进以更加地偏向面向对象教学,不过考虑到因为须要公测进行测试,且规范输入格式对以后电梯程序的铺垫做用,设计出这样的做业已是很是合理了,且暂时也难以想到兼顾两者的做业设计,毕竟对于当时的我来讲,面向对象仍是一个很是抽象笼统的概念,是须要一个学期的学习才能正确认知的。
随后咱们完成了两次单线程电梯,第一个是傻瓜式电梯,以后咱们运用了学到的类的继承,将其升级为有一点点智能的可捎带电梯。到这里,咱们已经能够管中窥豹地初步认识到Java面向对象中一大特性之继承的做用以及好处,同时对单线程编程也是较为熟练。
以后咱们便愉快地进入了Java多线程的世界,咱们首先再次升级了以前的稍微智能一点的小垃圾电梯,将其改造为很是小可爱的三部电梯同时工做,而且直接进入了多线程阶段,能够真实地模拟时间,简直是太酷了!
这三次做业让咱们发现,在功能升级的时候,老是有一些其余无关类(如Floor类)的代码因为一些不可言状的缘由必须进行修改,这是怎么回事!明明很厉害的面向对象怎么会有这种状况出现!难道是我作错了什么!原来随着需求的修改,程序的逻辑有了很大的变化,以前在楼层类中使用了一些属性来记录相应的请求,而在多线程电梯里又用不到了,致使这部分逻辑在方法中冗余,才须要大量的修改甚至是重构。此时咱们发现了,类的抽象化作的很是的很差!楼层就是楼层嘛,楼层有楼层的功能,为何还要用来记录请求信息呢(实际上是由于要打印输出),记录请求信息意味着类之间的耦合性变高了,这也就是咱们必需要修改除去scheduler类以外的其余代码的缘由。
当这一做业告一段落,咱们完成了一个用做过渡的,用来帮助咱们学习多线程的线程安全和同步控制的做业——文件系统。在此次做业中,咱们学习了诸多线程安全的手段(有且不只有sleep(200L), sleep(500L)和sleep(1000L)),极大地提高了本身在线程同步控制上的造诣。
在以后的Taxi做业,咱们早早就据说了本次做业将有屡次升级,所以我在实现时很认真地思考本身的程序,如何让本身的程序变成高内聚低耦合的神奇存在。又在线程控制上有了很深的认知,使此次做业的线程同步的矛盾从设计层面上被尽可能避免。同时又完成了需求提到的并不丰富的功能,其中最困难的部分多是从新写一个好用的最短路径搜索以替代本来GUI中提供的特别占内存且特别慢的方法吧。
以后不管是为道路添加流量仍是添加红绿灯仍是设置VIP出租车,都极大地体现了一个良好的程序构思是多么的有意义,添加流量时因为要修改map类的逻辑,包括最短路搜索,致使须要写很多代码,以后的红绿灯几乎只修改了两三个方法,修改了十几到几十行代码就解决了这个问题。而可追踪出租车更是完美的体现了面向对象程序中继承的优势,程序的其余部分对可追踪和普通出租车的处理彻底没有区别,却能够很好地完成功能需求。再加上某个选修课学到的c++面向对象的相关知识,到这,我以为面向对象程序中继承的运用以及好处已经被我掌握个大概了。
从Taxi第二次做业开始,咱们引入了全新的程序设计理念——规格,这个东西能够很好地统一程序员之间的交流语言,也能够为本身的程序设计提高便利。这一部分与咱们以后的几回做业有着极大的关联。
以后的几回代码量很是小的做业中,咱们前后接触了JUnit单元测试、程序正确性论证等概念,这两个概念令我对以前蠢笨的测试方法感到十分羞愧,想起当时百度的时候也曾经看到JUnit的使用方法但因为懒惰并无深刻学习,致使刚开始在对程序测试时,几乎都在使用复制粘贴按回车大法。可是代码量小并不表明做业更轻松,虽然当时的我在身体及意识上对它们都有些不重视,可是在实践过程当中,发现当初写的程序简直是太难以接受了,将这样的程序整理出合适的规格实在是过于繁琐。所以,无可奈何地修改了一小部分代码使程序变得好看一点。又因为在第二次电梯做业中对其很是的上心,记得当时不少的逻辑结构,所以很容易就构造出了符合条件的测试集。虽然因为逻辑的复杂,在正确性论证的过程当中碰了钉子,但整体来讲还算比较顺利。
从我我的的角度来看,这一路走来,个人工程化能力有着比较大的提高和进步,对面向对象的学习也是很是认真。所以很是感谢OO课程组为咱们精心设计的关卡,很是感谢助教在这一过程当中对咱们的帮助。就我我的来讲,相信若是没有OO的闯关机制来辅助个人学习,单纯经过上OO理论课,而后随便布置一些做业的话,我很难对OO这门课的认识有现在的程度。