一、测试与正确性论证的比较

从方法上看,测试是使用大量测试样例来覆盖测试代码,从而能够检测代码的实现是否正确,功能是否完善。而正确性论证是使用代码的规格和逻辑进行严密的推论和证明,从而验证代码的实现正确性。从优缺点来看,测试的优点在于能够直观地看出测试的结果是否正确,而缺点在于难以构造覆盖完整的测试集;正确性论证的优点在于能够保证正确性和覆盖率,但是不够直观,而且论证错误不易察觉,也就是不易二次检查。

因此,在对一个程序进行设计测试检查的时候,需要二者同时使用,相互补充,使用测试集测试程序功能的完备性,使用正确性论证验证代码的逻辑正确性和严密的覆盖所有代码,这样才能对程序进行充分的测试验证。

二、OCL与JSF的比较

OCL,即Object Constraint Language, 中文译为对象约束语言。OCL是一种用来在指定的模型单元上施加约束的语言。同时OCL也不仅用来写约束,还能够对UML图中的任何元素写表达式。OCL是约束和查询语言,有一个形式化的数学语义,并且允许用户定义自己的OCL符号集。

与JSF的相同之处:OCL和JSF都是形式化的语言,都有同样的规格即前置、后置条件以及不变式。

与JSF的不同之处:JSF基本上使用的是逻辑表达式,少量使用自然语言。而OCL的表达式具有类型,且数据也有基本类型,这点和JSF有较大区别。

三、UML图

类图:

OO终章--总结博客-LMLPHP

时序图:

OO终章--总结博客-LMLPHP

       状态图:

OO终章--总结博客-LMLPHP

四、学期总结

1. 知识点总结:

第一阶段:从多项式加减到ALS电梯,一个入门的阶段,主要的知识是面向对象编程的思想,以及java语言一些基础的语法,比如正则匹配等等,较为简单,属于经验怪,前期给玩家升级用的。

第二阶段:从多线程电梯、IFTTT到第一次出租车作业,一个逐渐熟悉的阶段。主要讲解了多线程的机制,竞争和同步机制、文件监测和操作等等知识,同时对规格有了一定的要求,代码质量也更高了。这属于精英怪,对于在第一阶段没有花时间认真打怪升级的玩家来说,可能就会被这个阶段的精英怪秒杀了,然后消耗一次复活(无效作业)的机会来从头打怪升级,苦肝到深夜。

第三阶段:对出租车进行功能上的完善,添加了许多功能。这个阶段主要是对程序有了规格化要求的设计,包括JSF规格的书写,和程序的规格化设计,在总体的代码量上也有显著提升。属于boss级别的怪物,需要苦战几日,熬夜连战,才能最后干掉boss。

第四阶段:这个阶段的主要作业是对以往的代码进行验证和测试,以及正确性论证。虽然总体作业量小了很多,不用写大量代码,也不用构造复杂的结构。但是这个阶段的知识是很重要的,放在课程的最后,重要性也不言而喻。

2. 个人总结:

从一开始的多项式加减,到最后的功能强大的出租车,总共9次编程作业,说多不多,说少不少,总而言之,对于我的编程能力还是有较大提升的。最开始的作业,对于面向对象的思想还是不够理解,写出来的程序只是有面向对象的外壳,但是实际上还是一个面向过程的程序,一个方法占了100多行,质量也不高,debug还十分困难。到最后几次作业时,对面向对象已经有了比较深入的见解,对类和方法的区分比较严格,方法的代码量也不多,嵌套深度也少了,把各个模块和功能安排得比较明白,质量有了明显的提升,debug也容易多了。尽管如此,但还是有一些不足的地方,需要更深入的学习。

3. 工程化开发:

我认为工程化开发就是,首先需要规范设计好每个功能的规格。然后将各个功能的实现分发给不同的程序员实现,团队的各个成员负责自己的模块,同时又可以相互协调合作,提高总体效率,降低成本。在此基础上,良好的规格化设计和封装是必要的,大部分程序需要实现大量的功能,这对于工程化开发是必不可少的条件。

4. 对课程的建议:

其实要说平时的吐槽倒挺多的,真要给实际建议的时候,还找不到几条。首先就是指导书的问题,我相信绝大部分的同学都会提到这个,指导书写的实在是很粗糙,对于一些细节上的问题,还有几次作业的扣分点都交代得不清楚。有很多次情况就是,一些摸棱两可的问题,一开始说readme自行定义,然后发现这些条件又是必要的,在提交作业前突然通知说要改指导书的内容,这让很多同学心态会崩的。还有就是在issue里提到要更改的地方,没有正式的通知,最后询问得到的结果是自己没看issues。虽然有各种吐槽,但确实找不到更好的替代方法,包括互测的面向运气得分机制。希望学弟学妹们能存活吧。。

05-08 15:51