调研:

       最早的程序设计是直接采用机器语言来编写的,或者使用二进制码来表示机器能够识别和执行的指令和数据。机器语言的优点在于速度快,缺点在于写起来实在是太困难了,编程效率低,可读性差,并且编写规模大的程序。之后逐渐产生了面向过程和面向对象的编程思想,来满足不同条件下的编程方式。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. (转)一次压测对nginx/tomcat配置的调整

    原文地址:还在寻找.... 一个web系统,前端使用nginx做为反向代理,处理https,并将请求转发给后端的tomcat服务. 压力测试工具选择了jmeter. 首先简单介绍一下jmeter. 它 ...

  2. [tensorflow源码分析] Conv2d卷积运算 (前向计算,反向梯度计算)

  3. Angular7教程-01-Angular开发环境配置

    本教程基于angular7(2018-11-04) 1. 安装node.js 下载地址: http://nodejs.cn/download/ 下载对应自己操作系统的版本安装即可. 2.安装 angu ...

  4. 洛谷P4245 【模板】MTT(任意模数NTT)

    题目背景 模板题,无背景 题目描述 给定 22 个多项式 F(x), G(x)F(x),G(x) ,请求出 F(x) * G(x)F(x)∗G(x) . 系数对 pp 取模,且不保证 pp 可以分解成 ...

  5. jQuery----each()方法

    jquery中有隐式迭代,不需要我们再次对某些元素进行操作.但是如果涉及到不同元素有不同操作,需要进行each遍历.本文利用10个li设置不同的透明度的案例,对each方法进行说明. 语法: $(元素 ...

  6. Linux服务-samba

    目录 1. samba简介 2. samba访问 Linux服务-samba 1. samba简介 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成. 在 ...

  7. vue实现菜单切换

    vue实现菜单切换,点击菜单导航切换不同的内容以及为当前点击的选项添加样式,或者组件. method里: css: html代码: <nav> <ul> <li> ...

  8. 使用MATLAB工具deploytool打包不成功的解决办法

    下面解决方法是来自百度贴吧一抹伊静的解决办法,很好用,非常感谢,现记录下来以便后续查看: 这个问题是2014a 需要破解:下载一个破解文件,原因是matlab未完全破解,2014a的破解办法:http ...

  9. win10安装OpenSSL及简单的使用

    学习IdentityServer过程中需要使用OpenSSL,OpenSSL是什么东西?百度百科的解释:在计算机网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信, ...

  10. JavaWeb基础—MySQL入门小结

    一.数据库概述 RDBMS:关系型数据库管理系统 == 管理员(manager)+仓库(database) 常见数据库:  Oracle(神喻):甲骨文 MySQL: 归于甲骨文旗下(高版本系统已经开 ...