规格化设计的大致发展历史和为什么得到了人们 的重视:
规格化设计的发展历史网上资料也不多。规格化的存在使得代码有好的移植性。每个人有各自的写法,规格能告诉使用者关于代码整体上的思路,不去关注代码实现的具体细节。告诉别人如何使用,对于输入我如何处理。使得代码更好去移植使用。在程序发生错误时,能更加有效寻找问题出处,使得维护更加方便。
规格错误:
错误类别 | 代码行数 |
EFFECTS 不完整 | 42 |
不符合jsf规范 | 35 |
repOK不完整 | 11 |
规格产生bug原因:
很多时候养成的先写代码的习惯,没有好好的写规格,在写完代码后才补规格,最后对于一些方法忘写规格。
==被写成=。
前置条件的不好写法:
1:没有指定类型
* @REQUIRE:(x!=null && x.state==state.order)
修改:
* @REQUIRE:(x instanceof taxi && x!=null x.state==order)
2:自然语言
* @REQUIRE:(input taxi and taxi has already existed)
修改:
* @REQUIRE:(x instanceof taxi && taxi!=null && taxi_list.contain(x)==true)
3:== 写成 =
* @REQUIRE:(x instanceof taxi && x!=null x.state=order)
修改
* @REQUIRE:(x instanceof taxi && x!=null x.state==order)
后置条件的不好写法:
1:直接把实现写入规格
* @EFFECTS:(credit==credit+k);
修改:
* @EFFECTS:(credit==old(credit)+k);
2:没有异常处理
* @EFFECTS:norma_behavior(this.contain(a)==false => list.size == old(list.size+1) && list.contain(a) )
修改:
* @EFFECTS:norma_behavior(this.contain(a)==false => list.size == old(list.size+1) && list.contain(a) )
exception_behavior(throw ArgumentExistException)
3:使用自然语言
* @EFFECTS:return the position of taxi in taxi_list
修改:
* @EFFECTS:(\exist i;0<=i<taxi_list.size;taxi_list(i)==taxi=>\result==i)
功能bug、规格bug:
方法名: bfs
问题: 没有实现最小流量
功能bug:1
规格bug:0
方法名: Main
问题: try catch 在catch中的异常写为FileNotFoundException 导致不能catch 所有的exception 程序发生crash。
功能bug:1
规格bug:0
方法名:create_taxilist
问题:没有实现jsf
功能bug:0
规格bug:1
功能bug和规格bug 出现的地方 没有任何关系,只是实现的过程出现了错误,或者jsf 规格格式错误。
体会:
oo课程快要结束。后续的课程作业压力确实减轻。经过几次实验课,熟悉怎么用jsf去写内部实现。在写规格时,我们不能想着如何实现,规格是给人看的,如果自己不看代码能否根据自己的规格知道如何使用。
原文:https://www.cnblogs.com/cqblogs/p/9097867.html