测试与正确性论证编程
Dijkstra说过:“程序测试只能证实程序有错,不能证实程序正确。”所谓程序测试,其实是测试者特地挑出一批检查数据,经过运行程序,检查每一个输入数据所对应的运行结果是否符合预期要求。正确性证实是论证程序达到预期目的的通常性陈述,该论证不与程序输入的特定值有关,但可以表明穷举性测试。安全
测试相比于正确性论证来讲,实际像是将程序看做一个黑盒,并不关注程序内部的实现。测试不只能快速地发现程序的bug,也能测试程序的效率,复杂度等属性。可是缺点在于须要大量的数据,想要作到全覆盖测试并不容易,甚至在不少状况下根本没法实现。网络
而正确性论证则不同,若是说测试是从实践方面来检测程序的正确性,那么正确性论证则是从理论上来证实程序的正确性。正确性论证在理论上来讲能够覆盖整个程序,从而证实整个程序的正确性。比起测试来讲,因为是从理论上来证实程序的正确性,所以所须要的资源相对较少。可是其缺点也比较明显,首先,正确性论证是从实现的角度去论证程序的正确性,只能证实程序实现的正确与否,若是程序一开始的设计就是错的,那么正确性论证不能发现这个问题。其次,当一个方法的实现过于复杂时(好比一个方法的代码超过了50行),正确性论证难以进行。多线程
OCL与JSF并发
对象约束语言(简称OCL)是一种指示用户建模系统中的限制方式。UML图一般不够精细,没法提供与规范有关的全部相关部分。这其中就缺乏描述模型中关于对象的附加约束。OCL即是为了解决这类问题应运而生的形式语言。编程语言
与JSF相比,虽然二者都是一种约束语言,但OSL语言是一种无二义性规范语言,而且每个表达式都有本身的类型。JSF的主要服务对象是方法,而OSL的主要服务对象是每个类。测试
第十四次做业线程
学期总结设计
不知不觉间已经度过了一个学期的漫长而痛苦的OO旅途。虽然说痛苦,可是收获满满。对象
第一个单元,咱们的主要目标是造成面向对象编程的思想。之前所学过的编程语言C语言是典型的面向过程的编程语言,而新接触的Java语言则是一款面向对象的编程语言,这一单元主要是让咱们熟悉面向对象的编程思想,而且以典型的电梯程序来辅助练习。这一过程当中,主要的问题是对Java语言的不熟悉,难以理解面向对象的编程思想。
第二个单元是针对多线程编程的训练。用一句通俗的话说,这一个单元是最折磨人的。首先在于咱们对线程丝毫没有概念,也不懂得并发等术语的含义,所以在多线程编程中到处碰壁。其次,线程安全也是一个让我很是头疼的问题。在这一个单元中,主要出现的问题是如何设计,好比在出租车系列做业中,到底是一个线程管理一百个出租车仍是一百个线程管理一百个出租车方便实现?如何去保证出租车运行过程当中线程始终安全?这些问题是当时一直困扰着个人。
第三个单元着重于规格化的设计。这一个单元的主要目的是让咱们意识到规格的重要性。尽管JSF一直在被吐槽,尽管你们对测试时测试者对JSF的扣分十分厌恶,可是,这一个过程确确实实让咱们了解了规格的重要性。规格不只仅方便了程序的使用,它还可以让其余人更容易弄懂你的程序,这对于开发者来讲十分重要。
第四个单元的重要任务即是测试和正确性论证了。到了这个单元,你们都已经可以理解面向对象的编程思想,也能写出相应的代码。可是如何保证本身写的代码是正确的呢?这一单元针对代码的测试和正确性论证帮咱们解决了这个问题。也让咱们可以写出完善健全的代码。
回看本身写过的历次做业,我发现本身的提升仍是很明显的。最初的我写的代码,彻底是面条式的,现在的代码,具备了至关程度的可移植性。针对测试,已经学会了将输入输出划分,以造成分类树来对程序进行测试。
至于工程化开发,个人理解是首先开发者在设计方面要遵循必定的原则,其次要写出可移植性高,可修改性强的代码,便于修改和完善。再次对每一个类每一个方法的实现要规格化,方便测试。最后的测试阶段中,要尽可能按照测试的分类树进行测试,尽可能实现全覆盖的测试。
咱们常常说的一句话是OO不易,和谐6系。其实我以为这和课程组有很大的关系。很大的缘由是互相测试致使的。有一句网络语是这么说的:“我就这样了,有本事你顺着网线来打我啊?”的确,匿名的互相测试确实让某些同窗过于“随心所欲”,周五测试结果出来以后,看到被报的BUG又要与测试者争论许久,最终还得靠课程组的仲裁。既破坏了同窗间的关系又加大了同窗和课程组的压力。
我认为一个很好的解决方法是加大公测力度,减小互测在分数中所占的比例。实话说,互测有很强的主观性,公测才是真正公平的。但不少次做业公测,弱的惊人,把分数彻底交给测试者,难怪同窗们都说这是面向运气编程。
虽然怨言很多,但始终仍是但愿OO课程能愈来愈好吧,也但愿这门课能成为北航计院的特点课程(虽然已是特点课程了)。