规格化历史
规格化的出现源于统合各个厂商各有各的格式而产生出的问题。其优势在于可以对事物给出一个明确的标准,从而减小出错的几率。
规格Bug
| repOK有效信息不足 | 平均1行 |
| Effects不完整 | 平均20行 |
产生原因
主要原因是部分规格没有写完整,如 repOK 没有完整地考虑到所有的不变量,部分线程的 Effects 没有写出。
前置和后置条件的不好写法
前置条件
| 不好写法 | 好的写法 |
| a 有序 | for all i in [0,len(a)-1) ==> a[i]<=a[i+1] |
| b 属于 a | exist c in a ==> b == c |
| a.x != 0 | a != null && a.x != 0 |
| a==b | a != nulll && a == b |
| x<100 | 0<=x<100 |
后置条件
| 不好写法 | 好的写法 |
| 返回值有序 | for all i in [0,len( esult)-1) ==> esult[i]<= esult[i+1] |
| b 属于返回值 | exist c in esult ==> b == c |
| esult.x != 0 | esult != null && esult.x != 0 |
| esult==b | esult != nulll && a == b |
| esult<100 | 0<= esult<100 |
聚集关系
| 方法 | 功能bug | 规格bug |
| repOK() | 0 | 1 |
| 线程相关方法 | 0 | 1 |
| Taxi.wait() | 1 | 0 |
| Inputprocessor.process() | 1 | 0 |
体会
通过这三次作业,我体会到了规格的重要性,它就像是一个指引我们代码编写方向的航标,只要在一开始就设计好了规格,编写代码是一件再简单不过的事。而如果将这些步骤倒过来做,那么写代码时就容易无从下手,导致代码质量低下。