一:测试与正确性论证的效果差异

  首先,测试和正确性论证都是对程序的可靠与否,是否有误进行测试,从整体上来看,测试多偏向于实践,而正确性论证则大多偏向于理论。

  测试:测试首先是构造一组测试样例,之后将程序用这组样例运行,将得到的结果与预期的结果进行对比,来进行程序的正误判断,若程序得到的结果与预期不符,就查找测试程序所覆盖处的代码,对每个地方进行勘察以找出错误之处,找到之后即刻进行修改,这样重复进行,直至将代码部分全部覆盖,反复多次去查找存在的bug,复现它并解决它。测试的好处在于实现起来十分简单,只要找到一组输入数据就能对应一种情况的测试,再者,它不仅可以测试程序的正确性,还能运行程序,从而能在程序的性能方面进行研究,更偏向于实践,在现实中使用较广。但测试也存在一定的缺点,对于输入情况较少的程序,测试起来较为简单,但对各种各样输入情况复杂的程序,能够完全覆盖程序运行时的每一点实在太难了,往往会耗费大量的精力去进行测试。

  正确性论证:正确性论证是从程序的规格出发,基于规格对代码进行逻辑上的论证,从而确认某一类或某个方法是否正确。正确性论证的有点在与:对于规格化实现的程序,能很好地对代码进行彻底地复查,能很好地覆盖到所需要论证程序的每个类每个方法,这是测试无法保障的,此外正确性论证是从原理出发,从根本上确保了论证方法的正确性。正确性论证的缺点在于,它是针对已实现的程序进行论证的,只能证明程序的实现过程不具有问题,但若程序的设计从根本上是存在问题的,这就不是正确性论证能解决的,并且对于程序代码量过大(如一个方法超过50行)则很难进行正确性论证。

二:OCL和JSF的比较

  OCF语言是一种对象约束语言,他是一种施加在指定模型元素上的语言。OCL表达式以附加在模型元素上的条件和限制来表现对该对象的约束,其中包括附加在模型元素上的不变式和约束的表达式,附加在操作和方法上的前置条件和后置条件等。对象约束语言是一种形式化的语言,它主要用于表示UML模型中施加于模型上的约束。OCL特点如下:

  (1)OCL是一种精确的,无二义性的语言

  (2)OCL是一种规范说明性的语言,所有有关实现的问题都不能用OCF来表达

  (3)OCL是一种纯表达性语言,它是具有没有任何副作用的申明性语言

  (4)OCL是一种类型化语言,即OCL的每一个表达式都是具有类型的

  (5)OCL不是一种程序设计语言,不能用OCL编写程序逻辑和控制流程

  与JSF的对比如下

  (1)JSF是针对类和方法而产生进行约束,而OCL是对对象进行约束而产生的

  (2)OCL的语言是精确的,没有二义性,而JSF相对较为开放,同一段程序可以有不同的写法。

三、类图 时序图和状态图

OO第四次作业总结-LMLPHP

                                                                       类图

OO第四次作业总结-LMLPHP

                              时序图

OO第四次作业总结-LMLPHP

                              状态图

四、课程总结

  1.四个单元模块之间的联系

     第一个模块:学习了面向对象语言java中的基本思想,知道了java面向对象的几个基本概念:继承、重载与重写、多态、抽象类、封装、接口等等,这一章让我们从之前学c语言时的基本的面向过程的思想转为面向对象思想,是将之前一长段的代码逐渐分割成较为简单的每个类的过程,也是在这里也开始会用java语言写一些简单的程序。

      第二个模块:在第一模块的基础上,去学习更复杂的多线程编程,将各个进程之间用共享资源进行限制,更有效的提高了程序的运行效率。

      第三个模块:类和方法上规格的实现,要求我们要依据规格去写程序,好的规格能让我们写代码的思路更为清晰简介。

      第四个模块:对程序的正确性进行判断,用了两种方法:测试与理论的正确性论证,两种方法各有优劣,能在不同方面去测试程序的正确性。

     2.自己的进步

    在一开始学习这门课的时候,我是崩溃的,因为自身对于java语言这方面完全不了解,但在不断学习中,逐渐会写一些java语言的程序,明白了将一个程序的各个部分划分为多个抽象对象,这些抽象对象含有一定的属性和各类方法对对象的 属性进行改变和判断,简洁有效地对一个程序各个需求部分进行分析处理。原本以为写一个程序最麻烦的是写的阶段,在不断地做测试的过程中明白了测试才是写一个程序的大部分,在不断的测试中,不断发现程序存在的bug,并不断修复它,而这个修复过程是尤为繁琐的,不仅要找到错误的地方,还要分析是什么情况导致了错误,修改时会不会造成其他情况的错误等等,在后面写程序的过程中,测试几乎成了最烦的问题,分类划分各种情况,然后一块块测试,这是在测试中养成的良好习惯。

    3.对工程化的理解

    在我看来,工程化程序开发它不同于简单的编写程序,个人编写程序只需考虑自己能看懂即可,而工程化开发则要求自己的程序能让别人读懂,并且自己的程序绝对不能有错误,工程化开发往往需要大量的时间,由每个人负责一部分,这就很要求代码的可读性,因此规格化的设计就显得尤为重要,在测试方面,要充分覆盖程序存在的每个输入输出,使自己撰写的部分不能有一点错误,一点错误的存在就会导致整个程序出现故障进而导致崩溃。

    4.对课程的建议

    我的建议在于以下几方面:

      (1)在课程中能增加一些具体例子,如一开始的面向对象编程,希望能有两个程序分别是面向对象编程的和面向过程编程,而不是简单的一段代码,这样能加深对面向对象的理解;在多线程中,能加入具体的多线程的代码,结合具体的一个多线程代码才能让我们开始从会写开始,减少过多的课外研究时间。

      (2)对于互测和公测,希望能增加公测的比例,多加一些例子,因为公测具有绝对的公正性,让公测集覆盖多个方面才能使程序发现多个问题,仅仅依赖互测找到问题或许不可行,在互测方面,对于规格等这一些的判断希望能加一个上限,不让滥报、多报等行为产生。

      最后,感谢各位老师和助教们一学期的陪伴,希望OO课程能越来越好。

05-08 15:44