OO_U4总结
一、简介
- 本单元的主要任务是对UML模型进行解析。UML模型将抽象化的代码转化为直观可见的视图,其中类图可以表达类、接口直接存在的基本关系,顺序图展现了进程生命周期中的调度关系,状态图展现了基于条件判断的状态转移。解析UML模型是一个巨大的工作量,因此这部分作业中只提取了部分工作作为任务。
- 本单元中,涉及到大量的图与算法知识,实现起来较有挑战。
二、本单元架构设计
1. 类图
![image](https://img2022.cnblogs.com/blog/2778412/202206/2778412-20220626212425548-1977704380.png)
2. 设计与架构
- 本次作业大量直接引用了官方解析好的类,但是为了便于解析,特地构造了类图、顺序图、状态图三个包,每个包中使用一定的便于自己操作的类如MyClass,在其内部将关联、继承等图的元素,作为邻接表进行存储,便于图的遍历与查找。
- 由于本次作业读完所有的内容只进行一次初始化,因此可以在初始化时,通过HashMap将属性、方法等分入到指定的类图中,对于状态图与顺序图也是如此。
- 对于基础查询指令,没有太大的困难,主要是需要注意细节,如有些元素的名字可能为空,这些不进行特判在一定的情况下可能会引发异常。另外还有同一个元素需要比较id而非名字之类。
- 对于异常检测,主要难度集中在循环继承、重复继承这两个部分,我才用了深度搜索与广度搜索,但实际上复杂度非常高,由于需要将所有出问题的节点记录,因此不能使用一些简单的有效性判定算法,只能每次对一个点进行搜索,并遍历所有节点。
三、架构设计思维及OO方法理解的演进
1. U1
- 开始接触面向对象思维,懂得如何维护一个类,对类中的属性、方法进行管理,对行为、数据进行抽象,以及如何协调不同类之间进行工作。
- 初次接触迭代开发,明白了好的架构带来的开发体验重要性,对于架构设计开始了学习。
- 最初的设计中依旧存在大量的问题,比如说耦合度过高。
2. U2
- 初次接触多线程,了解并学习了多种设计模式如生产者消费者模型,这些模式由前人的经验总结而成,对于我的作业起了重大的帮助。
- 了解了锁的原理,并且初步掌握锁的使用,以及如何避免死锁,保持线程安全。
- 学习并使用了状态机建模,这种将条件判断抽象的建模方式,极大程度降低了耦合度,并且对于迭代开发有着极高的效率,经过一单元的学习,对于状态以及状态转移的架构有了更深入的了解。
3. U3
- 第三单元的学习更多的是如何规范化编程,JML语言让不同人之间协作变得更为简单,有了固定的条件约束,寻找bug也变得更为容易,是面向对象中一个重要的架构思路。
- 学会了如何编写JML说明,第一次使用自己编写的评测机,对于测试与数据生成有了更为深入的研究。
- 复习了数据结构与离散数学中教授的图论算法,对于性能与hash的底层实现有了更深入的了解。
4. U4
- UML模型将抽象化的关系转换为可视化的视图,对于架构设计无疑有着巨大的帮助,bug已经从整体设计层面降低至实现时的语法层面,设计架构前先绘制UML模型,对于后续的代码编写可以说是事半功倍。
四、测试理解与实践的演进
1. 手搓数据
- 有针对性的构造测试数据,根据题目要求,设想一些可能会出错的数据,适用于测试数据较短,可以手动构造的场合,在第三次作业中,成功hack到了不同的bug。覆盖性一般,并且需要一定的思考,不过针对性较强。
2. 自动生成数据
- 随机数据生成,电梯需要测试的便是多线程下的安全性问题,大量的数据到来可能会导致bug的出现,但是多线程在不同系统不同环境下有着难以复现的问题,即使覆盖性强,也可能本地与服务器得到不同的结果。
3. 单元测试
- 单元测试,利用Junit,可以保证测试的覆盖性,至于自动生成数据,依旧由数据生成器完成,并且在数据生成器中设定一定的逻辑,使生成的数据匹配单元测试的要求。
五、课程收获
- 建立面向对象思维、学会了面向对象的架构方式。
- 初步掌握了如何进行架构设计,以及如何进行迭代开发,对于迭代开发中的圈复杂度进行控制,降低重构的可能性。
- 更加深入地了解了Java底层实现原理,容器的使用方式,算法复杂度与实际时间的不符的可能原因。
- 学会了多线程的多种设计模式,对于多线程的安全性问题有了深刻的认识,并且掌握如何使用锁进行资源的调度。
- 对于测试,从白盒到黑盒,从手动构造到自动生成,从针对性到覆盖性,有了明显的进步,对于构造评测机有了一定的经验。
- 对于算法,既复习到旧的知识,强化了记忆,又学到了新的方法,颇有收获。
六、改进建议
- 第一个建议是关于JML的,JML本身是一个非常好用的规格设计,但是实际上难度最高的在于架构时进行JML设计,建议将JML书写辅助架构设计的能力纳入作业考查范围,而不仅是上机考查,并且应当减弱对于实现JML规格的难度,将重点置于写出漂亮的架构上。
- 第二个建议是UML模型,虽然很有用但是一直在解析与检查,对于如何运用没有明确的锻炼,加上实际上期末临近,很难以进行有效的编程,我认为,平时作业不应当局限于写代码-测试-改bug,比如第四单元,与其在烤漆写代码折磨,不如将UML模型的运用作为作业考核。
- 最后一个,协作编程,已经使用了git,不如提前让大家接触一下分工合作式编程的乐趣,运用JML和UML之类的知识,将任务分解,并考察多人合作下实际的代码耦合与运行情况。
posted @
2022-06-26 22:58
Maryin-c
阅读(
34)
评论()
编辑
收藏
举报