zoukankan      html  css  js  c++  java
  • 面向对象第三单元感想

    面向对象第三单元感想

    前言

    这一单元并没能开一个比较好的头,导致之后的工作搁置并且未能完成,三次作业全军覆灭。第一次作业丝毫不了解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){不作输出及其他操作;}这样的笨比结构,理解真的差到极点。

    在具体实现第九次作业要求的时候,舍弃上边的“骚”操作,改采用了邻接表的方式,大大简化了长度变更的操作,而且设置一个公共长度N来控制两个列表长度不变。
    后两次作业并不完善,这里就不继续卖(diu)弄(ren)了

    3.本单元心得体会

    这单元作业在工程量上并比不过前面电梯那次,但是复杂度上提升了不少,一是由于要理解JML要求,并将之转化为我们的方法,二是需要参与自己的设计,以减少时间复杂度。我在完成作业的时候,花费在解读JML规格上的时间大概占了四成,将之转化成书面上可以理解的规格要求,之后便是架构设计,只有最初确定比较好的架构,之后的工作才会变得简单。最后填充方法算是比较简单的逻辑,只是在处理具体方法的时候可以加以不一样的算法结构,可以使程序更快或者更安全。通篇下来,都在透露着自身的不足,希望接下来的一个单元能能够对我更加“温柔”吧。
    勇士向死而生!
  • 相关阅读:
    Jmeter在命令行运行技巧
    Tomcat6 一些调优设置内存和连接数
    用例结构优化心得
    LoadRunner 调用dll方法
    DLL接口自动化测试总结
    Loadrunner进行md5加密方法
    Loadrunner检查点使用总结
    网络上可供测试的Web Service
    04 json,xml混合封装通信
    03 xml封装通信接口
  • 原文地址:https://www.cnblogs.com/xuwenguang/p/10902435.html
Copyright © 2011-2022 走看看