一、第四次作业架构设计
第四次作业整体来说未出现较为严重的问题,虽然一波三折,但也算稳稳收尾。
第四次作业以UML图为核心,借助官方解析库,将UML图中的信息提取出来反馈给评测机,整体架构与第三次作业(JML)大同小异。
1.1、第一次作业
要求实现MyUmlInteraction与Main类,其中MyUmlInteraction的构造方法带有参数UMLElement数组,该数组包含了所有Uml类图的信息。
在提交的版本中,由于设置了充分多的缓存,未像第三次作业一样,出现大规模的CTLE错误,稳稳的通过强测。
代码架构上,我选用树形结构,借助UMLElement中包含的信息,重建Uml类图中包含的类信息。构建MyClass、MyInterface、MyOperation、MyAssosiation等类,便于存储的同时也方便查询,接口中的函数实现起来更为简便。
1.2、第二次作业
要求实现MyUmlGeneralInteraction与Main类,其中MyUmlGeneralInteraction的构造方法带有参数UMLElement数组,该数组包含了所有Uml类图、顺序图、状态图的信息。
在提交的版本中,依然设置了充分多的缓存,未出现CTLE错误。
第二次作业与第一次作业相比,多出了状态图和顺序图的分析,同时还增加了全局检查的机制,若Uml图中存在规定的几种错误情况,则报错并直接退出程序。
个人认为UML第二次作业的查询指令并不困难,主要工作量在全局预检查上。由于笔者错误的处理Interface成环检查的广度优先搜索,导致强测中最后一个点漏报了一个错误。将循环体中的return修改为continue便通过了所有的评测。
二、四次作业OO方法理解演进
2.1、表达式求导
初步接触面向对象,本人整个作业的关注点更多的放在熟悉java语法、数据结构及正则表达式上,对OO的方法和技巧并未有太多的深刻研究。
2.2、多线程电梯
个人认为第二次作业是四次作业中,最纯粹的面向对象作业。电梯问题,三次作业中需求层层递进,每一次都是面向对象的一次升华。在一个需求逐步完整、任务逐渐繁复的工程中,利用OO解决问题、简化问题。将电梯和用户都看成对象,每个对象都管理着若干个属性,同时还拥有若干个方法,这些都是在先前其他课程中未曾有过的大胆尝试。并且在第二次作业的实现过程中,能够真真切切面向对象思想带来的便利。所以我认为,第二次作业是四次面向对象作业的巅峰。
2.3、JML作业
第三次作业与第二次作业相比,显得有些不知所云,课程组似乎将重心从面向对象的学习转移到了Java的进阶。这次作业的最大收获是HashSet与HashMap两个数据结构的熟练使用,相比于ArrayList,两者有性能上的明显提升。不知是课程组有意为之还是实在力不从心,第三次作业着实让笔者感觉更像是数据结构课程的要求,在没有点明的情况下对性能进行较为严苛的测试,让笔者有些摸不着头脑。
2.4、UML作业
第四次作业的重点放到了UML上,UML是一个很有必要掌握的知识,笔者在第四次作业中学习了解了Uml类图、状态图、顺序图这三个常见常用的图。
总的来看,前两次作业合情合理,也确实学到了很多面向对象的技巧和知识,但是后两次作业似乎偏离了面向对象的思想,从学习面向对象变成了科普Java进阶操作。
三、四次作业测试理解与实践演进
- 第一次作业未接触测试方法,采用最传统的编写脚本自动生成多项式进行测试
- 第二次电梯作业,由于需要模拟不同时间阶段到达的乘客,因此使用“按键精灵”写脚本进行模拟测试
- 第三单元JML作业,讨论区提供了JMLUnit和OpenJml等一系列工具进行使用,但实际使用过程中,用户体验并不理想,存在许多语法不支持、不兼容的现象
- 第四单元的测试用例基于UML图,不便于自动生成,故笔者选择自己绘制UML图,并借助控制台指令生成测试样例。
四、课程收获
- 从0基础到学会了Java语言的基本使用
- 面向对象的诸多特性和独特的架构方式
- 尝试编写脚本以自动生成测试样例
- 从传统单线程的程序到多线程电梯实验,感受到不一样的画风
- 利用工具链简化编程过程并降低调试难度
五、课程建议
- 整体实验设计不尽合理,前两次作业几乎占据了全部的学习内容,后两次作业似乎只是在练习Java语言的使用。
- 理论课与实验课没有直接的联系,笔者水平有限,自认为脱离理论课并不会影响实验课的进度。
- 不反对评测机对代码性能提要求,但是建议给学生一个测试自己代码性能的途径,本地运行结果和评测机运行时间有较大的差异,不具有参考价值。