一、规格化设计发展历史

在上世纪60年代,由于程序猿们难以忍受超级难懂的机器语言和稍微好懂一点点的汇编语言,便发明了结构化的程序语言,使得程序猿们能愉快地编写复杂程度适中的程序。但是需求是在不断增长的,渐渐地程序复杂度上涨得超过了人们的想象,使用结构化的程序语言也会无法控制。这时,面向对象的程序设计方法便应运而生。但是人和人写代码的习惯是不一样的,干脆用一套规格化的框架来写出代码大致功能,让不同的人都能看的舒服。正是如此,程序规格化设计越来越被人们重视,其对于代码编写的规范能够让程序变得更加易懂,能让使用者更加轻松简单的学会如何正确使用这段程序。此外,通过规格的抽象和总结,使用者能够直接使用这段程序而免去浪费大量时间来看懂代码的痛苦过程。更重要的是,代码的维护变得更加简单。其一,按我自身的经历,程序中隐藏的逻辑错误比如括号位置写错或者其他有关优先级的bug,在找到相应错误方法后能够非常轻松的通过抽象出来的规格判断代码具体错误位置。其二,在真正的做项目开发时,规格化设计能够方便整个团队的开发,因其能够统一规范每个人的编写方式,能使分工更加细致,使团队之间更加协调。

二、规格bug

三、规格bug分析

对于EFFCTS里面的错误我认为主要的原因是自己对于jsf的书写规范还是理解的不够深,所以使得虽然自己知道逻辑是怎样的但是表达出来不符合规范,所以造成了逻辑的错误以及书写上面的不规范。而对于MODIFIES和REQUIRES上面的问题,主要是因为自己写的有些着急,所以一些变量没有注意到,因为程序和jsf是分开写的,所以一旦没有看仔细,就会出现漏过一些变量的情况

四、不好写的写法和改进

1.

/**
* @REQUIRES: None
* @MODIFIES: None
* @EFFECTS: (\all int i; 0<=i<=r.taxis.size())==>\result.contains(MIN(r.taxis.get(i).pathlength))
*/

 没有考虑输入指向空的情况,因此这部分JSF的前置条件写的不完整。

 改进如下

/**
* @REQUIRES: r!=null
* @MODIFIES: None
* @EFFECTS: (\all int i; 0<=i<r.taxis.size) && (\exists int j; 0<=j<r.taxis.size && r.taxis[j].credit>=r.taxis[i])
* ==>\result.contains(j)==true
*/

2.

/**

@REQUIRES: x!=null;

@MODIFIES: queue;

@EFFECTS:

*queue.contains(x);

这个函数是把请求x加入到队列中,在这里还需要对请求的类别进行判断,即只把乘客请求加入到队列中,不用管开关路请求

改进如下:

/**

@REQUIRES: (x!=null)&&(x.gettype()==0);

@MODIFIES: queue;

@EFFECTS:

*queue.contains(x);

3.

/**@REQUIRES:None
* @MODIFIES:None
*@EFFECTS:获得start_x的值,起点的x坐标
*/

运用自然语言

改进如下:

/**@REQUIRES:None
* @MODIFIES:None
*@EFFECTS:\result==>start_x
*/

4、

 /**@REQUIRES:

 *@MODIFIES: 
 *@EFFECTS:q!=null

 *@THREAD_REQUIRES:
 *@THREAD_EFFECTS:
 */

直接使用源代码

改进如下:

        /**@REQUIRES: 
        *@MODIFIES: 
     *@EFFECTS:(q!=null)==>\result=true

            otherwise==>\result=false;

     *@THREAD_REQUIRES:
     *@THREAD_EFFECTS:
     */

5、

 /** @REQUIRES: r范围为0-300

*@MODIFIES: this
*@EFFECTS:  this!=null

*@THREAD_REQUIRES:
*@THREAD_EFFECTS:
*/

前置条件必须为布尔表达式

改进如下:

/** @REQUIRES: 0<=r<300
*@MODIFIES: this
*@EFFECTS: this!=null
*@THREAD_REQUIRES:
*@THREAD_EFFECTS:
*/

 

五、分析被报的功能bug与规格bug在方法上的聚集关系

感觉主要问题在于对jsf的了解不够透彻,指导书给的例子太少了,然后自己遇到一些情况就会不知道标准的正确结果。所以写的时候心里也没有底,所以才会有这些规格bug

六、心得体会

感觉上自己对jsf还是有些不重视,因为没有办法知道jsf的正确和错误吧,要是写的时候能有办法知道自己写的正确或者错误(类似java里的书写错误直接提醒?),可能就会好一点,感觉自己还是对指导书的理解不够透彻吧。不管怎么说还是自己的理解有问题给了别人可乘之机,被扣得分数也都心服口服,不过也算知道了jsf的作用和重要性吧,希望以后能写的更好

