2018-北航-面向对象第三次OO作业分析与小结
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产生原因
- 第九次作业时,没有认真看JSF的说明,也很随意的使用了自然语言。
- 第十次作业时,首先这次作业出现了修改了代码但是忘记修改规格的问题,另外对Modifies和Effects的功能区别没有搞很清楚。
- 第十一次作业时,除了一点小错误,还是没有把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作业分析与小结的更多相关文章
- 2018-北航-面向对象-前三次OO作业分析与小结
基于度量的程序结构分析 由于平时使用了NetBrains出品的IDEA作为IDE,在分析程序的时候我使用了IDEA的插件Metrics Reloaded.然而在使用时发现不懂得很多分析项目的含义,因此 ...
- 【作业】HansBug的前三次OO作业分析与小结
OO课程目前已经进行了三次的作业,容我在本文中做一点微小的工作. 第一次作业 第一次作业由于难度不大,所以笔者程序实际上写的也比较随意一些.(点击就送指导书~) 类图 程序的大致结构如下: 代码分析 ...
- 2018-北航-面向对象567次OO作业分析与小结
设计策略及其变化 第五次作业-多线程电梯 在这次作业一开始的大部分时间,我一直想着怎样设计最为完美,完全使用BlockingQueue,导致交作业前发现设计并不能满足指导书的要求.最后仓皇之中加了一个 ...
- 【作业2.0】HansBug的5-7次OO作业分析与小结,以及一些个人体会
不知不觉又做了三次作业,容我在本文胡言乱语几句2333. 第五次作业 第五次作业是前面的电梯作业的多线程版本,难度也有了一些提升.(点击就送指导书) 类图 程序的类图结构如下: UML时序图 程序的逻 ...
- 前三次OO作业总结
一.作业总结 前三次的任务都是表达式求导.这是我在高中就思考过的问题,但是很久都没有付诸实践,直到学习了"类"这个强大的工具.还有正则表达式,如果能适当使用,则不失为一个字符串格式 ...
- 北航oo作业第一单元小结
前言 在经过了三次艰辛的oo作业后,oo课程的第一单元告一段落,这一单元,我作为一个oo小白,开始了解oo的编程思想,也有了自己的一点心得体会.把笔粗成字,不当之处,还请各位大佬多多指教. 一.分析程 ...
- 前三次OO作业小结
I used to be enamored of object-oriented programming. I'm now finding myself leaning toward believin ...
- 北航oo作业第二单元小结
类的设计: 首先,我对我的思路进行整体的说明,由于我的三次作业,思路是继承的,所以做总体的说明 第一, Main类,Main类自身并没有功能,他的功能只是构造需要的电梯线程和输入线程. 其中,第三 ...
- CS231n 2016 通关 第三章-SVM 作业分析
作业内容,完成作业便可熟悉如下内容: cell 1 设置绘图默认参数 # Run some setup code for this notebook. import random import nu ...
随机推荐
- Linux rhel7 下MySQL5.7.18详细安装文档
Linux rhel7 下MySQL5.7.18详细安装文档 本文安装MySQL5.7使用的是vm虚拟机rhel7操作系统 ,ftp文件传输是FileZilla3.27,远程连接xssh5.0 1 登 ...
- [BZOJ3613][Heoi2014]南园满地堆轻絮 二分答案
Description 小 Z 是 ZRP(Zombies’ Republic of Poetry,僵尸诗歌共和国)的一名诗歌爱好者,最近 他研究起了诗词音律的问题. 在过去,诗词是需要编成曲子唱 ...
- Unity3D学习笔记(十四):Animation旧动画
animator(新动画系统):骨骼动画,骨骼驱动,格式化编辑,动画机图形化 animation(旧动画系统):物理系统,帧动画 一.如何建立动画文件 Animation Clip 手动添加动 ...
- 【Coursera】Fourth Week(1)
1994: year of the web (1)网景(Netscape)成立. (2)www conference 在CERN 举办. (3)www conference 在芝加哥举办. (4)十月 ...
- shell 关系运算符
关系运算符 关系运算符只支持数字,不支持字符串,除非字符串的值是数字. 下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20: 运算符 说明 举例 -eq 检测两个数是否相等,相等返 ...
- 棋盘覆盖问题(算法分析)(Java版)
1.问题描述: 在一个2k×2k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有种情形.因而对任何 k≥0,有4k种不 ...
- Java之美[从菜鸟到高手演变]系列之博文阅读导航
随着博文越来越多,为博客添加一个导航很有必要!本博客将相继开通Java.CloudFoundry.Linux.Ruby等专栏,都会设立目录,希望读者朋友们能更加方便的阅读! 在阅读的过程中有任何问题, ...
- Lua---执行
1.交互式: 2.脚本式(在命令行不要启动lua解释器,直接输): Testlua.lua 的内容: print("Hello World!")
- HTTP协议的请求与响应和CSS属性和定位
HTTP协议的请求与响应和CSS属性和定位 一.HTTP协议 1.1 HTTP定义 HTTP(Hypertext Transport Protocol),超文本传输协议. 一种详细规定了浏览器和web ...
- [Java代码] Java是自学好还是参加培训班好?
ava 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言. Java可运行于多个平台,如Windows, Mac OS,及其他多种UNIX版本的系统. 本教程给大家简单介 ...