调研:

       最早的程序设计是直接采用机器语言来编写的,或者使用二进制码来表示机器能够识别和执行的指令和数据。机器语言的优点在于速度快,缺点在于写起来实在是太困难了,编程效率低,可读性差,并且编写规模大的程序。之后逐渐产生了面向过程和面向对象的编程思想,来满足不同条件下的编程方式。1968年《GOTO有害论》这篇著名的论文发表后,引起了许多人的广泛关注,结构化思想逐渐进入人们的视野。之后在编程过程中,程序员越来越对已经产生的抽象水平不满,不足以满足他们对规模大的程序编写的需求,因此出现了一种语言机制,也就是规格化抽象,允许程序员在需要时构建自己的规格化设计方法。规格化抽象是将运行细节(即模块如何实现)抽象为用户所需求的行为(即模块做什么)。在规格化设计的基础上,各个模块表达得简明扼要,可读性强,规模大,耦合性好,因此越来越受到人们的重视。规格化是程序发展所必要的条件。

BUG分析:

        第九次作业:

BUG内容 BUG类型 BUG原因
map加载错误 crash 在loadfile的时候存取数组越界
出租车运行20s没有停1s error 在设置出租车行驶方式时疏忽
地图文件中有空格 crash 未处理异常情况
出租车运行一边的时间有可能超过500ms error  随机数设置错误

BUG产生原因:这次的BUG最主要的问题在于对新增的要求Loadfile的设计过于粗略,没有考虑到各种不合理的情况,在功能上的实现不完全,同时也没有花时间去debug,认为其不重要,这就是自食其果,然后导致了两个crash类型的bug,其实测试者很善良,如果再仔细一点,估计还会多很多的crash类BUG。同时由于上次没有发现这两个error的BUG,导致这次被测了出来。总而言之就是设计不够细致,同时没有花时间去debug。

        第十次作业:

BUG内容 BUG类型 BUG原因
没有选择流量最小的路径 error 在读取流量文件时存储出错
调度时间少于7.5s error 由于整体时间上升,但忘记设置调度时间了

BUG产生原因:这次的BUG蠢得让我无话可说,先说调度时间少于7.5s,由于之前改变了出租车行驶地图一条边的时间,从200ms增到了500ms,于是出租车调度时间从3s增加到了7.5s,但是我忘记改正这个地方了。不知道为什么上一次作业没给我测出来,然后一直错到了现在。很神秘。

        第十一次作业:

经过两次作业的痛定思痛,把前两次的bug全部de完了,并且这次作业是最后一次编程作业,因此格外用心,所以没有被挑出bug来,可以说结尾得还行了。

JSF的不足和改进:

        前置:

1. 大量使用None;(本人就喜欢这么干)

例如:方法public boolean judge(String filename)

改正前:@REQUIRES: None;

改正后:@REQUIRES: filename != null;

2. 缺乏类型描述

改正前:@REQUIRES: map.exist && map.bound <= 80;

改正后:  @REQUIRES: map.exist == true && map.bound <= 80;

3. 忽略范围限制

例如:方法public BFS(point E, point S)

改正前:@REQUIRES: E != null && S != null;

改正后:@REQUIRES: 0<= E.getx() <=79&&0<= E.gety() <=79 && 0<= S.getx() <=79&&0<= S.gety() <=79;

4. 多余的前置条件

改正前:@REQUIRES: num != null && num <= 80;

改正后:@REQUIRES: num <= 80;

        后置:

1. 使用自然语言(本人见过直接用中文的)

改正前:@REQUIRES: 如果a包含了b,则返回true;

改正后:  @REQUIRES: a.contains(b) ==> (/result == true);

2. 考虑得不周到,只写了一部分

改正前:@REQUIRES: a.contains(b);

改正后:@REQUIRES: a.contains(b) && a.size() = a.size() - 1;

3. 使用了错误的伪布尔式子

改正前:@REQUIRES: flow.add;

改正后:@REQUIRES: flow.add == true;

目前遇到的,并且也只能想到以上几点前置条件和后置条件容易出错的地方。其实使用自然语言是可以的,但是不能大量使用,还是应当使用布尔表达式来表示。其实感觉JSF的撰写还是十分的有必要的,在debug的时候,JSF能够起到很好的预览作用,可以大致判断出bug出现的位置。第一次写可能会出错或者不适应,到后来就发现了JSF的实用之处。

感想和体会

本人在完成作业时,是把整个程序的功能都完成后,再回头去写JSF的规格设计,然后发现对于代码量庞大的方法,需要花大量时间去回忆这个部分的功能和作用才能完成JSF的撰写。而且再debug阶段也很花费时间和精力。因此规格应当是在方法撰写之前就开始设计,同时在代码中就应当按照规格来完成方法。这样不仅在设计时不需要花费大量时间去处理,在debug时也能更快的找到问题出现的位置。OO的编程作业终于完结了,撒花撒花。

