架构设计
hw13
输入所有UML元素后,首先遍历查找类和接口,将它们存为MyClass
并通过boolean isInterface
区分,把对应id
和新建的对象存入字典idToClass
。再遍历属性,根据id
查找对应的类,将其设置为对应类的属性即可;同理设置先设置方法、再设置方法对应的参数,先设置关联关系、再遍历每个UmlAssociatedEnd找到对应的类。
类的关系中,继承、实现是单向的,关联是双向的。并且接口之间可以多继承,实现某个接口的同时也实现了它所有父接口;关联关系相当于将两个类形成的家族关联起来。如下图所示。
即本次作业中在MyUmlInteraction
中添加上述几类变量作为属性,根据初始化时的UML元素设置属性,进行后面的查询操作。
由于直接在查询之前,便设置好了所有实现关系和关联关系(包括继承关系带来的那些),需要全部归查找,强测直接超时CTLE。
代码架构的UML类图如下:
hw14
增加了顺序图和状态图,设计上和上一次差不多(示意图如下):
唯一不同的一点是,由于500行的代码风格要求,我把初始根据元素UmlElement
建立各类、设定其属性的工作,新建了一个类,只传回必要的属性给MyUmlInteraction
,包括顶层的MyInteraction
、MyStateMachine
,还有各种MyClass
hw15
这次作业由于是增加合法性检查,之前的代码架构基本不变。
但是又双叒叕超过规定行数了……
MyUmlInteraction
实际上是在做各种处理,包括初始化的建立类、属性、时间线、状态等等,以及对不同UML图的指令的执行。因此我根据这个逻辑上的划分,建立了setMyElement
的初始化类,针对类图、顺序图、状态图的3个指令处理handler
,在MyUmlInteraction
中调用它们即可,将逻辑内聚性高的封装起来,符合代码编写原则。
最后看起来就很庞大:
设计演进
第一单元(多项式计算):
还沉浸在面向过程的思维中,类只是莫得感情的存储表达式、项、因子的工具罢了(甚至第一次作业只有两个类:标准项和解析字符串)
为了性能分做了强行拆开所有括号再查找最佳合并同类项方式,大量使用递归,疯狂用时间换结果长度,代码写得很复杂,逻辑一团乱经常自己把自己绕进去,也没有使用设计模式的意识,用递归下降还是研讨课大佬分享之后才重构换的。
第二单元(电梯):
第五次作业的时候多线程理论知识不是很明白,模仿着课上实验的设计模式写,不管怎么说总算是有代码架构设计的意识了。
后来比较不同多线程实现方式,以及研讨课上学姐从”切蛋糕“讲起的各种设计,都很有启发性。
以及这个单元的不可复现bug十分要命,debug过程中也在不断改自己代码,让架构看起来更清晰更不容易出错。
第三单元(JML):
(第三单元好像没什么架构设计?都被JML框死了orz)
这个单元主要是通过根据JML编写代码的过程,提高代码的规范性吧,毕竟JML形式化语言是非常严谨的,参照着也能提高自己的代码编写严谨程度,以及练习更简洁的表达方式。
以及JML只是保证正确性,为了时间性能还得在算法上调整时间复杂度,以免发送CTLE的人间惨剧。
第四单元(UML):
比较自然地运用各种容器,编写类之间的关系(主要是聚合关系)
(其实感觉这个单元最大难度在弄明白自己要干什么…指导书写的好简洁)
测试演进
惭愧惭愧,我只有第一单元用Generex生成随机数据进行了自动化测试,后面望评测机而生畏,都没有进行自动化测试。
第三单元中接触了JUnit测试,觉得工程化测试方法在大的项目中十分有必要,后续学习中会继续探索研究测试方法。
课堂收获
①学习面向对象的思想,与C语言的面向过程编程相比较,体会多态、封装等在代码可重用性方面的优点
②初步接触多线程,与OS课程遥相呼应,深(can)刻(tong)意识到线程安全的重要性,了解多种多线程模式比较其优劣
③练习Java语言的运用,熟悉各类容器的使用和特点,习惯于面向对象的编程方式,注意提升时间复杂度的方式
④学习JML形式化语言,使得代码更加严谨,规范UML类图的使用(我以前一直不知道UML是形式化的,以为是示意图随便画)
⑤学习设计模式,了解”高内聚低耦合“、”组合聚合优先“等设计原则,有意识地优化代码结构
⑥在与checkstyle的互相折磨(bushi)中改善代码习惯
建议
①修复bug时,初始版本E1,提交修复了bug1的版本E2后,等待bug修复通过之前,新的提交版本git diff
判定都会是基于E1的,很多情况下只能等助教辛苦地批完才能改下一个bug(某bug多菜鸡泪目)
②每次作业强测后能下载自己的代码压缩包,能否在bug修复后更新该内容?本地出现误操作git版本混乱的时候,这个下载代码真的是救命了,但是没有更新忘了自己修复了哪些bug就很难受
③目前只有“查看上一次提交”,能否增加一个提交记录列表?或者直接下载log,txt之类的,这样会方便很多(尤其是多线程那种跑一次跑很久的,每次bug还不一样,还只能看到上一次锅了哪几个点)
④第三单元JML(其实UML也是)坑太多,没有测评机很难存活,但没有大佬那样的自学能力,写测评机又感觉无从下手,除了研讨课大佬同学分享之外,能不能在官方库放一些指引提升之类的?要是能做成pre或者train就更好了qwq