建模与开发
根据题意来抽象出各个类, 一同构成图书管理系统,并且指导书贴心地把关键的机构用黑体加粗。而且本单元其实比之前的单元更加面向对象,机构划分清晰,各机构的职责也清晰,比如还书时B书去借还管理员,C书去自助机器,根据要求在具体的类中实现具体的需求即可。
并且学习UML图了解类和类之间的关系后,为了降低耦合性,在本次作业中我有意减少了关联关系,只实现了学生对图书馆的关联,图书馆和机构的关联,而不是直接将学生和各个机构关联。
架构设计
比较特殊的类是enum类型的BookStatus,规定了书的不同状态,所以在实现中,书从来没有真正的被放到哪个管理员手中,仅仅只是标记书的借阅状态。当然,由于实际实现的复杂性,书不仅仅只有借出一种状态,还有可取,损坏,丢失,运输中等状态。对于管理员的借书还书操作,学生的损坏丢失操作,只需要改变书的对象的状态即可,比较清晰也比较容易维护。
比较常规的操作是开发图书馆类,书类和书架类,按照指导书的需求逐步实现即可。
架构设计思维演进
第一单元
初步接触面向对象思想。本来认为表达式本身是一个整体,但慢慢了解到,表达式,因子可以作为独立的对象存在,甚至可以存在表达式因子,不断由顶向下,一步一步划分。
第一单元中主要学习了继承关系,因为因子有很多类型,所以实现因子接口,再逐渐实现各个因子类。
第二单元
多线程单元的核心点在于锁的设计,通过synchronized关键字,可以设置临界区资源,这个思想在操作系统课程中也有体验。可以将整个函数用synchronized修饰,也可以只修饰一个对象。并且了解到实际工作中很少将整个函数都用synchronized修饰,因为会导致效率的降低。
接触到成熟的设计模式,本单元主要应用生产者消费者模式,只需要思考consumer,channel等角色分别对应作业中的哪个部件即可,进一步使用成熟的模式编程。在这一单元,我明白成熟的设计模式是前人多次实践总结出来的智慧结晶,不容易出bug,并且条理清晰,易于理解,在可以套用模式的情况下,是较好的选择。
学习LOOK算法,了解电梯的设计算法,积累相关算法知识。
第三单元
接触JML规格,学习根据程序写JML,以及根据JML写程序。前者主要是上机实验课的内容,后者主要是课下作业的内容。但JML存在明显的缺点,过于琐碎,可读性差。并且JML往往代表最基本的算法,并不能满足课程组对于时间复杂度和空间复杂度的要求,需要自己思考如何减少循环的层数,降低复杂度,并不能完全的依赖JML。
第四单元
业务逻辑很复杂,设计七个左右的机构,彼此具有一定的关系,需要耐心理清其中的关系。从流程出发,借ABC书分别找什么机构,还ABC书分别找什么机构,A书可不可借,损坏了还书时BC书分别找什么机构,丢失了找哪个机构交罚款。
每一点都不复杂,但是每一点都需要实现很复杂。我觉得这个单元工作量真的非常大,我努力完成但是实在赶不上进度。
测试思维的演进
学会使用黑盒测试,采用生成随机数据 + 评测机的形式进行大量测试, 在数据有保障是的前提下可以在大量的测试中发现错误并纠正,可以进行大量测试, 覆盖率较高,这一点在电梯单元尤为体现,因为多线程并不能保证每次测试都可以复现bug,所以需要大量测试。
同时明白白盒测试也很有必要,以方法为最小单位,精确定位bug出现的位置。
课程收获
收获了面向对象的思维模式,了解了抽象的思维方法,在面向过程编程的基础上,进一步拓展了编程的可能性。
了解UML和JML,学会根据规格实现代码,甚至在规格的基础上进一步优化代码。
学会类的继承关系,关联关系等等关系,进一步了解实现需求时的架构设计方法。
学会先设计,再实现,对问题建立清晰的认识后,逐步完整细节。
学会复杂需求的编程,而不局限于大一程设时和大二计组P0-P2的单一功能的实现,提高处理完整且复杂问题的能力。