OO第三阶段作业总结的更多相关文章

  1. OO前三次作业思考(第一次OO——Blog)

    OO前三次作业总结 基于度量分析程序结构 由于三次作业较多,决定分析内容.功能最为复杂的第三次作业. 上图为第三次作业的类图.我使用了一个抽象类Factor,写了五个因子继承Factor,然后又单独开 ...

  2. OO第三单元作业总结

    OO第三单元作业总结--JML 第三单元的主题是JML规格的学习,其中的三次作业也是围绕JML规格的实现所展开的(虽然感觉作业中最难的还是如何正确适用数据结构以及如何正确地对于时间复杂度进行优化). ...

  3. 【OO学习】OO第三单元作业总结

    [OO学习]OO第三单元作业总结 第三单元,我们学习了JML语言,用来进行形式化设计.本单元包括三次作业,通过给定的JML来实行了一个对路径的管理系统,最后完成了一个地铁系统,来管理不同的线路,求得关 ...

  4. OO第三单元作业——魔教规格

    OO第三单元作业--魔教规格 JML的理论基础和相关工具   JML(Java Modeling Language,Java建模语言),在Java代码种增加了一些符号,这些符号用来标志一个方法是干什么 ...

  5. OO第三单元作业(JML)总结

    OO第三单元作业(JML)总结 目录 OO第三单元作业(JML)总结 JML语言知识梳理 使用jml的目的 jml注释结构 jml表达式 方法规格 类型规格 SMT Solver 部署JMLUnitN ...

  6. OO前三次作业分析

    一,第一次作业分析 度量分析: 第一次的oo作业按照常理来说是不应该有这么多的圈复杂度,但是由于第一次写的时候,完全不了解java的相关知识,按照c语言的方式来写,完全的根据指导书的逻辑,先写好了正确 ...

  7. OO前三次作业简单总结

    随着几周的进行,OO课堂已经经历过三次课下作业.在这三次作业中,我被扣了一些分数,也发现了自己几次作业中一些存在的共同的问题. 首先以第三次作业为例分析,我程序的类图如下 一共九个类,其中Als_sc ...

  8. oo第三次作业--jml

    1.首先我们应该了解什么是jml,jml是java modeling language的缩写,是一种为java规格化设计的标识语言,简单来说,就是描述“干什么”的标准语言(跟注释差不多,但是是标准化注 ...

  9. java第三阶段作业总结

    Java第三阶段总结 前言 到这里,Java课程学习进入了尾声,在这学习过程中,我学习到很多,也发现了自己的很多不足,这篇博客主要针对的是Java整门课程学习的总结. 课程收获 对整门课程的学习,我有 ...

随机推荐

  1. BI之报表测试总结

    报表测试总结: 1.测试准备工作: 数据准备 保证足够多的有效数据 清楚报表中涉及到的算法.公式 清楚业务功能接口 2.报表测试点 基本测试点:界面.控件.格式.布局.明显的数据错误.js报错.报表标 ...

  2. zabbix 监控机器监听的端口 + 触发器 表达式理解

    在zabbix web 页面配置item,监控监听的21端口 配置trigger 参考:http://www.cnblogs.com/saneri/p/6126786.html 5. {www.zab ...

  3. 文本处理三剑客之 grep/egrep

    grep:文本过滤工具 支持BRE egrep: 支持ERE fgrep: 不支持正则 作用:根据用户指定的“模式”,对目标文本逐行进行匹配检查,打印匹配到的行 模式:由正则表达式字符及文本字符所编写 ...

  4. K8S学习心得 == 安装虚拟路由器RouterOS

    使用RouterOS, 搭建虚拟路由器,并且配置多个网关互通.配置步骤如下.   基础配置 1. RouterOS 服务器,设置如下             2. VM 不同网段的设置 == 192. ...

  5. Delphi的idhttp报IOHandler value is not valid错误的原因

    出现这种问题的原因是由于访问的 URL地址为https或存在其跳转地址为https. 首先单纯使用idhttp是只能访问http,而https则需要搭配IdSSLIOHandlerSocketOpen ...

  6. Linux环境下的多线程

    1. 按照POSIX 1003.1c 标准编写的程序与Linuxthread 库相链接即可支持Linux平台上的多线程,在程序中需包含头文件pthread. h,在编译链接时使用命令: gcc -D ...

  7. CF 1114 D. Flood Fill

    D. Flood Fill 链接 题意: 一个颜色序列,每个位置有一个颜色,选择一个起始位置,每次可以改变包含这个位置的颜色段,将这个颜色段修改为任意一个颜色, 问最少操作多少次.n<=5000 ...

  8. cjoj P1435 - 【模板题 USACO】AC自动机 && 洛谷 P3796 【模板】AC自动机(加强版)

    又打了一遍AC自动稽. 海星. 好像是第一次打trie图,很久以前就听闻这个思想了.OrzYYB~ // It is made by XZZ #include<cstdio> #inclu ...

  9. HTTPS为什么又快又安全?

    一.基础:对称加密和非对称加密 对称加密 通信两端用一样的密钥加解密.如DES.AES. 优点:性能损耗低,速度快: 缺点:密钥存在泄露的可能. 非对称加密 通信两端各自持有对方的公钥及自己的私钥,通 ...

  10. 自制刻度尺插件-前端简易实现"腾讯信用"界面

    依据我现有的知识,在前端上"简易"的实现了腾讯信用的界面,同时自己自制了一个竖直的刻度尺插件,曲线的位置可以根据传入的数值动态的改变,这次主要也想总结一下关于jQuery中exte ...