OO_summary_4.UML
OO_summary_4.UML
前言
听袁老师上课说,在他们那个时候OO课程的主体部分正是UML,所以UML语言的重要性不言而喻,UML作为一种画图工具,能帮助我们画出各种各样的类图、顺序图、状态图,从而便于完成架构的实现,这一点在大工程的设计时事先完成架构的设计,在加上上一单元JML作为辅助,就可以很高效清晰的完成设计了。
知识点总结
知识点可以参考我的另一篇博客——UML_note - Charles’s Castle
作业分析
本单元三次作业的要求层层递进,连接很紧密,并将类图、状态图和时序图的要求穿插其中,达到了非常好的效果(当然指导书本身存在歧义有改进空间)。这一单元的三次作业特别类似于工程迭代的过程,虽然每次迭代只开发了一小部分新功能,但在多次迭代后会形成一个很大的成果,这个过程还是成就感满满的。第一次迭代是实现一个正常的图书管理系统,完成一个学校范围的调度书籍的任务,第二次迭代在此基础上添加了校际调度和买书的需求,并进一步规范了输出,第三次作业算是最简单的一次迭代,加入了借书时限的要求,就此一个简单的多校图书管理系统的设计正式结束,OO也画上了完美的句号。
三次作业的作图
本次作业本身实现并没有很难,是典型的大模拟类型的题目,细心即可,主要是保证自己的作图和代码对应比较麻烦,其他部分其实难度并不大。
类图
时序图
状态图
测试方法
这一单元的测试还是比较棘手的,主要是数据生成比较复杂的锅,而第二次迭代的乱序输出需求我用排序字典序完成了对拍(赢在了时间戳本身是按字典序的,所以可以实现小范围乱序有序化的效果)。具体可以看我的另一篇博客——OO_hw13_test - Charles’s Castle
个人bug分析
个人感觉是指导书的锅,让我对A类书产生了一些误解,造成了第二次迭代出现了一个小bug,感觉很亏orz,另外两次没有出现bug。
心得体会
架构设计思维的演进
unit1的主题是"表达式展开",旨在介绍面向对象的思想和OO方法的基本了解,面向对象编程的世界观是"一切皆是对象",需要从具体问题中抽象出若干对象来解决问题,在表达式展开问题中,表达式、项、因子都可以看作对象,通过从问题中抽象出一系列对象,我们可以建立一个层次化、模块化的结构,从而降低问题的复杂度,实现对问题更加有效的求解。
unit2的主题是"电梯调度",介绍了对象之间的交互和线程安全问题,对象之间的交互需要建立联系,进行交互,才能实现一个更大的功能。但是在多线程的场景下,对象之间的交互时机和结果都具有不确定性,需要结合实际场景对线程安全问题进行分析和解决。
unit3的主题是"JML规格",介绍了契约式编程和高可靠性、高复用性、便于测试的优点,JML规格语言是一种契约式编程的语言,可以对程序功能做出限制,需要注意如何高效实现契约。这一单元的作业也加深了对设计算法的理解。
unit4的主题是"UML建模语言",介绍了UML语言来绘制类图、状态图和时序图的相关方法,这是我们之后面对大规模工程进行架构设计的重要工具,同样非常重要。
通过这四个单元的训练过程,我对架构设计有了更深的了解,思维也是一步步演进,更是学到了许多新知识并将其运用到了下一次设计代码的思想中,整个码风也是越来越清爽,真的是收获满满。
测试思维的演进
毫无疑问测试是OO取得好成绩的重要部分,虽然不妨碍许多大佬有着超高水平的第一遍编程的质量,但最终还是难以做到一遍即完美,所以测试是重要且必要的部分,那么我们要如何编写评测机呢?我认为需要在随机生成的基础上加上压力测试和边缘测试方为正道。
而在具体实施到每个单元的测试中时,我主要采用了自动化随机测试的方法进行整体测试的思路,并且一以贯之,而整个评测机主要包含两个部分——数据生成器和正确性检查,这样进行分离可以使得评测机拥有很好的可扩展性,降低迭代时的复杂度。而边缘化数据测试和压力测试是整个测试过程中最关键、也是最容易发现bug的阶段。 受限于随机数的偶然性和数据生成器的生成算法,自动化随机测试不能够保证能够覆盖到所有的情况,即使覆盖到了也不能形成很高的强度,这样就会导致一些大数据或者TLE情况出现但却无法用评测机及时发现,而强测数据却是绝对可以覆盖到的。所以这样一些特殊情况,我们还要手动构造一些有针对性的数据,弥补随机测试的短板,提高测试的全面性。
而这句话在我的各个单元编写数据生成器的时候也在多处有所体现。在第一单元,我按照作业中"递归下降"的思想来生成测试数据,并设置递归深度对递归次数进行控制,从而保证测试覆盖的全面,最后用 sympy 库对代码输出进行正确性判断即可。在第二单元,我采用随机数的方式来生成乘客请求,并对某楼层或者某楼座进行压力测试,这里也就体现了随机+压力的基本思想,可以检查在不同情境下代码的性能表现和运行结果,更好的排查CTLE和TLE现象的原因。这单元是群佬评测机群魔乱舞的时代,各种多线程评测机层出不穷,所以这单元我的评测机理论还能更好,但当时学习压力较大,最终也就用一台普通评测机应付过去了。在第三单元,作业内容涉及到了图的建立,如果完全随机生成数据的话,图的复杂度可能会由于出现大量孤立点的情况而变得非常低,所以为了提高数据的强度,我在数据生成器里设置一些数据结构,来保证生成的数据有较强的关联,而对拍可以进行简单的文本对拍,或者可以使用课程组推荐的junit。第四单元的评测机非常难写,要求纷繁复杂,而且对拍也是随机性很强,所以我只能通过代码限制加上数据生成内容约束两方面才取得了不错的测试效果。
课程收获
OO课完结啦,撒花!!!OO课程是对cpp课程的进阶版本,但又不限制于java语言,而是以面向对象的思想并结合设计模式展开的课程。在这里我学到了很多设计模式和思维模式,更是让我测试能力更上一层楼,并且在对拍的过程中,我们也找到了许多新的伙伴。听说OO课程是下学期编译原理的基础,希望下学期再接再励,再创辉煌。
- Title: OO_summary_4.UML
- Author: Charles
- Created at : 2023-06-11 21:35:51
- Updated at : 2023-06-17 14:13:59
- Link: https://charles2530.github.io/2023/06/11/oo-summary-4-uml/
- License: This work is licensed under CC BY-NC-SA 4.0.