302
社区成员




本单元主题是学习UML图在设计中的实用,我们学习了类图,状态图,时序图等,并且尝试在实际开发前先行进行架构设计并绘图。因为本单元主要学习内容是架构设计和改进,因此没有安排互测,或者极其刁钻的数据测试
本单元的实际任务为,设计一个图书馆管理系统,分别需要实现书籍从学生,书架,预约处,借还处,漂流处五个不同位置的调度关系。其中学生是一个个个体,需要通过学号检索到,而后四者都是图书馆中的实例,并且都是可以保存书籍的一个地点,具有相同特征。在之间的调度只可能发生在以下情况,例如学生借书时,能够成功借书就从书架转移到学生,否则从书架转移到借还处(也可以拆分成为先到借还处在考虑是否到学生)。因此我们可以将需求拆分成为四个容器,n个学生和数条书籍通道,而通道由外部输入的命令进行调用。同理的,外部命令也已经给出,例如借书,还书,预约等等,每一条命令都对应着一系列的判断和书籍的转移。因此我们可以简单的将图书馆架构设计为,一个用于接受外部命令并进行控制的图书馆控制器,四个具有相同特征,但是也有不同功能和不同数据的存书处,以及一系列学生,最后是用于传播的书籍。其中学生内部也要保存数据,并且根据类型分开保存。书籍内部需要有一系列信息,保存书籍的转移流程。预约处需要保存预约及其时间,而借还处只需要保存书籍,没有其他功能。
在有了基本的架构设计之后,就可以画图,通过UML梳理自己的架构设计,并且加快开发速度。
第一次作业提出了学生,书架,预约处,借还处的概念,并且给出了基本的交流方式,以及开馆闭馆时的要求
此时是初始的架构设计,但是因为对图的检测,要求不能有没有特殊属性和方法的子类,因此最后写完代码提交时的架构修改为:
可以看到,除了补充一些缺失的方法以外,还删除了借还处和书架,由BookShelf直接提供这两个功能
第二次作业提供了漂流处的概念,需要对书籍的借还次数进行保存,按照第一次直接存书号和数量的方法不再可行,需要设计新的书类
因为出现新的书类,以及正式和非正式两种新的书籍类型之后,借还处,书架等不再是完全没有独立方法,因此又对图进行了修改
除此之外,将所有需要保存书籍属性的位置改为book类存储,否则仍使用bookId存储
最基础的状态图也设计好了,但是还没有填充转移的方法(其实是忘了名字了)
代码实现之后,对图的修改如下:
仍是填充了部分方法,对于基本架构未做修改
状态图有些许修改,最初没有设计预约处,添加了预约处的状态
第三次作业对学生类增加了信誉分的属性,同时因为非正式书籍转正时需要为学生增加信誉分,因此书籍中需要保存捐赠者的id
因为增加的内容主要体现在书籍和学生处,因此起初架构没作什么修改
本次新增的时序图,但是因为课程要求,所以最后删减了许多内容
在实现之后,仍没有多少变化,主要区别在于书籍内部保存了许多学生信息
流程图也类似,但是为了满足课程自动评测的需求,对其中部分内容做了修改
在学期的四个单元中,我们由浅入深,了解并实践了面向对象设计的不同层次
首先在第一单元,主题是递归下降设计,要求我们解析表达式并化简,当时初次接触面向对象设计,没能很好的拆分层次,虽然是将表达式拆解成了表达式,项,因子等多个层次,但是总得来说,耦合严重,并且拓展性差。这一单元的测试主要是根据范式,自动生成表达式,并通过黑盒对拍的方式进行测试。
至于到了第二单元,我们第一次接触多线程程序设计,因此出现了很多难以预期的问题。在第一次作业中,逻辑相对简单,因此也没有出现什么错误问题,并且运用第一单元训练而得的层次化设计的想法,使得程序设计相对起来比较简单。但是因为电梯调度比较复杂,所以在第一次只是简单的使用look算法进行调度。而第二次和第三次作业就出现很大问题,第二次作业时,一方面因为要求内容复杂,一方面因为赶上假日,课下留给OO的时间比较少,因此出现了很多bug。即使在提交前经过数小时的修复,使得完成作业要求没出现大问题,但是打补丁式的修复方式,几乎耗尽了程序的拓展性。而等到第三次作业,在第二次那糟糕的基础上,很难再进行修改,特别是第三次的多轿厢实现起来比较复杂,对整体架构又是一次大的挑战,因此最后出现了数不清的bug,表现较差。
第三单元是JML,要实现一个社交网络,我们通过JML的实践,体会到了一种规范化的设计对程序实现效率的提升,并且由于要求及其准确,所以也便于编写测试程序。这一单元,主要难点除去对JML的理解和根据JML的测试程序之外,还考察程序的时间复杂度,对于压力测试的应对能力。这是我们第一次遇到时间复杂度的问题,所以要各尽所能,在现有的架构下,通过不同的算法,达到实现相同的功能,但是更优的时间复杂度。至于测试,则是通过Junit,在JML规范的基础上,进行白盒测试,针对每一个函数功能进行测试。
第四单元是UML,要求实现图书馆的管理系统,经过JML的学习,我们初步体会到模范化的优点,而UML就是一种通用并且图形化的模范语言。这一单元的主要难点在于独立设计架构,如果说一二单元是先编程再理解架构,第三单元是在已有架构上进行实现,第四单元就是独立设计架构,如何保证自己的架构效率高并且拓展性强,是一个比较复杂的问题。除此之外,还需要将自己的架构转化为UML图,图可以清晰明了的向其他人解释自己的架构设计,因此如何将图画的简单明确也是我们需要学习的目标。
总而言之,从第一单元到第四单元,我们训练了基本的面向对象的设计思想,初步尝试了多线程,并且理解了模型化对开发的帮助。最后,我们终于有了从设计架构到实践开发的一系列基本的开发,虽然不敢说能够熟练完成,但至少也是一次尝试。除此之外,OO课程独特的设计,一次次的弱侧,强测,互测,将成为我本科生涯中难以遗忘的经历。