oo第12次作业的更多相关文章

  1. OO第一次博客作业

    OO第一次博客作业 一.三次作业的bug反省 1.自己发现别人的问题 (1)输入处理的问题,比如第一次作业,主要就是处理输入的字符串,然后有同学的正则表达式有问题,则对于一些错误输入就不能正确判断. ...

  2. oo 第一次博客作业

    oo 第一次博客作业 早在大一就听说了oo的各种传奇故事,大二下学期终于也开始了我的oo之旅. 基于度量来分析自己的程序结构 第一次作业 类图分析 耦合度分析 可以看出在第一次作业中,我的耦合度非常高 ...

  3. oo第八次作业

    oo第八次作业 第五次作业分析: 1.度量图: 2.类图: 第五次作业由于是第一次接触多线程,所以导致自己的经验不足,因此最终也没有完成作业,到最后任然不能实现三部电梯的有效调度,所以导致了这次作业的 ...

  4. 面向对象OO第15次作业总结

    面向对象OO第15次作业总结 1.论述测试与正确性论证的效果差异,比较其优缺点测试通过大量测试数据来覆盖测试代码,比较直观,优点在于知道测的是啥,特别直观,缺点在于很难覆盖所有情况.正确性论证从逻辑关 ...

  5. 面向对象OO第9-11次作业总结

    面向对象OO第9-11次作业总结 1.关于规格化设计的调研程序规格说明:对程序所应满足的要求,以可验证的方式作出完全.精确陈述的文件.“规格说明”一词与其他工业产品的“规格说明书”有相似的含义.不过, ...

  6. 面向对象OO第5-7次作业总结

    面向对象OO第5-7次作业总结 学习OO七周了,深切的感受到了这门课程的不友好.前三次作业能够算是勉强地通过了,但是从第五次作业开始就完全GG了.这三次作业,从多线程电梯开始,然后文件监控,然后到出租 ...

  7. 面向对象OO第1-3次作业总结

    面向对象OO第1-3次作业总结 学习OO已经四周了,对OO以及JAVA的编程也算终于了解了一丢丢.现在做完了三次的编程作业,对前三次的作业做一次总结. 第一次作业 ------------------ ...

  8. day 12 课后作业

    # -*- coding: utf-8 -*-# @Time : 2019/1/4 20:49# @Author : Endless-cloud# @Site : # @File : day 12 课 ...

  9. Week12《java程序设计》第12次作业总结

    Week12<java程序设计>第12次作业总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 ...

随机推荐

  1. python列表中的pop函数

    再python的列表中,有许多的内置方法,而在这里我主要向大家介绍一下pop函数. pop函数主要是用于删除列表中的数据.而其删除值时会返回删除的值.如果没有参数传入时, 则会默认认为删除列表的最后一 ...

  2. Python第5天

    今日学习的主要内容: 数据类型和变量的总结:(可变:列表,字典)(不可变:字符串,数字,元组) 引出集合概念:不同元素,无序,不可变类型 set方法—>集合 add添加:clear清空:pop删 ...

  3. django之关联field 描述子是如何实现的

    model定义时,每个field都是一个类属性,一个对象.在生成类时,属性有contribute_to_class的方法,会调用该方法. m2m field,它会先调用自己的contribute_to ...

  4. 服务器硬盘--SAS盘和SATA盘

    一.SAS和SATA SATA: Serial Advanced Technology Attachment,又叫串口硬盘,是将主机总线适配器连接到硬盘的总线接口. SAS: Serial Attac ...

  5. 不学无术的下场——OO第一单元总结

    第一单元OO作业总结 第一次作业 ​ 第一次作业的要求是对仅有常数和幂函数的式子进行求导. ​ 由于是第一次接触JAVA,对很多东西都还不熟悉,尤其是正则表达式做得不好.当时我的思路如下: 建立Pol ...

  6. Java虚拟机对象存活标记及垃圾收集算法解析

    一.对象存活标记 1. 引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1:当引用失效时,计数器就减1:任何时刻计数器都为0的对象就是不可能再被使用的. 引用计数算法(Re ...

  7. UE4C++定义属性修饰符总结

    1.BlueprintAssignable  暴露该属性来在蓝图中进行赋值,用于绑定多播委托 2.BlueprintCallable  用于从蓝图中调用C++原生函数 3.BlueprintReadO ...

  8. 2018/12/22:centos中转换目录时/root的影响

    今天在将一个压缩包复制到/root下,并解压.从表面看我试在根目录下,但是就是不能进入生成的目录,提示no such file or diraction.最后我加上/root又好了,奇怪 编译环境:输 ...

  9. UniRX简述

    UniRX:是一个Unit3D的编程框架,专注于解决异步逻辑,使得异步逻辑的实现更加简单优雅. 例如:实现“只处理第一次鼠标点击事件”: Observable.EveryUpdate() .Where ...

  10. MySQL实现批量检查表并进行repair与optimize的方法

    这篇文章主要介绍了MySQL实现批量检查表并进行repair与optimize的方法,结合实例形式分析了MySQL批量修复与优化表的相关技巧,需要的朋友可以参考下 本文实例讲述了MySQL实现批量检查 ...