OO第四单元博客

一.本单元架构设计

本单元主要内容为实现对UML图的解析和预处理,三次作业分别是对UML类图的分析、UML状态图和顺序图的分析和对UML的规范性验证。

1.第一次作业

作业目标:实现对UML类图的分析

作业架构:

在对类中元素读取时,我根据类中元素之间的树形关系进行了三轮循环防止出现类中元素已经出现但是类还没有出现的情况。

在implement的基础上,为了减少耦合度,便捷操作,我新建立了MyClass、MyOperation、MyInterface三个类,功能的实现都封装在这些类中,implement只是起到一个调用的作用。

在实现功能时,采用了记忆算法提高效率。

2.第二次作业

作业目标:实现对UML顺序图、状态图的分析

作业架构:

本次作业在第一次作业的基础上进行了增量扩展,将顺序图、状态图中的重要元素lifeline、statemachine单独成类,存储必要信息并作为树的一个节点,连接更低一层的元素。

3.第三次作业

作业目标:实现对UML一些规则的规范性验证

作业架构:

本次作业要求在解析UML图的基础上,对于UML的规则作进一步的验证。不需要新增添类,在原有的类中分别对规则进行检验即可,其中多个规则在读取过程中即可完成,但是R3R4只有在全部读完后才可进行并且其实现需要一定的思考,递归可以完成但是细节需要打磨,易出bug。

二.四个单元中架构设计思维及OO方法理解的演进

PRE

在pre时,由于之前从未接触过oo、代码量也不足,所以对于pre的任务没有什么自己的思考,基本是按照指导书的指导一步步完成,对于oo方法理解变化不大,对于java的用法有了进一步的了解。

Unit1

第一单元应该是oo四个单元中最艰难的一个单元,也是主要失分的一个单元。主要原因有两点:首先,对于java语言熟练度不够、对于oo思想了解不深;其次,对于oo课的学习方式不够了解,以为是单凭自己思考问题,忽视了实验课、训练的重要性。这些导致在第一单元我像无头苍蝇一样乱来,第一次作业完全没有oo思想,第二次作业只能重构,重构后的思路与训练的思路有些不同导致了架构不合理,使得任务的实现难度较大、bug很难修复,就像一个摇摇欲坠的房子,我只是一个裱糊匠,无法解决根本的问题,只能修修补补让房子勉强过关,所以第一单元的体验很差。

Unit2

不过吃一堑长一智,带着第一单元的经验,在第二单元时我对于架构设计思维和oo有了自己的理解。我先通过第一次的作业、助教的提醒各往年的三次作业大概弄清楚了接下来三次作业的主要可能内容,之后在第一次实现的时候就为之后的扩展做好了充足的预设,比如说采用工厂模式、单例模式而不是简单地建类实现功能。这为我之后两次作业提供了了极大的便利:不需要重构,只需要填充框架就可以。并且在学习的过过程中紧跟助教,一定先做完训练代码和实验再动手完成作业。由于架构清晰、逻辑分明,所以bug少而且容易发现,第二单元我逐渐找回了一些自信。

Unit3

很快来到了第三单元,这一单元比起前两单元更加简单,基本不需要思考只需要填充助教留好的空白即可,不需要架构思维和oo方法,比较需要对算法复杂度的控制,而且由于自己和身边同学搭建了评测机,所以这一单元过的比较愉快。

Unit4

本单元难度有所回调,难点在于对于UML图的理解,只要把握住UML图的树状结构来建模,实现的难度并不大,不过最后一次的R3R4给我带来了一些麻烦,由于刚考完试回家只剩了一天写所以用的算法不太好,逻辑不清晰,修修补补但还是担心,最后也是果然导致了一个bug。

本单元的另一难点是读清题意,题目到底想让我们干什么在自然语言的描述下确实不太易懂,需要向助教确认,与之前的JML形成鲜明对比,凸显了JML的一些优势。
可以感受到四个单元中前两单元对于架构和思想的要求较高,后两单元要求有了一定的降低:只需要能够把握住题目中呈现的基本架构就可以了。

三.四个单元中测试理解与实践的演进

Unit1

