1. 规格设计的发展历史

规格设计用于对程序设提供分解,抽象等的手段。在撰写代码规格的时候,需要对组成部件进行抽象。

在1960s,软件设计出现危机,例如Dijkstra提出了goto语句的种种危害,引发了软件开发领域长期的论战,并且在这时候产生了结构化程序设计方法,例如Pascal语言在1970s占据有统治地位。

之后,随着计算机软件规模日渐庞大,结构化程序设计方法开始无法满足用户的需求,面向对象程序设计(OOP)应运而生。面向对象程序设计是一场重大的革命,提高了开发人员的效率,有效的控制了软件开发的复杂度,提高了软件的可维护性和可拓展性。

规格化设计是随着面向对象程序设计的火热而发展起来的,可以有效提高程序的规范性以及程序的模块化划分。这样使得程序设计的数据更加安全,软件的可维护性得到有效的提高。

2. 规格Bug

由于我觉得JSF意义寥寥,没有认证对待,又或是我欧气不足,每次都被报了很多规格相关的bug

作业次数 Bug分类 具体原因
9 不符合JSF规范 JSF必须以/**开头,这个我没有注意
9 Modifies不完整 使用了较明显的自然语言
9 Requires不完整 前置条件必须为布尔表达式
10 Effects逻辑错误 \result == true了,不知道自己是怎么想的
10 Effects不完整 EFFECTS中的内容与Modifies重合
10 Requires逻辑错误 这个是因为修改了方法却忘了改规格,应该diff一下的
10 不符合JSF规范 Modifies应该只列出被修改的对象
11 Requires逻辑错误 Requires使用了自然语言
11 Effects不完整 Modifes中修改了this,但是没有在Effects中写出

3. Bug产生原因

  1. 第九次作业时,没有认真看JSF的说明,也很随意的使用了自然语言。
  2. 第十次作业时,首先这次作业出现了修改了代码但是忘记修改规格的问题,另外对Modifies和Effects的功能区别没有搞很清楚。
  3. 第十一次作业时,除了一点小错误,还是没有把Modifies和Effects的功能区别搞很清楚。

4. 不好写法举例

改进前:

/* @REQUIRES: None/* @
 * @MODIFIES: All that below... Sorry I won't copy it again :)
 * @EFFECTS: Call: gui.SetTaxiStatus()
 */

改进后:

/* @REQUIRES: None/* @
 * @MODIFIES: this
 * @EFFECTS: this != \old(this)
 */

改进前:

/* @REQUIRES: currentRequest is not null;
              state is ORDERED or SERVING;
              destination is not null;
              currentPoint is in roadMap.mapPoints[][];
 * @MODIFIES: state if destination is reached;
 *           currentPoint;
 *           gui
 * @EFFECTS: gui is updated
 */

改进后:

/* @REQUIRES: currentRequest != null;
              state == ORDERED || state == SERVING;
              destination != null;
 * @MODIFIES: state; currentPoint; gui
 * @EFFECTS: gui != \old(gui) && state != \old(state)
 */

改进前:

 private void finishRequest() {
    /**@REQUIRES: None
     * @MODIFIES: \this.currentRequest;
     *      \this.state;
     *      \this.destination;
     *      \this.startWaitingTime;
     * @EFFECTS: None
     */
  }

改进后:

 private void finishRequest() {
    /**@REQUIRES: None
     * @MODIFIES: this
     * @EFFECTS:  this != \old(this)
     */
    currentRequest = null;
    state = CarState.WAITING;
    destination = null;
    totalWaitingTime = 0;
  }

改进前:

synchronized private void moveRandom() throws InterruptedException {
    /**@REQUIRES: currentPoint in roadMap.mapPoints[][]
     * @MODIFIES: currentPoint;
     *            gui
     * @EFFECTS:  gui != \old(gui)
     */

改进后:

synchronized private void moveRandom() throws InterruptedException {
    /**@REQUIRES: \exist int r, c; 0 <= r < 80 && 0 <= c < 80 && RoadMap[r1][c1] == source &&
                   RoadMap[r2][c2] == destination;
     * @MODIFIES: currentPoint;
     *            gui
     * @EFFECTS:  gui != \old(gui)
     */

功能bug

第九次作业:

方法名 功能bug 规格bug
Car.update 1 0
CarsController.assignRequest 1 0

第十次作业:

方法名 功能bug 规格bug
RoadMap.addFlow 1 0

第十一作业:
| 方法名 | 功能bug | 规格bug |
| ---------------------------- | ------- | ------- |
| Car:update | 1 | 0 |

心得体会

要求用布尔语言来写规格实在有些不靠谱,毕竟做的不是数据结构题,很多函数用布尔表达式很难说清。如果真的想要完全说好,最后的规格可能比代码还要长。

收获大概是注释确实很重要,但还是表达清楚意思最为重要,不要拘泥与形式,当然这也可能是课程设计上为了互测做的不可避免的牺牲。

2018-北航-面向对象第三次OO作业分析与小结的更多相关文章

  1. 2018-北航-面向对象-前三次OO作业分析与小结

    基于度量的程序结构分析 由于平时使用了NetBrains出品的IDEA作为IDE,在分析程序的时候我使用了IDEA的插件Metrics Reloaded.然而在使用时发现不懂得很多分析项目的含义,因此 ...

  2. 【作业】HansBug的前三次OO作业分析与小结

    OO课程目前已经进行了三次的作业,容我在本文中做一点微小的工作. 第一次作业 第一次作业由于难度不大,所以笔者程序实际上写的也比较随意一些.(点击就送指导书~) 类图 程序的大致结构如下: 代码分析 ...

  3. 2018-北航-面向对象567次OO作业分析与小结

    设计策略及其变化 第五次作业-多线程电梯 在这次作业一开始的大部分时间,我一直想着怎样设计最为完美,完全使用BlockingQueue,导致交作业前发现设计并不能满足指导书的要求.最后仓皇之中加了一个 ...

  4. 【作业2.0】HansBug的5-7次OO作业分析与小结,以及一些个人体会

    不知不觉又做了三次作业,容我在本文胡言乱语几句2333. 第五次作业 第五次作业是前面的电梯作业的多线程版本,难度也有了一些提升.(点击就送指导书) 类图 程序的类图结构如下: UML时序图 程序的逻 ...

  5. 前三次OO作业总结

    一.作业总结 前三次的任务都是表达式求导.这是我在高中就思考过的问题,但是很久都没有付诸实践,直到学习了"类"这个强大的工具.还有正则表达式,如果能适当使用,则不失为一个字符串格式 ...

  6. 北航oo作业第一单元小结

    前言 在经过了三次艰辛的oo作业后,oo课程的第一单元告一段落,这一单元,我作为一个oo小白,开始了解oo的编程思想,也有了自己的一点心得体会.把笔粗成字,不当之处,还请各位大佬多多指教. 一.分析程 ...

  7. 前三次OO作业小结

    I used to be enamored of object-oriented programming. I'm now finding myself leaning toward believin ...

  8. 北航oo作业第二单元小结

    类的设计: 首先,我对我的思路进行整体的说明,由于我的三次作业,思路是继承的,所以做总体的说明 第一,   Main类,Main类自身并没有功能,他的功能只是构造需要的电梯线程和输入线程. 其中,第三 ...

  9. CS231n 2016 通关 第三章-SVM 作业分析

    作业内容,完成作业便可熟悉如下内容: cell 1  设置绘图默认参数 # Run some setup code for this notebook. import random import nu ...

随机推荐

  1. JavaScript权威指南1.概述

    JavaScript: 1.面向对象.解释型(非编译型)的程序设计语言.一种脚本语言 2.松散类型语言.变量不必具有一个明确的类型.对象中的属性名可以映射为任意的属性值 3.原始数据类型:数字.字符串 ...

  2. hive学习4(hive的脚本执行)

    hive的脚本执行 hive -e "SQL" hvie -f file 实例 [root@spark1 ~]# hive -e "show tables" # ...

  3. 【bzoj】2733: [HNOI2012]永无乡

    Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...

  4. PHP生成缩略图的一个方法类(转)

    //使用如下类就可以生成图片缩略图 class resizeimage { //图片类型 var $type; //实际宽度 var $width; //实际高度 var $height; //改变后 ...

  5. python 同步与异步性能区别

    import gevent def task(pid): """ Some non-deterministic task """ geven ...

  6. ros 安装c++编译的可执行文件

    xxx为c++源文件名 install( TARGETS xxx ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} LIBRARY DESTI ...

  7. 《剑指offer》第十八题(删除链表中重复的结点)

    // 面试题18(二):删除链表中重复的结点 // 题目:在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重复 // 结点被删除之后,链表如图3.4(b)所示. #include &l ...

  8. 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分

    树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...

  9. Python -- Json 数据编码及解析

    Python  --  Json  数据编码及解析 Json 简单介绍 JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本 ...

  10. Python -- xlrd,xlwt,xlutils 读写同一个Excel

    最近开始学习python,想做做简单的自动化测试,需要读写excel,然后就找到了xlrd来读取Excel文件,使用xlwt来生成Excel文件(可以控制Excel中单元格的格式),需要注意的是,用x ...