第九到第十一次OO总结

规格设计化发展历史以及重视原因

对软件所应满足的要求,以可验证的方式作出完全、精确陈述的文件。“规格说明”一词与其他工业产品的“规格说明书”有相似的含义。不过,在软件领域中,它已成为一个特定的技术用语。软件产品与使用环境之间的关系,软件产品内部各组成部分之间的接口往往十分复杂,并且在发展过程中软件产品要经历多次变换,以各种不同形式出现于不同的阶段。因此,对软件的各组成部分之间、各发展阶段之间的接口关系应当规定得十分准确。软件规格说明须用某种语言书写。自然语言的陈述中常存在歧义性,易引起误解。因而,最好使用人工语言或者人工语言与自然语言的混合形式书写软件的规格说明。这种语言就叫作规格说明语言。大型软件的规格说明往往十分冗长,因而希望这种语言易于用计算机处理,以便能用机器检查软件规格说明中有无遗漏或自相矛盾的地方。软件规格说明的内容可根据不同场合的需要而有所侧重。

关于受到重视的原因,网上没有说的太清楚。就说一下自己在课上听到的和自己的一些理解吧。

首先是在于它的沟通和交流的作用,因为以后可能是很多人一起完成一个项目,所以能让别人看懂自己的代码非常重要,之所以不使用自然语言,可能就在于自然语言在某些地方不能很好的表达程序的内在逻辑与关系。所以大家就做了一个约定,使用某一种统一的方式,能够更清楚的表达其中的逻辑。

另一个方面,规格应该是在代码之前就已经写好了,应该依照规格里填写代码,所以在考虑实现方式的时候,会想到怎么才能把规格写好,养成这样一种逻辑思维之后,在某种程度上可以提高自己变成的效率与正确性。

对规格的理解大概就这些吧,上课老师说到,因为最后功能是一定会实现的,所以怎么样写好代码才是关键,我不得不说这句话真的有道理。(但是我真的太菜了)

每次作业规格所被报的方法及相关代码行数

规格bug产生原因

1.所需要完成的规格太多,没有太多时间与精力把

2.因为以前从来没接触过,很难适应

3.因为是实现了代码再去写规格,难免有疏漏

关于规格的改进

前置条件

1./**

* @REQUIRES: q.val==1;

* @MODIFIES : Reqlist.list,messageList,q;

* @EFFECTS :  if q is not same,add q to the Reqlist;

* @ THREAD_REQUIRES:None;

* @ THREAD_EFFECTS: \locked(Reqlist.add_req()),\locked(list);

*/

public synchronized void add_req(Req q)

应该写q!=null,因为虽然q.val==1已经保证q!=null但是,q.val==1也是应该由其他函数保证的

2.

/**

* @REQUIRES:0<=st.x<80,0<=st.y<80,0<=ed.x<80,0<=ed.y<80;

* @MODIFIES :D_flow;

* @EFFECTS :

* D_flow[st][ed]+=1; 

* D_flow[ed][st]+=1; 

*/

public void add_flow(Point st,Point ed)

同上,也写st!=null&&ed!=null

3.

/**

* @REQUIRES:0<=st.x<80,0<=st.y<80,0<=ed.x<80,0<=ed.y<80;

* @MODIFIES :D_flow;

* @EFFECTS :

* D_flow[st][ed]-=1; 

* D_flow[ed][st]-=1; 

*/

public void sub_flow(Point st,Point ed)

同上,也写st!=null&&ed!=null

4./**

* @REQUIRES:0<=stx<80,0<=sty<80,0<=edx<80,0<=edy<80;

* @MODIFIES :None;

* @EFFECTS :

* \result==>the flow between st and ed; 

*/

public int get_flow(int stx,int sty,int edx,int edy)

前置条件应该是布尔表达式,所以应该用&&连接而不是,

5./**

* @REQUIRES:0<=idx<80&&(flag==0||flag==1);

* @MODIFIES :light;

* @EFFECTS :

* light[idx]=flag; 

*/

public void add_light(int idx,int flag)

{

light[idx]=flag;

}

应该还加上一句light!=null

后置条件

1.

/**

* @REQUIRES:0<=idx<80;

* @MODIFIES :None

* @EFFECTS :

* \result==>light[idx]; 

*/

==>改为==

2.

/**

* @REQUIRES:0<=idx<80;

* @MODIFIES :light,gui,light_cycle,now_time;

* @EFFECTS :

* (\all i;0<=i<6400;light[i]==1)==>light[i]=rand.nextInt(2)+1;

* now_time==cycle_time==rand(500,1000);

* gui.set(i,status);

*/

不应该写成连等于,应该分开写

3.

/**

* @REQUIRES:len>0&&start>0&&end>0;

* @MODIFIES : None;

* @EFFECTS : \result==best point;

*/

这个地方best point指代不明确,应该向课上那样写出最短路的实现方法

4.

* @REQUIRES:None;

* @MODIFIES :None;

* @EFFECTS :

* (val==1&&st!=null&&ed!==null)||val==0==>\result==true;

* else \result==false;

*/

可以以val的值来分val==1==>…

val==0==>

5.

/**

* @REQUIRES: None;

* @MODIFIES : this.time;

* @EFFECTS :  this.time=SYS.time;

*/

直接写time=System.currentTimeMillis();就好了

这次的bug统计

思路与体会

关于写规格这件事吧,还是从写代码之前就开始构思就好了,自己自己心里会有一个底。写规格也是一件比较困难的事(是真的很麻烦),自己还得多多的学习吧。但其实,现在自己最主要的问题还是在功能的实现方面吧,因为这几次作业被别人找出来的bug太多了,自己还是需要在程序细枝末节的地方下点功夫才行。希望自己以后能少写点bug吧,就这样吧。(ง •̀_•́)ง

猜你喜欢

转载自www.cnblogs.com/im73/p/9108820.html