OO第四单元总结

一、第四单元架构设计

第三次作业是在前两次作业的基础上迭代而成,中间没有动及筋骨的修改,所以这里只介绍第三次作业的架构。

  总体的架构思路是为不同类型的UmlElement建立不同的“MyElement”,以便对数据进行存储、管理和查询。如为每个UmlClass实例化一个MyClass对象,并在MyClass中创建MyAttribute、MyOperation等容器,用来管理该UmlClass所拥有的UmlAttribute和UmlOperation。而MyOperation中又有MyParameter的容器,用以管理该UmlOperation下的UMLParameter。诸如此类,最终形成至上而下的体系,位于最顶层的是MyUmlGeneralInteraction,用来管理MyClass、MyInterface、MyAssociation、MyStateMachine和MyInteraction。

  在这种体系下,构造方法的思路就是不断遍历UmlElement,对当前的UmlElement寻找其parent,找到之后就是parent的任务了。而parent要做的也不多,只需要为该UmlElement构造对应的“MyElement”,并加入自己的管理容器中即可。只不过考虑到层次有高低之分,必须要先构造顶层后再构造底层,所以要进行多次遍历。以UmlStateMachine为例,要先构建MyStateMachine,再构建MyRegion,然后是MyState(对应UmlState、UmlFinalState、UmlPseudoState),最后才是MyTransition。只不过最后考虑到代码风格问题,构造方法太长,于是就新建了MyUmlGeneralInteractionInit类用于MyUmlGeneralInteraction类的初始化。

  在体系构造完成后,之后的规则检查和信息查询只需要将任务层层分解到各级即可。以checkForUml005方法为例,即类图元素名字不能为空:在MyUmlGeneralInteraction中只需对每个MyClass和MyInterface遍历检查,而MyClass和MyInterface在对自身的name检查后再遍历检查其所拥有的MyAttribute和MyOperation,以此类推。经过层层调用,任何一层出现名字为空就通过上级反馈,直到反馈到MyUmlGeneralInteraction中,从而完成对005的检查。

二、架构设计演进

第一单元

  做第一单元的作业时就是为了满足要求而考虑,没有考虑后续的迭代。第一次作业到第二次作业的过渡还好,花了点时间加一些功能还勉勉强强完成。但第二次作业到第三次作业就没办法了,因为求导规则新增了复合函数求导,需要用树结构,于是不得不重构。但说实话,重构后的架构还是不怎么滴,全靠构造测试数据找bug,然后修修补补最终才像个样子。经过了第一单元,我亲身体会到一个优秀架构的优越性。

第二单元

  第二单元进入多线程,这对我完全是一个全新的领域,最初恨不得将所有方法都加上synchronized关键字,对于各种玄学bug也是先试试加上synchronized。个人感觉这个单元的作业的架构相比较上个单元有了很大的进步,但还是遇到了一些问题。一个是线程安全,有时会出现线程无法结束的情况。还有就是在第三次作业中加入了换乘电梯的需求,最后我通过增加一个全局控制器来解决这个问题,不过不至于重构,也算一个小的架构问题吧。

第三单元

  在架构设计这方面,相比前两个单元,第三单元忽然一变。有了课程组给的JML,就不需要再考虑整体的架构设计,而是将注意力更多地集中在单个的类中,如何管理类中的数据,如何提高方法的效率。在看懂JML之后,难点就在个别方法了,可能会用到bfs算法、堆优化Dijkstra算法、Tarjan算法、并查集等,感觉没什么好说的。

第四单元

  到了第四单元,我个人对自己的架构设计还是挺满意的,至少没有重构,第一次作业到第二次作业只需要增加新的类来满足新的需求,第二次作业到第三次作业用已有的类中的数据也能满足规则检查的需求。虽然感觉很大程度上是因为难度没有一二两个单元高,但还是感谢课程组把UML放在最后,让我们感受到了不用重构的快感。

三、测试实践演进

  测试方面就说来惭愧了,我一直都是手动构造测试数据,没有那种全覆盖性的测试,可能是因为写完代码后对自己的架构比较自信吧(虽然事实证明架构也不怎么滴)。之前也尝试过自动生成测试数据,搭建评测机,但对我这个菜鸡好像有点难(好吧,我承认很大部分原因是我自己太懒了),最后都放弃了。

四、课程收获

  学这门课之前,我对“面向对象”并没有什么概念。之前虽然选修过《java程序设计基础》,但也只是了解一丢丢java的语法而已,对根本get不到“面向对象”这种程序设计思想的含义。而这学期的OO课程让我初步窥探到“面向对象”的优越之处。个人体会深刻的一点就是让每个类管理自己的数据,只对外提供相关方法,这让程序的层次化设计变得容易的多。

  此外,这门课也告诉我“动手之前先动脑”的重要性。在着手实现之前好好构思一下程序的架构,考虑一下后续可能新增的需求,比上来就开始写代码要事半功倍倍倍倍。相信在以后,程序设计的常态应该是构思所花的时间比敲代码的时间多。

  当然还有一些附属品,如git之类的,hhh。

五、建议

  • 在第三单元的第一次作业中强测炸裂,原因是课程组在后来更新了一次JML,因为之前的JML的addRelation方法的前置条件存在冲突,而我又没有及时更新JML,于是就在不该抛出异常的时候抛出了异常。希望课程组在对指导书、官方代码有修改时能有效地通知到每位同学,尤其是第三单元的这种有一点错误就会跌落深渊的作业,必要时可以采用问卷、微信群接龙等骚操作。
  • 实验的难度真的很想吐槽,有的时候难得一匹,两个小时都不够,而有的时候不到一个小时就差不多解决,希望实验难度能均衡一点。
  • 说实话,感觉线上的课程跟作业没太强的联系,可能是我没有get到课程组的良苦用心。。。

六、线上学习体会

  个人感觉线上学习跟线下没啥区别(除了可以1.5倍速,以及看完一遍还可以看回放)。

  当然,看不到老师和助教大大帅气的侧脸还是会有点遗憾。

posted @ 2020-06-14 21:39  xxlscxx  阅读(142)  评论(0编辑  收藏  举报