面向对象第三单元感想
前言
这一单元并没能开一个比较好的头,导致之后的工作搁置并且未能完成,三次作业全军覆灭。第一次作业丝毫不了解JML,在实现规格要求的时侯没能正确理解规格的要求。在逐渐熟悉JML的过程中,之后的两次作业所分配的时间都用来填补第一次作业的坑了,第二次作业也仅完成大半。这种脱节式的学习带来的不好的影响就是没有明确的时间观念,而且期间会产生落差感,希望下一单元作业不要再出现这种状况。
正文
1.JML语言的理论基础以及工具链
理论基础
JML(java modeling language),是一种行为规范语言,遵循契约式设计,重在对规格的定义而并不在实现,目的即避免自然语言的二义性,使得每个java模块都能有严格、唯一的定义。
语法方面,JML有它自身的语法表达式,在基于JAVA语法基础上,新增了一些操作符和和原子表达式组成的,例如原子表达式:/result
、量化表达式 /forall
、集合表达式、操作符:<
(表示是子类)等。
规格方面,主要包括:
- 前置条件(pre-condition)
- 后置条件(post-condition)
- 副作用范围限定(side-effects)
因为有了这三个方面,一个方法的行为基本上就固定了,前置条件代表了方法调用者需要满足的义务,后置条件则是方法编写者需要满足的义务,而副作用范围则规定了方法对于一些属性的影响,通过这种制约,调用者和编写者实际上也就形成了一种契约,使得方法的编写和使用有了严格的限制,这种规格和契约的思想,在某种程度上也会减少bug的产生,并且也方便了测试,是一种功能强大的规范约束语言。
工具链
OpenJML:可以对代码进行JML规格的语法的静态检查,还支持使用SMT Solver动态地检查代码对JML规格满足的情况,因此OpenJML一般也自带有其支持的JML solver。
JML UnitNG:根据JML描述自动生成与之符合的测试样例,重点会检测边界条件。
2.架构设计
在看过其他人的博客以及相应题目下的讨论后,我发现自己进行数据处理的手段是非常简单粗暴的,第一次作业由于并没有正确理解JML,所以一切都建立在规格上,没有丝毫的变通。具体体现在:1、完全依据规格规定的数据结构来进行定义,数组即数组,虽然可实现长度更改以及元素的排序存取,但是未考虑时间复杂度。2、仅仅认为后条件就是可以直接一句话就能规定的,在实现@ ensures pList.length == pidList.length;这一句话的时候,用了if(pList.length != pidList.length){不作输出及其他操作;}这样的笨比结构,理解真的差到极点。