一、测试与正确性论证的效果差异
测试,顾名思义就是我们暴力用大量数据轰炸编写的程序的过程。日常的OO过程中,我们经常互相寻求“测试集”,正是因为测试使用特定数据对我们的功能进行针对性测试,好处在于可以很直观很明显的找到bug所在,并且复现性也很强。但是偏向于穷举,也就是我们平常对于自己的数据集过小,而担心自己有没有完全覆盖所有的可能,即使自己测试的过程中没有发现问题,也心里惴惴不安,从而寻求更大测试集。这种方式便于实现与分析,但是不能完全验证程序正确性。
正确性论证,就是通过分析需求,撰写规格后,论证程序符合规格的过程,偏向于验证程序的思路走向,逻辑判断等问题,即程序有没有按照我们设想的执行。可以从根本上保证其实现正确,整体剖析了执行过程,但并不通过具体数据,而是理论分析,由于判断多为布尔型语言等,编写过程和阅读会比较费时间,但是验证上非常简单。
就我个人来讲,从测试中受益匪浅,因为大量的测试数据集的确为我de了不少bug,而正确性论证虽然理论上讲不需要付出那么多精力就可以确保自己程序正确,但是我实际并没有那次作业真正使用它完成检查过程,希望能有一个机会彻底让我了解正确性论证的优越之处。
二、OCL语言与JSF规格
OCL是对象约束语言,用来进行对象的约束及定义,主要用于在建模时作为图形符号的补充,含有约束,前置条件,后置条件等。不变量是在属性的生命周期内保持为真的规则,前置条件是一个操作被调用时需要满足的约束,即满足规格要求。后置条件是操作结束后一定为真的约束,即完成了什么操作。监护规则是对象从一种状态转变为另一种状态前值必须为真的约束。
他们的相同点在于他们都是形式化的约束语言,在程序中进行无二义的逻辑约束。结构上也具有相似性,OCL主要包括的不变量,前置条件,后置条件,监护规则分别对应JSF对应着repOK(),REQUIRES,EFFECTS和MODIFIES。
他们的不同点在于作用的时间不同,OCL主要是在编写程序前,理论建模时刻对每个类进行明确的约束,而JSF主要在功能实现前进行约束以确保程序逻辑实现正确。
三、第十四次作业模型图
UML类图
UML时序图
状态图
四、学期总结
1、四个单元模块知识点之间的关系
第一单元从多项式计算到傻瓜电梯,主要建立了从面向过程到面向对象编程的思想转变,在代码的编写中体会java面向对象的思想,把一个程序的执行分散到对象中,去符合高内聚低耦合的规则,便于修改和理解。
第二单元扩展电梯功能,引入线程的概念,同时处理多个任务是我们本次的要求,多线程在带来高工作效率的同时,也引入了线程安全的概念,如何保证进程的互斥和资源的共享成为了我们最需要注意的问题。
第三单元引入规格化设计,在程序功能逐渐完善同时,也要考虑到我们的代码能否被他人看懂,能否便于移植,所以我们更要考虑程序实现中规格的规范,通过前置条件,后置条件对调用方法进行规范,对正确性进行统一的验证。
第四单元主要引入了很多自动化测试,我们在保证程序功能正确的同时,程序规模也会日渐增加,此时通过人工处理,判断成为难事,一是基于输入借助软件生成自动化覆盖测试,而是通过理论层面论证程序正确性。
2、梳理与进步
程序功能上,明确了类的分工,通过抽象,继承对每次作业的功能进行划分,防止出现功能太多或太少的类,尽量均衡,并且便于各个类的扩展,精简代码的逻辑和行数,命名的精简和见名知意性,增强其可读性和可维护性。
测试方面,对于测试的进行了从无脑的覆盖,到针对分支树的测试数据设计,到数据与正确性论证的结合,更加工程化,更加合理。
3、对工程化开发的理解
工程化开发,在我看来是在写代码的漫漫长路上转阶段的一步,是从作业到项目的转变,因为作业可以是一个人完成的,你写的逻辑,你测试的方法你自己知道就可以工作,但是项目中,我们需要考虑到很多事情达成共识,例如变量的命名规则,类的设计,接口的统一,只有明确了这些,才能够保证代码可以互相开发,互相阅读,互相协作,一个明确的规范就是工程化开发的第一要义。
4、期望与建议
期望把规格撰写的要求从第一次作业开始布置,这样的好处在于我们可以在一开始就对自己的程序使用框架来安排好各个部分和方法是实现,以防出现需要重构的情况,并且取消JSF的扣分,以便于同学们压力过大,加强对于面向对象思想的检查,再考虑功能的实现,可以先留几次规格框架的检查。同时也要感谢老师和助教一学期以来的付出!