一、总结第四单元两次作业的架构设计


1.1 第一次作业

类图如下:

为了突出类、接口、方法、属性、和参数之间的层次结构关系,我为 ClassInterfaceOperation 分别建立了三个专门的类来存储,ClassInterface 中包含下层的 OperationAttributeOperation 中包含 Parameter 。(由于这一次针对接口的操作较少,应该有的一些操作被我注释掉了。)

本来调整过后将计算的模块都下沉到了具体的类操作,但仍有构造函数需要的一些操作没有进行处理,加上大部分操作都是关于Class,导致这两个相关类仍显得有些臃肿。

1.2 第二次作业

类图如下:

相较第一次作业,根据第二次作业的要求,我多建立了两个类,MyStateMachineMyInteraction,类的详细内容如下:

主要操作仍然和上次一样,MyUmlGeneralInteraction 充当接口,具体计算下沉到MyStateMachineMyInteraction

二、在四个单元中架构设计及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第四次博客作业--第四单元总结及课程总结的更多相关文章

  1. OO第三次博客作业--第三单元总结

    一.JML 语言的理论基础及应用工具链 JML 是一种行为接口规格语言,提供了对方法和类型的规格定义手段.通过 JML 和其支持工具,不仅可以基于规格自动构造测试用例,并整合了 SMT Solver ...

  2. OO第四次博客作业!

    oo第四次博客作业 一.测试与正确性论证比较 测试只是单方面片面的证明对于当前的输入程序是正确的,测试只能证明程序有错误,不能说明程序是对的. 正确性论证是程序达到预期目的的一般性陈述,是通过规范化的 ...

  3. OO第三次博客作业——规格

    OO第三次博客作业——规格 一.调研结果: 规格的历史: 引自博文链接:http://blog.sina.com.cn/s/blog_473d5bba010001x9.html 传统科学的特点是发现世 ...

  4. OO第4次博客作业

    OO第4次博客作业 一.第4单元设计 第四单元主要围绕UML图的结构进行JAVA代码编写,对JAVA的层次结构进行更多的认识.个人认为编程操作在实质上与上一章的PathContainer有许多的相同之 ...

  5. [BUAA OO]第三次博客作业

    OO第三次博客作业 1. 规格化设计的发展 我认为,规格化设计主要源自于软件设计的两次危机.第一次是由于大量存在的goto语句,让当时被广泛应用的面向过程式的编程语言臃肿不堪,在逻辑性上与工程规模上鱼 ...

  6. OO第四次博客作业(第四单元作业及期末总结)

    (注意:本文写作顺序与作业要求不完全一致,但涵盖了作业的所有要求) 一学期的BUAA特色OO课程结束了. PART 1  我想先写我这一学期的感想 从第一单元满怀期待地写完多项式求值到最后看着60分不 ...

  7. OO第二次博客作业(第二单元总结)

    在我开始写这次博客作业的时候,窗外响起了希望之花,由此联想到乘坐自己写的电梯FROM-3-TO--1下楼洗澡,然后······ 开个玩笑,这么辣鸡的电梯肯定不会投入实际使用的,何况只是一次作业.还是从 ...

  8. OO第三次博客作业---透过代码看设计

    不得不说的JSF 经过前几次作业的煎熬.出租车的代码量不断地增多.而出租车问题在不断的完善,这也就牵涉到一个问题,那就是最初出租车程序的设计问题,如果一开始设计的就有问题的话,那么在后来的过程中就会遇 ...

  9. oo第四篇博客作业

    测试与正确性论证的效果差异及各自的优缺点: 测试针对一些典型的输入情况进行方法验证,可操作性更强,结果直观.但不能完全覆盖所有的输入情况. 正确性论证则是根据代码逻辑从所有的方面对方法进行论证,可操作 ...

随机推荐

  1. Robot Framework(10)- 使用资源文件

    如果你还想从头学起Robot Framework,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1770899.html 啥是资源文件 资 ...

  2. Identity角色管理一(准备工作)

    因角色管理需要有用户才能进行(需要将用户从角色中添加,删除)故角色管理代码依托用户管理 只需在Startup服务中添加角色管理即可完成 public void ConfigureServices(IS ...

  3. WinForm控件常用设置(转)

    本来想自己整理一份,但找到了一份挺全的,就直接用到直接找吧 A0 ---- 通用A1 ---- Form 类A2 ---- Control 类A3 ---- MessageBox 类A4 ---- B ...

  4. 掌握基于AOP事务管理

    一.手动管理和半自动工厂模式 二.AOP事务管理 1.表达式中,第一个※是返回值所有类型,service包下一个点意思是service包下的类,两个点意思是service包下的类和其子包下的类也包含, ...

  5. bean.xml配置数据源和读取配置文件配置数据源

    一.bean.xml配置数据源 bean.xml装配bean,依赖注入其属性的时候,对应实体类中属性一定要有set方法, 二.读取配置文件配置数据源 1.配置文件 bean.xml配置: classp ...

  6. Emit优化反射(属性的设置与获取)

    在频繁的通过反射来设置和获取属性的值时是比较耗时的,本章通过Emit技术优化反射来提高获取和设置属性值的效率 一.实现代码: /// <summary> /// 设置器委托 /// < ...

  7. 多线程run()方法是不能够被直接调用的

    操作系统线程的五种状态: 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于"可运行 ...

  8. Android View post 方法

    解析View.post方法.分析一下这个方法的流程. 说起post方法,我们很容易联想到Handler的post方法,都是接收一个Runnable对象.那么这两个方法有啥不同呢? Handler的po ...

  9. Jvm调优理论篇

    Jvm实战调优 OOM(Out Of Memory) 内存溢出错误 ps:由于Java虚拟机有许多实现,本文主要阐述的是OpenJDK的HotSpot虚拟机,JDK版本是8. 一.首先要明白造成OOM ...

  10. 第三方api接口

    做为一个软件测试工程师,你要学习接口测试,需要练习,那么就要有调用的api,可以参考以下的文章. 国内7款API供应平台功能对比及详细介绍 https://blog.csdn.net/ishxiao/ ...