Unit4总结和学期总结
Unit4总结和学期总结
一、本单元架构设计
第一次作业以MyUmlClass类模拟一个UML类图中的类,存储了属性、方法、继承类的id、实现接口的id和关联类的id。一个类图单纯地是一个MyUmlClass(和接口)的容器。在查询类包括其父类实现的所有接口方法中,暴露了这种架构的弊端。继承、实现和关联关系,不应该保存在MyUmlClass内部,从UML图上也能看出,类(方框)和各种关系(箭头)处于同一层次,简单地用Map的形式保存在类图中,更方便dfs。
因为设计的问题,无形增加了dfs的复杂度,导致getImplementInterfaceList超时。
第二次作业用MyCollaboration存储一张顺序图中的lifeline和message等信息,用MyStateMachine存储一张状态图中的state和transition。由于不需要考虑不同UML图之间的关系,所以只需要在顶层GeneralInteraction中用<id,graph>保存三种图,查询时调用相应查询接口。
解析输入时注意各种UmlElement顺序不一定,要注意元素的层次关系和parentId的真实含义。

第三次作业首先在构造函数的信息提取上增加难度,不像前两次作业对数据的需求一目了然,非常考验前瞻性设计。逐个分析检查规则逐个添加所需的数据结构,也能满足需求,但最后就会像我的uml图一样非常丑陋,甚至存在数据冗余。同时要注意重复继承和重复实现的检查对象,前者只需要检查接口,后者只需要检查类。
二、四个单元中架构设计及OO方法理解的演进
第一单元多项式求导,其实是非常考验对象建模思想的。但由于处理细节问题的难度和工作量都不小(正则解析复杂表达式,根据不同求导规则处理输出,简化计算优化性能),把大量的时间精力都花在了处理细节问题上,掩盖了整体设计的重要性。
在这个单元对OO的理解还停留在,简单类的构建和继承关系的简单应用,缺乏工程化方法和应用模型的经验。甚至会出现刻意为了构造对象而创一个类的荒诞行为。
第二单元多线程编程,首先引入了一系列模型,如消费者生产者模式,工厂模式,观察者模式等等,接着由浅入深学习了几个确保线程安全的方法,如同步块,lock加锁。
电梯调度的架构设计中,我试图按照物理世界中真实电梯的结构,分析各个类是否应该存在,应该如何分工。在实际实现中运用了消费者生产者模式,三次作业均保证了正确性,但紧贴着指导书需求设计导致扩展性很差。
前两单元从设计架构到选择数据结构的自由度都很大,有各种各样实现的方法,很容易造成一开始无处下手的窘境。如果不是有丰富的面向对象编程经验,上来踩几次坑重构几次都是正常且必要的。
第三单元关注JML规格,规格已经给的足够详细,很大程度上不需要自己考虑架构的问题。但相对的本单元在算法上更高一层的要求,尤其是在cpu时间上要求最大压榨性能。第二次作业中为了降低时间复杂度,需要在输入时更新缓存,由缓存附带出现了一大堆丑陋的不符合现实世界认知的类和数据结构,打破了电梯作业中对对象的刻板认识。
第四单元解析UML图,代码量骤增,迎面给人一种实际工作中996的既视感。但在仔细理解UML元素的构成和关系后,能够比较自然地想象出程序结构。在前三个单元训练的基础上,剩下的工作就变成了工程量的堆砌。
三、四个单元中测试理解与实践的演进
第一单元主要自己手动构造边界用例进行测试,但何谓“边界”,其实背后是由设计决定的。这就导致,设计时就存在的思维漏洞,在构造测试用例时依然存在,两者的一致性造成有的bug注定无法被发现。
第二单元测试时我更加狼狈,为了实现特定时序的输入,要人肉计时凭感觉测试,光是复现一个错误都很麻烦。但还好第二、三次作业的梯度没有过大,让我这个不写自动测试的菜狗逃过一劫。
第三单元引入JUNIT后,测试的难度陡然降低很多,完全可以像verilog中写TestBench一样自行构造测试环境和测试数据,但依然有一些时间复杂度要求较高的bug不容易被测出来。
四、课程收获
知识和技术上的收货就不谈了,详见各单元博客。
首先是抗压心态上的进步,四次作业都经历了至少一次重构,同时在这代码量上不说有多熟练,起码写起来稍微有了一些手感。但我所见识到的依然只是java的冰山一角,虽然说掌握编程思想很重要,但我更相信使用语音是掌握语言的最快途径。一个个实例积累在脑子里,比什么大师命名的原则更有价值。
其次是敢于精益求精的勇气,JML规格作业中尝试各种办法减少cpu时间,所有算法都没法再优化时,最后不惜自己造轮子替代java自带容器。夸张的节省了快一倍时间,也有越改越慢的时候。但这个过程对java语言的底层实现机制有了更深的了解,收货颇丰。
五、课程改进建议
-
希望上机实验有类似bug修复环节的反馈机制,有的实验内容真的很有趣且有难度,后续有不少可挖掘的地方。
-
关于JML规格和UML元素的一些基础知识完全可以自己课下自学,效率更高,且不用占用宝贵的理论课时间,
甚至还要课下返工。 -
可以在每单元最后的理论课小结中,增加对标程代码或优秀设计代码的赏析,
只是放在git公共区里自己懒得去学习。
六、线上学习体会
线上研讨课的展示效果真的很不错,现在有些后悔自己没能准备一次展示。
线上学习更能专注在自己身上,没有那么多线下要操心的事情(大多数操心也没用)。除了理论课效果无法评判,总体而言很开心线上学习OO!

浙公网安备 33010602011771号