2021OO第四单元总结

第四单元总结

19231142 李靖尧

一、代码架构分析

  本单元考察的是对UML的理解,要求输入某段程序的UML语言,并完成相关查询指令。具体需要实现对UML进行建模,对不同的UML对象进行分类处理,最后按照要求进行查询和输出。

  1、第一次作业:

    第一次作业只有UML类图,且对象也仅限于类中的元素,比如类、接口、实现关系等。

    具体方法类似于建树的过程,“层次关系”尤为明显。以UMLClass对象为例,UMLOperation、UMLAttribute都是属于UMLClass的,因此我们可以自己实现一个MyClass类对UMLClass进行包装,其内部有容器存储它的所有属性,体现了面向对象的“封装”思想。

     

    由于某些属性和性质仅限于UMLClass和UMLInterface之间,例如UMLOperation和UMLAttribute属性、类和接口之间的关联等等,我创建了一个抽象类OOStructure,并使MyClass类与MyInterface类继承它,并在抽象类中提供公共的修改以及查询方法。

 

    由于本次作业对时间要求不高,采用“查询低成本”的HashMap存各类属性的Id及对象构成的键值对基本可以不用担心超时的风险,因此没有做额外的优化。

  2、第二次作业:

    第二次作业在第一次作业的基础上,增加了时序图和状态转移图,各种UML对象及其关系也变得更复杂。

    对于时序图,与上次作业处理UMLClass的方法一致,创建MyLifeLine对UMLLifeLine进行包装,内部实现各种收发消息的方法,对外提供接口。

    对于状态转移图,同样将UMLState进行包装,同时内部存储从一个状态到另一个状态的转移。

     

  3、第三次作业:

    本次作业增加了UML合法性的检查,根据各种规则对输入的UML语言进行判断。

    其中较难的是判断接口是否存在循环继承,实现思想类似DFS,不过没有使用递归,采用了两个栈分别存储父接口和该接口的度,每次弹出接口,同时弹出其度并执行加一操作,再将其所有父接口加入栈中,判断是否存在循环继承。

 

 

二、架构设计总结

  第一单元:重点理解面向对象最重要的思想——继承。何为继承,为什么要继承,需要什么条件,是学完第一单元以后必须回答的三个问题。具体需要掌握的方法就是“抽象”,以“表达式求导”为例,一个表达式可以抽象为“运算因子”和“运算关系”,运算因子有x和常数,运算关系可以分为“一元运算”和“二元运算”,这样层次化的网络就产生了,同时继承关系也就清楚了。三次作业的难点是向上造型的理解,比如说“运算因子”和“运算关系”有什么联系吗,它们是独立互不相干的吗?很显然不是,运算关系,顾名思义,必然是因子和因子之间的关系,所以需要由运算因子来补充。因此还可以抽象出更高级的超类,运算因子和运算关系同时继承这个超类。

  

  第二单元:重点是多线程的理解,主要出现的问题无外乎是多线程常见问题比如“死锁”。在具体实现上,实现了“调度器”和“请求池”的典型消费者——生产者模型进行处理,而电梯其实只保留了最基础的功能比如开关门等等。

 

  在第三次作业中,由于需要换乘,我采取了将Request“封装”为Person,将换乘信息直接存储在其中,外部(调度器)感知就是一串Request。

  第三单元:实现一个简单的线上交流系统,实现难度不大,重点在于JML规格语言的理解上面,在架构层面上,由于是面向接口的编程,因此架构并没有什么难点,难点在实现算法的优化上。还记得本单元作业强测出了问题,全部都是超时,主要就是查询blockSum时采用了传统的bfs,实现的不好,复杂度到了O(n^2)。后来采用了并查集的算法并且压缩路径,成功修复了bug。

 

  第四单元:本单元的作业重点体现了“封装”思想,即将原始的UMLClass包装为MyClass,难度不大,上文已说,不再赘述。

  

三、测试的理解

  第三单元我的研讨课讲的就是各种程序测试方法,重点讲了黑盒测试的临界值法和白盒测试的Junit测试,让我对其有了深刻的理解。通过这单元的三次作业,让我对Junit的调试进一步的熟练了。

 

四、我的建议

  1.第四单元作业的指导书其实是不够清晰的,很多的信息需要从讨论区甚至群聊获得

  2.或许可以考虑互换第三、四单元作业,因为比起第四单元,似乎第三单元作业的强度更适合考期

  3.希望课程部分涉及一些评测机搭建方法

posted @ 2021-06-25 23:00  春天里666  阅读(53)  评论(0编辑  收藏  举报