规格化设计的大致发展历史及重要性
自20世纪60年代末以来,许多学者开展了形式化技术的相关研究。形式化技术最早是从戴克斯特拉和霍尔(C.Hoare)在程序验证方面的工作和斯科特(D.S.Scott)以及其他学者在程序语义方面的工作发展起来的。现在,形式化技术已经成为计算机科学的一个重要分支和研究领域,其作用相当于传统工程设计(如计算流体动力学,CFD)在航空设计中的作用。近些年来,形式化技术的学术研究及其工业应用得到了长足的发展。研究人员建立了系统设计人员易于理解的规格概念和术语,以及有效应用这些术语和概念的形式化规格技术及语言,建立了功能更加强大和完善的模型验证和定理证明技术,并开发出了与之相应的从研究原型到商品化产品的支撑工具和环境。
为了得到高质量的软件,我们强烈地希望使用软件工程中最好的实践。软件中存在的缺陷至少会引起客户的愤怒,而在更坏的情况下可能会给客户的业务造成较大的破坏或者造成生命损失。因此,企业要采用最好的实践,使他们的软件过程变得成熟起来。形式方法是一种前沿技术,研究表明,这种技术非常有助于那些希望把软件产品的缺陷出现率减到最小的公司。
有证据显示,形式方法的使用减少了项目成本。例如,IBM的大型CICS事务处理项目的独立审核表明,9%的成本节约要归功于形式方法的使用。对T800型变换计算机的Inmos浮点单元的独立审核也证明,形式方法的使用估计可以减少12个月的测试时间。
有效的软件复用有助于提高软件开发的生产率,这在应用软件的快速开发中具有特殊的意义。形式方法在软件复用中也占有一席之地,因为它可提高部件正确性的置信度,并对某个部件的行为进行明确的形式描述。可以对部件进行广泛的测试,以便为部件的正确性提供更高的置信度。一个部件一般会在不同的环境中使用,而部件在某种条件下能正常运转并不能保证它在未来也能够成功运转,因为这个部件和其他部件或其他软件之间可能存在着潜在的不良相互作用。因此,我们希望部件的行为能够得到明确的规定和充分的了解,并对部件的构成进行形式分析,以确保风险最小化,并在最后得到高质量的软件。
规格bug统计
Bug类型 | 具体描述 | 代码行数 |
JSF不符合规范 | \this.id = id应该是\this.id == id | 4 |
Effects 逻辑错误 | exceptional_behavior()错误 | 37 |
Bug分析
JSF不符合规范:写构造方法的JSF时不动脑子,直接复制粘贴代码,把=没有改成==。
Effects 逻辑错误:exceptional_behavior()括号里填的应该是异常的类型,是指该方法可能抛出的异常,不是方法要catch住这个异常。没有理解exceptional_behavior。
改进
前置条件:
public synchronized int getwaitTime() { /** *@REQUIRES: None; *@MODIFIES: None; *@EFFECTS: \result == waitTime; *@THREAD_REQUIRES: \locked(this); *@THREAD_EFFECTS: \locked(); */ return waitTime; } ------------------------------------------------------------------------------------------- 改进: *@REQUIRES: (carList.get(i) exists);
public synchronized void change(int x,int y,int value){ /** *@REQUIRES:None; *@MODIFIES: None; *@EFFECTS: graph[x][y] = value; *@THREAD_REQUIRES: \locked(this); *@THREAD_EFFECTS: \locked(); */ graph[0][x][y] = value; } ------------------------------------------------------------------------------------------ 改进: *@REQUIRES: (graph[x][y] exists);
public synchronized void calpos(){ /** *@REQUIRES: None; *@MODIFIES: x,y; *@EFFECTS:x = position / N; * y = position % N; *@THREAD_REQUIRES: \locked(this); *@THREAD_EFFECTS: \locked(); */ x = position / N; y = position % N; } ------------------------------------------------------------------------------------------ 改进:*@REQUIRES: 0<=position<=6399;
public synchronized long waitTime(int lastdir,int direct){ /**@REQUIRES: None; *@MODIFIES: None; *@EFFECTS: (需要等待红绿灯) ==> \result == waitime; * (没有红绿灯或者不需要等待红绿灯) ==> \result == 0; *@THREAD_REQUIRES: \locked(this); *@THREAD_EFFECTS: \locked(); */ ------------------------------------------------------------------------------------------- 改进:*@REQUIRES: 0<=lastdir<=3&&0<=direct<=3
后置条件:
TaxiIterator(TaxiShare it,int req_id,int taxi_id){ /**@Requires: None; *@Modifies: this; *@Effects: * \this.taxi = it; * \this.length = it.spath[costumer].size(); * \this.cnt = -1; * \this.req_id = req_id; * \this.car_id = car_id; * \this.sign = 0; */ ------------------------------------------------------------------------------------------ 改进: *@Effects: * \this.taxi == it; * \this.length == it.spath[costumer].size(); * \this.cnt == -1; * \this.req_id == req_id; * \this.car_id == car_id; * \this.sign == 0; */
boolean judge(String str) { /** *@REQUIRES: None; *@MODIFIES: * \this.X; * \this.Y; * \this.type; *@EFFECTS: * normal_behavior * judge whether str is legal and parse type, X and Y; * (str.match) ==> \result == true; * (!str.match) ==> \result == false; * exception_behavior(Exception e) * System.out.println("System exploded!"); * \result == false; */ ------------------------------------------------------------------------------------------- 改进: *@EFFECTS: * normal_behavior * (str==NULL) ==>exception_behavior(MyException) * (str.match) ==> \result == true; * (!str.match) ==> \result == false; */
聚集关系
作业 |
功能Bug | 规格Bug | 是否有联系 |
第九次 | 出租车编号错误地设置为1-100 | 无 | 否 |
load file中taxi位置设置方法错误 | |||
第十次 | 无 | 无 | 否 |
第十一次 | 无 | JSF不符合规范 | 否 |
Effects 逻辑错误 |
感想
第九次作业是根据代码逻辑写规格,后两次我尝试先写规格再实现代码,可惜坚持了两个方法就放弃了,而且那两个方法实现以后和规格完全不一样。这三次作业我完全没体会到写规格给代码实现带来的好处,在根据要求写规格方面还需要多加练习。
给别人找bug的时候花点功夫想想他为什么错了,最好找出来解决的办法。这样子基本上不会被申诉。
佛系一点好,把时间都浪费在吵架上不如大家一起去看电影。。。