面向对象课程第四单元及课程总结

架构设计

hw13

输入所有UML元素后,首先遍历查找类和接口,将它们存为MyClass并通过boolean isInterface区分,把对应id和新建的对象存入字典idToClass。再遍历属性,根据id查找对应的类,将其设置为对应类的属性即可;同理设置先设置方法、再设置方法对应的参数,先设置关联关系、再遍历每个UmlAssociatedEnd找到对应的类。

类的关系中,继承、实现是单向的,关联是双向的。并且接口之间可以多继承,实现某个接口的同时也实现了它所有父接口;关联关系相当于将两个类形成的家族关联起来。如下图所示。

面向对象课程第四单元及课程总结面向对象课程第四单元及课程总结

即本次作业中在MyUmlInteraction中添加上述几类变量作为属性,根据初始化时的UML元素设置属性,进行后面的查询操作。

由于直接在查询之前,便设置好了所有实现关系和关联关系(包括继承关系带来的那些),需要全部归查找,强测直接超时CTLE。

代码架构的UML类图如下:

面向对象课程第四单元及课程总结

hw14

增加了顺序图和状态图,设计上和上一次差不多(示意图如下):

面向对象课程第四单元及课程总结

唯一不同的一点是,由于500行的代码风格要求,我把初始根据元素UmlElement建立各类、设定其属性的工作,新建了一个类,只传回必要的属性给MyUmlInteraction,包括顶层的MyInteractionMyStateMachine,还有各种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

面向对象课程第四单元及课程总结

上一篇:ant design vue模态框中下拉滚动样式分离解决方法


下一篇:nodejs聊天