一、 测试与正确性论证的区别
在最后一个单元的OO作业中,我们主要进行了代码的测试与正确性论证工作。这俩者在作业中的体现分别是junit单元测试以及jsf论述语言。这两者在java代码开发中分别能够帮助我们检测代码、测试代码,最终起到对工程正确性进行检测的功能。
这二者就好比一个是完成前的完整性检查,一个是完成后的正确性测试。当然了,理论上来说,这两者之一都可以帮助我们避免代码中问题的出现,但是更保险一点又有谁会反对呢?
先说说junit单元测试。这个相比jsf论述语言,应该是我们比较熟悉的一个了。就像我们平时完成代码后的功能测试一样,junit通过编写能够完整覆盖代码逻辑分支、语句分支的测试样例,对每一个功能单元进行测试,并与预期结果进行比对,从而起到辅助程序员规避代码bug的功能。这种方法十分亲民,但是,却有着一定的问题。经过实践发现,由于逻辑本身存在的问题,虽然使用的测试样例达到了代码覆盖率100%,逻辑分支覆盖率100%,但是样例过于简单,没有在数据范围上完整覆盖所有区间,在通过单元测试之后,仍然导致了问题的出现。
这就需要jsf论述语言来帮我们规避问题。jsf论述语言,在刚开始学习的时候让我们感到无比头痛。毫不亲民的语言格式,不直观的展示方式,啰嗦的描述方式,让我对其功效一度产生了怀疑。但这却能让我们规避junit所无法规避的问题,那就是在逻辑上对实际实现的代码与程序员所构思的程序应该具有的功能做比较。在这个单元的学习中,我就通过jsf论述成功发现了我的第三次OO作业中的一处逻辑漏洞,是判断语句中数据覆盖不完整导致的,如果不使用极其特殊的测试样例,使用junit单元测试就很难发现其中的问题。
二、 OCL VS JSF
OCL(Object Constraint Language)语言,即对象约束语言,跟jsf语言一样,是声明式语言,对于方法只关心做什么、效果怎样,而具体如何实现,则不关心。都是使用逻辑表达式来描述具体的约束内容,采取了类似前置条件,后置条件,不变式这样的语法。但是OCL通常会结合uml类图来使用,相比jsf的约束性也更广。
三、 第十四次作业总结
以上是我的时序图和uml图。
四、 学期总结
这学期的面向对象程序设计课程主要进行了四个单元的练习,分别以基础java程序设计,基础多线程程序设计,进阶多线程程序设计、jsf论述入门,以及jsf论述进阶、junit单元测试为主。在整体上来看,逐步深入,每个单元的作业由三次程序作业组成,按照指导书加答疑的方式布置内容,要求我们有非直观信息的理解能力。
这个学期的作业我做起来还是相当认真的,每次都是“谋定而后动”,中间的电梯第二次作业还在周一晚上由于逻辑设计的问题重构过一次,整体上来说应该算是质量不低的。但事实却跟我想的有点区别。第一次单元测试作业,让我们测试第三次作业(也就是第一次电梯作业)。在回顾的时候,简直惨不忍睹。虽然作业整体功能上没有出现问题,但是各种变量名混乱、类功能混乱、对于同一个信息的检测分割在不同类中,羞于承认这是我写的。进而整体重构了一遍。在羞愧之余,我却发现,这何尝不是一种提高呢?在当时我那样设计,虽然已经忘记了当时的初衷,但是现在对于当初的鄙夷不正是表现了我对于清晰的面向对象程序的认识与向往么?这种提高每次一都很小,但是12次作业积累下来,简直让人无法相信这些都是同一个人写的。不可谓提高不小。