前言
本次作业以一个图书馆管理系统为背景,锻炼我们对程序架构的设计和抽象能力,以及UML建模能力。
一、正向建模与开发
正向建模与开发指的是先面向需求绘制出UML类图、顺序图以及状态图等等,先大体确定好程序的框架,然后具体编写代码逻辑。
在本单元中,我先根据指导书的描述明确需要设计的模块,例如Library,Book类等等,然后在草图上画出每一个操作的工作流程,最后开始编写代码。具体来说,第一次作业由于存放书籍的类的容器和操作大体相同,我先将可以存放书籍的地方设置成一个父类BookHolder,然后让Reception,Bookshelf,User继承自这个父类。由于Reservation中存储的逻辑与其他类不太一样,需要存储预约的用户的学号,因此我将它单独建类,用HashMap<String, ArrayList<Book>>
来存储books。
二、本单元作业的架构设计
类图:
状态图:
第十三次作业
本次作业由于存储书的信息比较少,因此我在BookHolder直接采取存储LibraryBookId的方法,建立了HashMap<LibraryBookId, Integer>books
这样一个由书号到数量的映射。在Reservation中则是存储了用户以及他所预约的各本书的集合。
虽然题目上说开馆闭关后整理都可以,但是经过分析我将所有整理的操作都放到了开馆的时候进行,这样可以尽可能避免过早地提供预约书籍导致书籍被清理。
第十四次作业
这次作业书的内容更加丰富,因此进行了小部分重构,BookHolder中改为存储HashMap<LibraryBookId, LinkedList<Book>> books
,每一个书号对应一系列的Book,在程序最开始的时候新建好Book对象,在整个图书馆运行过程中只流通这一个对象。同时BookHolder也添加了BookDriftCorner这一个子类。在Library里添加一个orderRecord用来记录生效中的预约,来约束预约条件。
第十五次作业
第十五次作业加入了信用积分机制,跟前两次的作业架构没什么太大变化,很容易错的一点是由于积分存在上限,所以在整理的时候加分扣分要先扣分再加分。
UML追踪关系
模型追踪我感觉主要体现在状态图个顺序图的绘制中,根据官方包所提供的@Trigger
和@SendMessage
,在程序中具体的方法上标注出来,然后在UMl类图上绘制,保证二者相互对应。
三、四个单元中架构设计思维的演进
第一单元
第一单元采用了递归下降的方法,设计上属于层次化设计,将表达式中的因子、项和表达式分层表达出来,每一层次只负责考虑自己部分的逻辑,涉及到其他模块的只调用即可,不去考虑其内部设计,实现“铁路警察各管一段”。
第二单元
第二单元是我第一次接触多线程以及操作,也是第一次实践尝试使用生产者-消费者模型,我的架构也是借鉴了实验上的代码的架构,比较中规中矩,每一个模块就在一个类里进行操作。后来听到研讨课上其他同学的分享,我学习到了可以将电梯的属性和电梯的调度分开进行,也就是把控制电梯运行的逻辑单独剥离出来成一个Controller类,这样可以避免Elevator类过于臃肿,使得层次架构更加明晰。
第三单元
本单元我学到了规格化设计和契约式设计,也就是根据甲方给出的JML规格描述来实现程序,但是也要注意规格与实现相分离,也就是可以根据实际情况采用特定的算法和容器,而不是盲目照抄JML。架构方面基本是按照JML来写,所以大家的架构应该没有什么很大的区别。与此同时我也学到了利用JUnit进行测试。
第四单元
最后一个单元侧重于模型化设计,在本单元我学到了各种UML图的画法,通过正向建模与开发在写代码前搭建起一个大概的模型骨架,然后在这个框架内填充血肉。
四、四个单元中测试思维的演进
我的测试思维主要经历了以下几个阶段:
- 通过官方指导书以及评测结果的数据来进行测试;
- 和室友、同学进行对拍;
- 自己手动构造一些极端情况下的数据,例如第三单元的qbs,qts,qtvs等指令以及第四单元的极端借书期限;
- 利用评测机的大规模数据进行黑盒测试和白盒测试,定位可能存在的bug;
- 通过Junit对每个方法进行单独测试。
五、课程收获
经过一学期的OO课程,我的收获可以说是多方面的:
- 首先是java编程能力方面得到了很大提升,我第一次接触到了递归下降、多线程的操作以及面向对象编程的思维模式,这对于我们后来的编译原理课程以及实际的软件开发打下了基础。还有互测的模式让我们寻找他人的bug,可以帮助我们跳出自己视野的局限,来发现他人程序的闪光点以及不足,进而反馈到自己的程序上。
- 然后是算法方面得到了巩固,通过第三单元对于性能的高要求,我对于图的各种算法进行了复习,例如DFS,BFS,双向BFS以及Dijstra算法的实现以及它们的优缺点。
- 接着是培养了我的抗压能力,在电梯月的最后两次作业中,由于多线程bug的难以复现性,我经常debug一坐就是一天,甚至一天没吃饭,在ddl的最后关头de出bug,这会是我刻骨铭心的一段经历。
- 最后是锻炼了我的人际交往能力,研讨课的组织形式,为我提供了一个机会去认识其他同学。平时可能想要和同学进行交流但是找不到很好的契机,这就导致我的人际圈子被局限在一个很小的范围中,但是通过研讨课我可以和更多的同学熟悉、交流,学习他人的优秀设计并且分享自己的心得体会。
最后感谢老师和助教的辛勤付出,感谢各位的陪伴!