OO第四次博客作业--第四单元总结及课程总结
一、总结第四单元两次作业的架构设计
1.1 第一次作业
类图如下:
为了突出类、接口、方法、属性、和参数之间的层次结构关系,我为 Class 和 Interface 和 Operation 分别建立了三个专门的类来存储,Class 和 Interface 中包含下层的 Operation 和 Attribute ,Operation 中包含 Parameter 。(由于这一次针对接口的操作较少,应该有的一些操作被我注释掉了。)
本来调整过后将计算的模块都下沉到了具体的类操作,但仍有构造函数需要的一些操作没有进行处理,加上大部分操作都是关于Class,导致这两个相关类仍显得有些臃肿。
1.2 第二次作业
类图如下:
相较第一次作业,根据第二次作业的要求,我多建立了两个类,MyStateMachine
和 MyInteraction
,类的详细内容如下:
主要操作仍然和上次一样,MyUmlGeneralInteraction
充当接口,具体计算下沉到MyStateMachine
和 MyInteraction
。
二、在四个单元中架构设计及OO方法理解的演进
2.1 第一单元
第一单元的作业是关于多项式求导的。
这是我第一次作业的类图,那时候刚开始学OO,写的代码除了符合 java 语法以外,纯粹就是C语言的结 构,想在尽量少的代码量下解决问题,却忽视了层次结构。
2.2 第二单元
第二单元的作业是电梯调度,要解决的问题主要是多线程中可能产生的冲突,是我认为最有趣的一个单元。
其中第三次作业的类图如下:
可以看出来,结构层次比第一单元的作业要清楚许多,各个类有各个类负责的功能,耦合没有第一次那么高了。(当然也是出于多线程安全的原因,不得不注意一些)
2.3 第三单元
第三单元的作业是关于 JML 语言的,前两次作业基本上都是关于图论,第三次作业具象化到地铁上了,
三次作业中架构的变化不大:
1. 第一次:完全按照官方接口建立。
其中 union
记录的是整个 container
中的不同的节点,每次 container
中的路径变化,更新一次 union
。
2. 第二次:第二次作业将第一次中的 MyPathContainer
部分方法复制到 MyGraph
中,然后根据接口添加了 新的方法,其他大致都没变。
3. 第三次:这一次作业比上一次添加了很多要求,且复杂度更高了,并且涉及到一些算法上的问题。
我使用的是讨论区大佬的不拆点的算法,用四个数组分别记录、完成四种功能,但其实都是基于最短路径 的,只是每种功能中路径的权不同而已。每次更新 Path
时需要更新四个数组,且做四次floyd 。但因为常 数较小,所以时间相对较短。
2.4 第四单元
见 一、总结第四单元两次作业的架构设计
。
三、在四个单元中测试理解与实践的演进
3.1 第一单元
第一单元主要针对一些错误格式和特殊数据进行测试。我的主要测试手段是在写代码的过程中构造一些错误的、特殊的数据,这样在写的过程中能更注意相关结构,写完了也可以用来测试,在互测阶段更可以当作武器。
3.2 第二单元
第二单元主要针对多线程可能出现的同步互斥方面的错误,要对临界资源进行保护、加锁,或者避免出现同时访问的情况。由于多线程的 Bug 难以复现,难以针对性地构造数据。主要策略是进行重复多次测试,相信总有一次能命中。
对于可能的超时问题,其实对于每个调度算法都是难以避免的,后两次作业又禁止了写多个调度算法然后输出最优的方法,所以只能祈祷将自己的调度做好,保证测试完全不出现线程安全问题。
3.3 第三单元
第三单元的作业相较前两次其实简单了不少,因为给出了方法规格,找对好的算法,然后照写就行,不用太顾虑结构层次的问题。
测试方面我使用了官方推荐的 JUnit ,虽然仍需要自己构造数据,但测试的流程更简单明了,测试的覆盖度也可以做到更高。
3.4 第四单元
第四单元的测试数据依赖构造一个类图(状态图、时序图),自己生成然后测试的效率较低,所以主要使用小黄鸭测试法,对每一个指令的功能仔细检查,肉眼debug。
四、课程收获
了解了测试的重要性。有两次作业都是由于对自己程序测试不充分甚至根本没有进行测试造成强测翻车,有时候往往查下来是一个愚蠢的错误,只需要改一行就能解决的,成绩却差了几十分。
了解了面向对象编程的一些设计模式,如工厂模式、观察者模式等,
虽然还没有机会付诸实践,但是了解了这些设计模式能帮助我在项目中读代码,能更好地理解别人的代码了。对 Java 语言有了更深层次的理解。从一刚开始写什么都像C语言,到现在能运用一些 Java语言的特性来写代码,可以说是真正学习了一门语言。
五、 立足于自己的体会给课程提三个具体改进建议
希望BUG修复中,对强测的BUG修复后也能恢复强测失去的分。作为强测翻过车的人,能深刻的体会到BUG修复阶段的绝望,往往一个小Bug在强测中爆炸,三分之一甚至以上的分就没了。强测Bug应该加入互质Bug的计算,尽量减少扣分。
老师上课的内容可以更简单,更贴近作业内容一些。老师的课讲得很好,但课程的内容总是感觉是站在了整个课程策划、设计者的角度,没有站在一个老师的角度。作为一个学生,有时会感觉课程内容较深入,甚至有些无聊。
作业内容可以更缩减一些,或者占用时间减短一些。回顾这一个学期,大概有一半甚至以上的学习时间都用在了 OO 上。每次作业的安排、每周循环往复周一到周五Bug修复、周五到周二公测然后互测……这样的时间安排表在老师、助教,在训练者的眼里堪称完美,但作为一个学生、一个被训练者,这样的时间安排让我有些烦躁,全是OO。
最后,要感谢老师助教这一个学期的辛勤劳动。了解了这门课程往年的制度,才能发现老师和助教一直都在为课程的改进而努力。相信 OO 能越来越好。
OO第四次博客作业--第四单元总结及课程总结的更多相关文章
- OO第三次博客作业--第三单元总结
一.JML 语言的理论基础及应用工具链 JML 是一种行为接口规格语言,提供了对方法和类型的规格定义手段.通过 JML 和其支持工具,不仅可以基于规格自动构造测试用例,并整合了 SMT Solver ...
- OO第四次博客作业!
oo第四次博客作业 一.测试与正确性论证比较 测试只是单方面片面的证明对于当前的输入程序是正确的,测试只能证明程序有错误,不能说明程序是对的. 正确性论证是程序达到预期目的的一般性陈述,是通过规范化的 ...
- OO第三次博客作业——规格
OO第三次博客作业——规格 一.调研结果: 规格的历史: 引自博文链接:http://blog.sina.com.cn/s/blog_473d5bba010001x9.html 传统科学的特点是发现世 ...
- OO第4次博客作业
OO第4次博客作业 一.第4单元设计 第四单元主要围绕UML图的结构进行JAVA代码编写,对JAVA的层次结构进行更多的认识.个人认为编程操作在实质上与上一章的PathContainer有许多的相同之 ...
- [BUAA OO]第三次博客作业
OO第三次博客作业 1. 规格化设计的发展 我认为,规格化设计主要源自于软件设计的两次危机.第一次是由于大量存在的goto语句,让当时被广泛应用的面向过程式的编程语言臃肿不堪,在逻辑性上与工程规模上鱼 ...
- OO第四次博客作业(第四单元作业及期末总结)
(注意:本文写作顺序与作业要求不完全一致,但涵盖了作业的所有要求) 一学期的BUAA特色OO课程结束了. PART 1 我想先写我这一学期的感想 从第一单元满怀期待地写完多项式求值到最后看着60分不 ...
- OO第二次博客作业(第二单元总结)
在我开始写这次博客作业的时候,窗外响起了希望之花,由此联想到乘坐自己写的电梯FROM-3-TO--1下楼洗澡,然后······ 开个玩笑,这么辣鸡的电梯肯定不会投入实际使用的,何况只是一次作业.还是从 ...
- OO第三次博客作业---透过代码看设计
不得不说的JSF 经过前几次作业的煎熬.出租车的代码量不断地增多.而出租车问题在不断的完善,这也就牵涉到一个问题,那就是最初出租车程序的设计问题,如果一开始设计的就有问题的话,那么在后来的过程中就会遇 ...
- oo第四篇博客作业
测试与正确性论证的效果差异及各自的优缺点: 测试针对一些典型的输入情况进行方法验证,可操作性更强,结果直观.但不能完全覆盖所有的输入情况. 正确性论证则是根据代码逻辑从所有的方面对方法进行论证,可操作 ...
随机推荐
- Linux常用命令 - rm命令详解
21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 删除/ ...
- openswan框架和编译时说明
刚开始学习openswan项目代码时,自己尝试了在虚拟机上编译.安装.运行openswan代码,由于当时刚开始学习openswan代码,因此对于其构成并不清楚,在编译.运行过程中有了问题,基本是通过百 ...
- LinkedList 添加元素源码解析
jdk版本:1.8 LinkedList添加元素有两个方法:add(E e)和add(int index,E e). add(E e) /** * Appends the specified elem ...
- 现在互联网好多bug 想到都烦
我接触计算机十多年了,只是在15年前发布一篇给计算机有关的技术文章,后来就在也不发表了,今天在163博客写个备录,,写到一半结果误 关了,,浪费了好几个小时,还以为像以前那样,又要重写,,这也是我不爱 ...
- PTA 面向对象程序设计 6-2 逆序字符串
6-2 逆序字符串 设计一个void类型的函数reverse_string,其功能是将一个给定的字符串逆序.例如,给定字符串为"hello",逆序后为"olleh&quo ...
- windows日志查看与清理
日志查看 (1) 启动Windows实验台,点击:开始 - 控制面板 - 管理工具 - 事件查看器. (2) 应用程序日志.安全日志.系统日志.DNS日志默认位置:%sys temroot%\syst ...
- flask_sqlalchemy 查询结果转dict 终极解决方案
之前为了学习Python,试着拿Flask作框架搞小网站,感觉还不错,基本就抛弃了PHP.前段时间做了一个微信小程序,想着yii框架拿来写几十个小接口是不是浪费了,就继续用flask写api了,哪想到 ...
- CF1251F-Red-White Fence【NTT】
前言 刚开始看错题推了半天的生成函数 正题 题目链接:https://www.luogu.com.cn/problem/CF1251F 题目大意 $n$个白色木板,$k$个红色木板,给出这些木板的高度 ...
- 软件测试工程师简历要怎么写,才能让HR看到
作为软件测试的从业者,面试或者被面试都是常有的事. 可是不管怎样,和简历有着理不清的关系,面试官要通过简历了解面试者的基本信息.过往经历等. 面试者希望通过简历把自己最好的一面体现给面试官,所以在这场 ...
- Xcode相关
Xcode相关的路径 Provisioning Profiles存放路径:~/Library/MobileDevice/Provisioning Profiles 所有模拟器(包括历史模拟器):~/L ...