一、 规格化设计的发展历史
高级语言的发展经历了从早期语言到结构化程序设计语言,从面向过程到非过程化程序语言的过程。相应地,软件的开发也由最初的个体手工作坊式的封闭式生产,发展为产业化、流水线式的工业化生产。
6 0年代中后期,软件越来越多,规模越来越大,而软件的生产基本上是人自为战,缺乏科学规范的系统规划与测试、评估标准,其恶果是大批耗费巨资建立起来的软件系统,由于含有错误而无法使用,甚至带来巨大损失,软件给人的感觉是越来越不可靠,以致几乎没有不出错的软件。这一切,极大地震动了计算机界,史称“软件危机”。人们认识到:大型程序的编制不同于写小程序,它应该是一项新的技术,应该像处理工程一样处理软件研制的全过程。程序的设计应易于保证正确性,也便于验证正确性。1 9 6 9年,提出了结构化程序设计方法,1 9 7 0年,第一个结构化程序设计语言—P a s c a l语言出现,标志着结构化程序设计时期的开始。
针对一个规格抽象的实现与针对其他规格抽象的实现无关,相互之间不会产生影响;当修改一个规格抽象的实现时,不需要对使用该抽象的其他任何规格抽象及其实现进行调整。所以规格化设计慢慢得到了人们的重视。
二、规格bug
序号 | bug类别 | 对应方法的代码行数 | 产生原因 |
1 | 未写JSF | 4 | 忘记写JSF |
2 | 未写JSF | 65 | 忘记写JSF |
三、 分别列举5个前置条件和5个后置条件的不好写法,并给出改进写法
例1.
修改前:
void jiedan(TaxiThread taxi)
{
/**
* @REQUIRES: None;
* @MODIFIES: this.jiedanlist;
* @EFFECTS: the given taxi is added to this.jiedanlist;
*/
jiedanlist.add(taxi);
}
修改后:
void jiedan(TaxiThread taxi)
{
/**
* @REQUIRES: None;
* @MODIFIES: this.jiedanlist;
* @EFFECTS: this.jiedanlist.size ==\old(this.jiedanlist).size+1
*&& this.jiedanlist.contains(taxi)==true
*/
jiedanlist.add(taxi);
}
例2.
修改前:
public TaxiThread(int num,TaxiGUI gui,int[][] map,List<Command> list,int[][] light)
{
/**
* @REQUIRES: None;
* @MODIFIES: this.num,this.gui,this.map,this.list;
* @EFFECTS: this.num==num,this.gui==gui,this.map==map,this.list==list;
*/
this.num=num;
this.gui=gui;
this.map=map;
this.list=list;
this.light=light;
}
修改后:
public TaxiThread(int num,TaxiGUI gui,int[][] map,List<Command> list,int[][] light)
{
/**
* @REQUIRES: (\all int num;0<=num<100);
* @MODIFIES: this.num,this.gui,this.map,this.list;
* @EFFECTS: this.num==num,this.gui==gui,this.map==map,this.list==list;
*/
this.num=num;
this.gui=gui;
this.map=map;
this.list=list;
this.light=light;
}
例3.
修改前:
public Command(Point src,Point dst,long time,String str)
{
/**
* @REQUIRES: None;
* @MODIFIES: this.src,this.dst,this.time,this.str;
* @EFFECTS :Set these variables to their initial values;
*/
this.src=src;
this.dst=dst;
this.time=time;
this.str=str;
}
修改后:
public Command(Point src,Point dst,long time,String str)
{
/**
* @REQUIRES: None;
* @MODIFIES: this.src,this.dst,this.time,this.str;
* @EFFECTS:this.src=src,this.time=time,this.str=str;
*/
this.src=src;
this.dst=dst;
this.time=time;
this.str=str;
}
例4.
修改前:
void setpoint(int n,int m)
{
/**
* @REQUIRES: None;
* @MODIFIES: this.pointx,this.pointy;
* @EFFECTS: this.pointx,this.pointy is set to be the given number;
*/
pointx=n;
pointy=m;
}
修改后:
void setpoint(int n,int m)
{
/**
* @REQUIRES: (\all int n;0<=n<80);
(\all int m;0<=m<80);
* @MODIFIES: this.pointx,this.pointy;
* @EFFECTS: this.pointx,this.pointy is set to be the given number;
*/
pointx=n;
pointy=m;
}
四、 按照作业分析被报的功能bug与规格bug在方法上的聚集关系
序号 | 方法名 | 功能bug数 | 规格bug数 |
1 | stata1 | 1 | 0 |
2 | Main | 1 | 0 |
3 | LightThread | 1 | 0 |
4 | getlight | 0 | 1 |
5 | cross | 0 | 1 |
6 | state2 | 1 | 0 |
7 | MapInfo | 1 | 0 |
功能bug与规格bug在方法上没有聚集关系。
五、 思路与体会
REQUIRES需要我们看传到方法里的参数有哪些限制条件;MODIFIES要查看这个方法里需要改变的变量;EFFECTS:对于需要修改的变量,观察它是如何变化的,从而得到它的布尔表达式。
这几次遇到的同学都挺善良的,但是有一次我测的那个同学很不友好,申诉的时候友好的交流都不行,上来第一句话就好像我欠了他多少钱,又不是说不给他改申诉,你好好说出自己的理由就行了呗,非得带着令人很不爽的语气交流。
这几次作业都比较简单,主要训练我们写JSF的能力。OO课程快结束了,还是学到了不少东西,行百里者半九十,剩下的几次好好加油哈!