调研:

       最早的程序设计是直接采用机器语言来编写的,或者使用二进制码来表示机器能够识别和执行的指令和数据。机器语言的优点在于速度快,缺点在于写起来实在是太困难了,编程效率低,可读性差,并且编写规模大的程序。之后逐渐产生了面向过程和面向对象的编程思想,来满足不同条件下的编程方式。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. [图解tensorflow源码] [原创] Tensorflow 图解分析 (Session, Graph, Kernels, Devices)

    TF Prepare [图解tensorflow源码] 入门准备工作 [图解tensorflow源码] TF系统概述篇 Session篇 [图解tensorflow源码] Session::Run() ...

  2. 阿里云linux服务器打开端口号

    之前linux回滚了下,然后就连不上xshell和filezille了,后台安全配置哪里也都打开了端口号了,还是不行.然后我就想重启下ssh服务 ,执行service sshd restart 提示1 ...

  3. Nginx服务器的平滑启动、平缓停止、平滑升级

    注:Nginx服务在运行时,会保持一个主进程(master process)和一个或多个工作进程(worker process). 每一个进程都会有一个PID进程号,可以通过向主进程的PID进程号发送 ...

  4. noip2017普及题解

    https://www.luogu.org/problemnew/show/3954 https://www.luogu.org/problemnew/show/3955 https://www.lu ...

  5. java 循环中使用list时,出现list中全部加入了对象导致没有实现分组的解决方案

    清空list即可 public List fetchNmapSingleTaskWithDataList() { Map map = new HashMap<>(); List listN ...

  6. ssm 配置事务回滚

    参考:https://blog.csdn.net/Mint6/article/details/78363761 在 applicationContext.xml 中配置好了事务和数据源等必须要用到的配 ...

  7. JAVA StringUtils需要导入的包

    <!-- https://mvnrepository.com/artifact/commons-lang/commons-lang --> <dependency> <g ...

  8. JAVA的关键特性

    Java团队对设计Java时的关键考虑因素进行了总结,关键特性包含以下列表: 简单性 安全性 可移植性 面向对象 健壮性 多线程 体系结构中立 解释执行 高性能 分布式 动态性 简单性 Java的设计 ...

  9. java两年工作经验有什么经验

    这两年里,了解了完整项目的开发过程,知道如何快速入手一个完全没接触过的项目:譬如先了解数据库关系后,马上熟悉一个功能从前端到后端的实现过程,自己再写一个功 能,这样子就能马上上手开发项目,之后在慢慢了 ...

  10. ThreeJS实现波纹粒子效果

    今天我们来用ThreeJS的库实现一个波纹粒子效果,我们用到的ThreeJS的库有CanvasRenderer.js,OrbitControls.js,Projector.js,stats.min.j ...