第三次做业是在前两次做业的基础上迭代而成,中间没有动及筋骨的修改,因此这里只介绍第三次做业的架构。java
整体的架构思路是为不一样类型的UmlElement创建不一样的“MyElement”,以便对数据进行存储、管理和查询。如为每一个UmlClass实例化一个MyClass对象,并在MyClass中建立MyAttribute、MyOperation等容器,用来管理该UmlClass所拥有的UmlAttribute和UmlOperation。而MyOperation中又有MyParameter的容器,用以管理该UmlOperation下的UMLParameter。诸如此类,最终造成至上而下的体系,位于最顶层的是MyUmlGeneralInteraction,用来管理MyClass、MyInterface、MyAssociation、MyStateMachine和MyInteraction。git
在这种体系下,构造方法的思路就是不断遍历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。
我的感受线上学习跟线下没啥区别(除了能够1.5倍速,以及看完一遍还能够看回放)。
固然,看不到老师和助教大大帅气的侧脸仍是会有点遗憾。