第一单元时,我怀着上一学期没有搭建评测机的遗憾想要搭建评测机,但只有第一次搭建了评测机,后两次只是进行了一些修补,没有完整搭建,一方面是时间不够,一方面是难度较大。没有了评测机只能手动测试,我手动测试的经验也很匮乏,不能抓住边缘数据评测,这就导致构造的数据不强,难以测出bug,往往程序已经千疮百孔,但是测试结果却安然无恙。

Unit2

本单元我在做了一定的思考后放弃了搭建评测机,原因是我觉得本单元评测机搭建难度较大,并且从第一单元中我积累了一些构建边界数据的心得,所以本单元我都是手动测试,最终强测基本没有bug,但是有一个基本的横向电梯问题被同学hack到了,而在自己评测时由于这个问题太简单我根本没有想着构造数据测试。

由此,我认为评测机是保证程序的基本功能没有问题,手动构造数据是保证程序的复杂功能没有问题。因为评测机是随机生成,特点是覆盖广,但是覆盖广就导致针对性不强;而手动构造数据是人主动思考边界后构造数据,所以针对性很强,但是由于混杂了人的主观情感判断,所以容易忽略一些基本情况,就比如说很少有人会测试1+1=2,但是会有很多人测试2**31+2**31

Unit3

带着Unit2的理解,我来到了Unit3,发现Unit3的情况更简单,测试指令固定结果内容顺序固定,所以果断选择了搭建评测机对拍,在和好朋友的一起努力下,基本没有bug。

Unit4

Unit4我第一次搭建了评测机,但是后两次由于烤漆的缘故没有优化,并且我发现由于测试的指令固定,所以可以采用人工构造数据的方法进行类似于单元测试的手段来一个个确认指令的合法性,所以也主要采用人工构造的方法。

四.课程收获

经过一个学期的学习,我收获满满,我感觉这才是国家精品课该有的样子手动@xxxx

首先是对于架构设计和oo方法的理解方面有了很大的提升,不得不说提升最大的单元是第一单元,虽然过程痛苦,但是确实可以很清楚地感受到水平的上升;其次是代码能力的提升,之前基本没有进行过这么多代码的书写,经过一个学期的训练后我可以感觉到我对于java这个语言不再感到害怕而是感到兴趣,每次代码也没有之前那么发愁。同时也对其他语言的学习有了思路和想法,比如说c语言,我总是害怕使用c语言进行os的开发,以前以为是别的原因,现在发现就是练得不够多。最后是和朋友的友情,测试对拍debug的过程中zxy、jbt、hhj、zjr等朋友对我的关心和帮助让我不断感受到鼓励和温暖,感谢你们。

五.建议

1.降低第一单元难度,将难度移到后面的单元

我个人认为第一单元是四个单元中难度最高的,如果把它的难度定为10,那么第二单元是8,第三单元是5,第四单元是6,将难度最高的单元放在刚开始似乎有些不太合理。希望可以把其难度下调一些,相应地为了保证总难度不变,可以适当上调后面单元难度,让同学们在第一单元成长之后再迎接挑战是不是更好一些呢。

2.第三单元可以加入更多的JML元素

第三单元是对JML的学习,不过JML语言的书写都留给了助教,学生主要进行的是算法训练(bushi)。虽然这样对于学生也挺好,难度不大,得分满满。不过我觉得如果想要提升学生对于JML语言的掌握和认识的话,可以试着在作业中加入一些JML的元素,比如把提交作业之前的小测改为JML的小卷,作业还是“算法训练”,这样子既没有增加评判的难度,又保证每位同学都练到了相应的JML知识。

3.研讨课职责可以再优化

研讨课的初衷非常好,为大家提供了一个自由交流的环境。但是如果一个小组的人都比较内向/想要摸鱼,那么很容易变成一个人/两个人自说自话,这不符合设置研讨课的目的。我觉得可以为每一小组设立一个组长,让组长来分配组员的职责,调动气氛,名正言顺地管理小组。只要组长选的恰当,一定会比无组织的状态要好不少。

posted @ 2022-06-29 14:50  Jack_rbkd  阅读(20)  评论(0编辑  收藏  举报