OO第三阶段作业总结
调研:
最早的程序设计是直接采用机器语言来编写的,或者使用二进制码来表示机器能够识别和执行的指令和数据。机器语言的优点在于速度快,缺点在于写起来实在是太困难了,编程效率低,可读性差,并且编写规模大的程序。之后逐渐产生了面向过程和面向对象的编程思想,来满足不同条件下的编程方式。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第三阶段作业总结的更多相关文章
- OO前三次作业思考(第一次OO——Blog)
OO前三次作业总结 基于度量分析程序结构 由于三次作业较多,决定分析内容.功能最为复杂的第三次作业. 上图为第三次作业的类图.我使用了一个抽象类Factor,写了五个因子继承Factor,然后又单独开 ...
- OO第三单元作业总结
OO第三单元作业总结--JML 第三单元的主题是JML规格的学习,其中的三次作业也是围绕JML规格的实现所展开的(虽然感觉作业中最难的还是如何正确适用数据结构以及如何正确地对于时间复杂度进行优化). ...
- 【OO学习】OO第三单元作业总结
[OO学习]OO第三单元作业总结 第三单元,我们学习了JML语言,用来进行形式化设计.本单元包括三次作业,通过给定的JML来实行了一个对路径的管理系统,最后完成了一个地铁系统,来管理不同的线路,求得关 ...
- OO第三单元作业——魔教规格
OO第三单元作业--魔教规格 JML的理论基础和相关工具 JML(Java Modeling Language,Java建模语言),在Java代码种增加了一些符号,这些符号用来标志一个方法是干什么 ...
- OO第三单元作业(JML)总结
OO第三单元作业(JML)总结 目录 OO第三单元作业(JML)总结 JML语言知识梳理 使用jml的目的 jml注释结构 jml表达式 方法规格 类型规格 SMT Solver 部署JMLUnitN ...
- OO前三次作业分析
一,第一次作业分析 度量分析: 第一次的oo作业按照常理来说是不应该有这么多的圈复杂度,但是由于第一次写的时候,完全不了解java的相关知识,按照c语言的方式来写,完全的根据指导书的逻辑,先写好了正确 ...
- OO前三次作业简单总结
随着几周的进行,OO课堂已经经历过三次课下作业.在这三次作业中,我被扣了一些分数,也发现了自己几次作业中一些存在的共同的问题. 首先以第三次作业为例分析,我程序的类图如下 一共九个类,其中Als_sc ...
- oo第三次作业--jml
1.首先我们应该了解什么是jml,jml是java modeling language的缩写,是一种为java规格化设计的标识语言,简单来说,就是描述“干什么”的标准语言(跟注释差不多,但是是标准化注 ...
- java第三阶段作业总结
Java第三阶段总结 前言 到这里,Java课程学习进入了尾声,在这学习过程中,我学习到很多,也发现了自己的很多不足,这篇博客主要针对的是Java整门课程学习的总结. 课程收获 对整门课程的学习,我有 ...
随机推荐
- 微服务系列实践 .NET CORE
从事这个行业转眼已经6年了,从当初刚毕业的在北京朝八晚十,从二环到五环,仍每天精力充沛的小愤青:再到深圳一点一滴的辛勤在软件行业的耕种,从当初单体应用架构到现在微服务架构的经历,回想起来自己的收获倒是 ...
- mysql/mariadb将选择查询的结果重新生成一张新表格
比如想要生成类似如下的表格 mysql> select student.*,sc.cno,course.cname,sc.grade,course.cpno,course.ccredit fro ...
- Vue+axios 实现http拦截及vue-router拦截
现如今,每个前端对于Vue都不会陌生,Vue框架是如今最流行的前端框架之一,其势头直追react.最近我用vue做了一个项目,下面便是我从中取得的一点收获. 基于现在用vue+webpack搭建项目的 ...
- HTML5 新增内容
1. 新增标签 音频 <audio> <source src=""/> </audio> 视频 <video> <source ...
- php数组 组合排列 笛卡尔积
function Descartes() { $t = func_get_args(); if (func_num_args() == 1) { return call_user_func_array ...
- python3爬虫-下载网易云音乐,评论
# -*- coding: utf-8 -*- ''' 16位随机字符的字符串 参数一 获取歌曲下载地址 "{"ids":"[1361348080]" ...
- Telnet模拟系统(Linux c)
第3章详细设计和实现 3.1相关技术 1)TCP编程,主要包括socket()函数.bind()函数.listen()函数.recv()函数.send()函数以及客户端的connect()函数. 2) ...
- linux下日语语言包安装
光盘挂载: mount /dev/cdrom /mnt/cdrom cd /mnt/cdrom/Server 以oel5.5为例: rpm -ivh fonts-japanese-0.20061016 ...
- 电子设备 Kindle如何删除书籍或漫画
需要在亚马逊的官方设置好国家: 再在这里就可以管理了 要在kindle的上方小齿轮那里设置(飞行模式右边): 同步kindle 这样就能管理了
- 数据结构与算法 —— 链表linked list(06)
回文链表 链接 请检查一个链表是否为回文链表. 进阶:你能在 O(n) 的时间和 O(1) 的额外空间中做到吗? 解题思路: 回文链表的特点就是对称. 把链表放到栈中去,利用栈的先进后出的规则,和原链 ...