代码改变世界

第三次OO博客作业

2018-05-28 23:11  necrolyte  阅读(225)  评论(0)    收藏  举报

 

一、规格化设计的发展历史

20世纪60年代开始,就存在着许多不同的形式规格说明语言和软件开发方法。在形式规格说明领域一些最主要的发展过程列举如下:

1969-1972 C.A.R Hoare撰写了"计算机编程的公理基础(An Axiomatic Basis for Computer Programming)"和"数据表示的正确性证明"两篇开创性的论文,并提出了规格说明的概念。

19741975 B.Liskow/S.N. ZillesJ. Guttag引入了"抽象数据类型"的概念。

1976                      E.W. Dijkstra定义了"最弱前置条件"的概念

1977                      R.BurstallJ.Goguen提出了第一个代数规格说明语言:Clear

1988      StandfordSRI开发了代数规格说明语言OBJ3

1980-1986 C.Jones定义了VDM语言,也就是维也纳开发方法。

19851992  牛津大学的程序研究小组开发了Z规格说明语言。与此同时BP研究室开发了称之为B方法的面向模型的规格说明语言。

19851993 MITDigital SRC开发了代数规格说明语言Larch

1991年开始,面向对象的形式规格说明语言开始发展,例如,Object-Z, VDM++, CafeOBJ等语言。

19962000 在欧洲CoFICommon Framework Initiative)项目资助下开发"统一"代数规格说明语言CASL(Common Algebraic Specification Language)

上述规格说明语言可以分为两大类:

l         基于代数和公理方法(Clear, OBJ, Larch, CafeOBJ

l         基于模型的方法(VDM, Z, B, Object-Z

(参考自https://blog.csdn.net/jnucstan/article/details/1724259)

二、BUG分析

  功能BUG 规格BUG 是否有联系
第九次作业 1 1
第十次作业 1 1
第十一次作业 0 0

 

被报了规格上的BUG的主要原因是因为使用了太多的自然语言进行描述。因为一开始助教并没有硬性要求使用布尔表达式进行描述,因此而使用更加直观的自然语言进行处理。在被报BUG后及时进行了修正。功能上的BUG主要是因为在某些奇怪或极端的情况下会出现crash。之后对整个程序进行了try与catch处理,修复了这个问题。

三、规格举例

1、运用自然语言

 

/**@REQUIRES:None
* @MODIFIES:None
*@EFFECTS:获得start_x的值,起点的x坐标
*/

修改后:

/**@REQUIRES:None
* @MODIFIES:None
*@EFFECTS:\result==>start_x
*/

 

 2、没有抛出异常信息

    /** @REQUIRES: 
       *@MODIFIES: 
    *@EFFECTS:(q.contains(req))== > \result ==req;

    *@THREAD_REQUIRES:
    *@THREAD_EFFECTS:
    */

  改进后

    /**@REQUIRES: 
       *@MODIFIES: 
    *@EFFECTS: (q.contains(req))== > \result ==req;

                             otherwise==>NoThisElement

    *@THREAD_REQUIRES:
    *@THREAD_EFFECTS:
    */

 

3、直接使用源代码

   

        /**@REQUIRES: 
        *@MODIFIES: 
     *@EFFECTS:q!=null

     *@THREAD_REQUIRES:
     *@THREAD_EFFECTS:
     */

  改进后:

        /**@REQUIRES: 
        *@MODIFIES: 
     *@EFFECTS:(q!=null)==>\result=true

            otherwise==>\result=false;

     *@THREAD_REQUIRES:
     *@THREAD_EFFECTS:
     */

 

4、将\locked看成vocked

/** @REQUIRES: null
*@MODIFIES: null
*@EFFECTS: \result==>x1
*@THREAD_REQUIRES: Vocked(x1)
*@THREAD_EFFECTS:
*/

修改后:

/** @REQUIRES:
*@MODIFIES: 
*@EFFECTS: \result==>x1
*@THREAD_REQUIRES: \locked(x1)
*@THREAD_EFFECTS:
*/

5、限定范围不明确

/** @REQUIRES: null
*@MODIFIES:pos
*@EFFECTS: pos==>p
*@THREAD_REQUIRES: \locked(pos)
*@THREAD_EFFECTS:
*/

修改后:

/** @REQUIRES: p>=0 && p<6400
*@MODIFIES: pos
*@EFFECTS:pos==>p
*@THREAD_REQUIRES: \locked(pos)
*@THREAD_EFFECTS:
*/

四、聚焦关系

事实证明我的规格BUG与功能BUG没有太大关系。规格BUG主要是因为使用了自然语言,而功能BUG则是因为未能正确处理崩溃。

五、心得体会

认真学习规格设计,有利于将来我们在参与大型项目的设计时对各个项目的功能有明确的划分与定位,能够便于项目的编写与维护。OO这门课的意义还是很重大的,它实实在在地告诉我们应该如何去实现现实生活中的需求,应该如何应对刁难的客户,应该如何对自己的代码进行维护与重构。总之,我们应该认真学习这门课程!