一、正向建模与开发
所谓正向建模,是一种自顶向下的方法。本单元课程要求先进行架构设计,画出UML类图、状态图、顺序图,再进行最终的代码编写。还记得完成本单元第一次作业时,由于还未熟悉startUML的使用,我的效率十分低下,就连如何在类中添加属性和方法,如何添加不同的关系这些小事都研究了半天,花费了很长的时间。在画图的过程中,更是犯下了许多诸如大小写不匹配等低级错误。我只能依赖评测来检查它们,足足交了九次才过,是我在所有oo作业中提交次数最多的一次。好在到了第二次,第三次作业时,由于我已经了解了startUML的基本用法,情况好了很多。
类图
类图是UML中最常用的静态结构图,用于描述系统中的类及其相互关系。它展示了类的属性、方法以及类之间的关系。类图的主要元素包括:
类:表示一个对象的抽象,包括类名、属性和方法。
接口:定义类必须实现的行为。
关系:表示一个类继承另一个类的结构和行为。其中实现表示一个类实现一个接口;关联表示类之间的连接关系,可以是双向或单向;聚合表示类之间的弱"整体-部分"关系;组合表示类之间的强"整体-部分"关系,部分不能脱离整体独立存在;依赖表示一个类依赖于另一个类。
状态图
状态图用于描述对象在其生命周期中所经历的各种状态以及状态之间的转换。它主要用于建模具有复杂状态行为的对象。状态图的主要元素包括:
状态:表示对象在某一时刻的情况或阶段。
初始状态:表示对象的起始状态,用一个实心圆表示。
终止状态:表示对象的结束状态,用一个带圆环的实心圆表示。
转换:表示对象从一个状态到另一个状态的变更,通常伴随着事件和条件。
事件:触发状态转换的外部或内部事件。
条件:状态转换的条件,只有在条件满足时,状态转换才会发生。
顺序图
顺序图是UML中的一种交互图,用于描述对象之间动态的交互过程,特别是描述对象之间消息传递的顺序。它强调消息的时间顺序。顺序图的主要元素包括:
对象:表示参与交互的实例,通常位于图的顶部。
生命线:表示对象在系统执行过程中的存在时间,用一条垂直的虚线表示。
消息:表示对象间的交互,通常用箭头表示。消息包括同步消息、异步消息、返回消息等。
激活:表示对象在处理消息时的活动,用矩形条表示,沿着生命线垂直绘制。
时间约束:表示消息之间的时间约束条件。
交互片段:表示复杂的控制逻辑,如循环、条件、并行等。
二、架构设计
Main:程序的入口点,负责初始化图书系统
Library:图书馆系统类,用于交互用户的各个请求
Bookshelf: 书架,用于存储书籍(也用作为漂流角)
AppointmentOffice:预约处,用于处理用户的预约请求
BorrowReturnOffice:借还处,处理借书和还书请求
User:用户,存储用户的各个信息
AllUsers:用户集合,存储所有图书馆的用户
Book:图书,存储书籍的各个信息
OrderRequest:预定请求,包含预定的信息
OrderBook:已经处理好后的预定图书,包含预定的信息
三、设计思维的演进
第一单元
第一单元的重点是递归下降。因为刚开始接触oo,我对面向对象编程还不怎么了解,于是借鉴了公众号中介绍的递归下降方法。从中我了解到,多项式是对象,由单项式组成。单项式是对象,由因子组成。因子也是对象,分为表达式因子和数字因子两类。这两种不同的因子也都是对象。由于第一次作业时我未考虑代码的扩展性,加之经验不足,我设计的保存系数和指数的方法不是很好。这也导致我在第二次作业时经历了本学期第一次也是唯一一次重构。当时我直接蒙了,真的很不想放弃自己辛苦几天写出的东西,但最终还是没别的办法。不过好在经过这次重构后,完成剩余的两次作业都容易了许多。
第二单元
第二单元的重点是多线程。这个单元绝对是四个单元中最难的一个。我永远不会忘记整个单元经历过多少次CTLE,而且这个单元不能单步调试,只能依靠打印来debug,这无疑是雪上加霜。不过经历了这个单元后,我对多线程,锁,同步与互斥,生产者-消费者模式都有了一定的了解,这也为之后os的学习打下了基础。
第三单元
第三单元的重点是JML。这个单元虽然没有前两个单元那么难,但我错的强测点却比前两个单元还多。其原因在于我最初没有考虑时间复杂度的问题。经历了这个单元,我学到了动态规划,并查集,BFS等方法,还使用了一些新的数据结构,例如SortedSet。不过我的架构设计能力并没有在这个单元得到提升,因为架构都是给好的,不怎么需要改。
第四单元
第四单元的重点是UML。课程组要求我们掌握正向建模与设计的思想,能够使用UML图辅助我们进行程序设计。在这个单元中,我体会到了预先设计好一个架构的重要性。这样可以将复杂的问题分解成简单的小问题,使其易于理解,准确指导接下来的具体实现和拓展。当然,我并没有能力在一开始就设计出一个很好的架构,只能边写边改,这是一个不断在学习和实践中积累经验的过程。至少我相比这学期刚开学时在架构设计方面已经有了很大进步了。
四、测试思维的演进
第一单元
在此之前我几乎没有任何测试经验,只会借助样例和公布的数据点进行测试。还是读了学长的博客才知道可以构造一些特殊的情况测试,比如结果为0或1时,有些同学的代码是没有输出的。
第二单元
从这个单元起,我开始尝试构造大量的数据,同时reset五部电梯,在同一时刻一下子来几十条请求等。
第三单元
这个单元对数据覆盖率有着很高的要求,测试时,我构造了单点图,独立集图,稀疏图,稠密图,完全图等多种不同的图,尽可能覆盖到全部的情况。同时,我还构造了一些量很大的数据,试图测出评测机无法测出的TLE问题。这是我测试思维进步最大的一个单元。
第四单元
由于这个单元难度不大加上没有互测,我几乎没有考虑测试的事,每次写完就只是利用评测机测试。在此,我要实名感谢写评测机的各位大佬,如果没有你们,我这个菜鸡还不知道要在强测中多挂多少个数据点呢。
五、课程收获
终于写到最后一部分了,原本我有千言万语,但此时此刻突然不知道要说什么好了。我想起第一次作业时,原本我以为自己oopre学得还不错,并不需要太担心oo,但事实上知道周四我仍然一点思路都没有,崩溃的同时也非常担心自己这学期无法坚持下来。好在都过去了!真是轻舟已过万重山。我觉得这学期下来,相比于代码能力的提升,我更大的收获是抗压能力的提升,(以及熬夜能力的提升!)在此,我想要感谢老师,感谢助教,感谢愿意将代码分享到GitHub上的学长,感谢从来不嫌弃我菜,总是乐于助人的同学们,感谢写评测机的大佬们。没有你们,我肯定是坚持不到今天的。
这一切终于还是结束了!再见!