第四单元:图书馆模拟系统 + OO课程总结

一.写在前面

第四单元的目标是以一个图书馆模拟系统为例,锻炼同学们对程序架构的设计和抽象能力,以及加强对 UML 图的绘制训练。在此之前,需要掌握 UML 图的相关知识,以及 StarUML 的使用方法。这个单元任务较为简单,主要是要求在编写代码之前做好清晰的架构设计和抽象能力的训练,绘制uml让自己的架构更加清晰明确。
回顾四个单元的里程,有不一样的理解和体会。

二.任务要求

整体要求

以一个图书馆模拟系统为例,完成UML 图的绘制训练和代码编写。

第一次作业

设计并实验一个符合指导书描述的图书馆模拟系统,并且设计程序架构,绘制并提交 UML 类图,然后根据所设计的架构进行编程实现,并提交 程序代码 。

第二次作业

在第一次作业的基础上,引入图书管理处这一部门,同时将单机图书馆系统升级为支持校际借阅的图书馆网络,完成程序的迭代,并且绘制提交UML状态图。

第三次作业

在前两次作业的基础上,引入图书的借阅期限,以及逾期归还的违规行为。当学生到借还管理员或自助机器处还书时,会查询是否超过借阅期限。若为逾期归还,则学生首先到 借还管理员 处缴纳罚款,然后回到原部门成功完成还书。并且需要绘制顺序图。

正向建模过程

我所理解的正向建模,是指用于预测系统或过程的行为和结果,即基于已知的输入和模型参数,通过模型和算法计算出输出结果的过程,这么做可以帮助理解系统的运行机制、评估系统性能,并作出决策或预测系统在不同条件下的行为。
在本次作业中,根据指导书所描述的图书馆管理系统以及所要求的输出,我总体上设计了Student类和Library类进行交互,学生在图书馆中查书拿书,但因为图书馆中不同的管理员提供给学生不同的功能,因此我还建立了几类管理员与学生进行交互,交互的对象是Book类,有点像同一时间线的读者写者模式。
整体思路并不难,因为这个图书馆管理系统的模式实现很符合面向对象的特点,每个对象功能不同且区分的特别清晰,因此在实现的时候只需要根据不同对象按照不同特点进行代码实现即可。

架构设计

在这里插入图片描述
总共12个类,在正向建模过程的时候已经大体分析了我的结构思路,总体风格还是比较面向对象的,因此我编写代码的大题过程就是分别实现各个模块的功能,然后再在mian方法里实现交互。
在这里插入图片描述
本次作业涉及状态转移,首先根据command的不同,从起始状态分别流向了borrow(借书),smear(损坏),return(还书),order(预定),arange(整理),其中return和order因为涉及校际借阅,因此分成了transport和received两中状态,borrow也因为是否借到书分为refused和lent最后运行完毕指向结束,与我代码设计对应。
在这里插入图片描述
顺序图表示了一个预定书的流程,比较简单。

结果分析

第一次作业

第一次作业强测分数是100,因为这次有标准的对与错,答案是唯一的,因此测评比较方便,在进行充分测试之后大体上没有什么问题,花费时间较多的是类图的完成,许多细枝末节的问题需要处理。

第二次作业

第二次作业强测分数是90,我也进行比较充分的测试,但是有一个涉及java语法的小细节没有注意到,因此RE(Runtime Error)了一个点,就是在进行Book类存储的时候,不同的容器同时存储了同一个Book,在一个容器里修改Book时会同时影响另一个容器里Book,导致问题出现,因此此时两个容器应该装不同的Book,即深克隆和浅克隆的问题。对于状态图,因为设计比较自由,只需要将自己状态图与

第三次作业

第三次作业强测分数是100,因为本次作业比较简单,就是新增了逾期归还的违规行为,因为代码改动很小,进行简单的测试就能过。

三.架构设计思维的演进

这门课程叫做面向对象,因此我的设计思维的演进也是从最开始的面向过程逐步从面向对象推进的,在第一单元的架构设计中,我主要关注系统的功能实现,采用单一层次的架构思维,按照面向过程思路去做,系统的各个模块被组织在一个层次结构中,功能实现和数据流动比较简单。这种架构思维注重功能的实现和代码的可维护性,但对于系统的可伸缩性和复杂性缺乏考虑,因此第一单元的迭代举步维艰,为此还重构了一次。
经过第一单元一个月的洗礼,我逐渐懂得了面向对象的思想,随着电梯系统的规模和复杂性增加,架构设计思维需要转向分层架构。分层架构让我将系统划分为不同的层次,每个层次负责不同的功能和责任。这种架构思维注重模块化和复用性,可以提高系统的可维护性和扩展性。因此第二单元的迭代轻松许多。
第三单元因为是jml,没有结构的设计,因此设计并未有很多变化。
第四单元是图书馆管理系统,我开始思考不同的结构实现功能是否是合理的,是否符合实际,能满足个性化的需求,单一的模块分离出来可否实现业务流程。

四.测试思维的演进

对于自己设计的测试,我几乎是从无到有的,第一单元的时候,我几乎没有做任何的测试,单纯依赖课程组中测提供的中测和自己手动构造的极弱数据点,这导致的了我第一单元强测分数不高,这让我意识到了测试的重要性,之前我单纯依赖自己逻辑的严密性和构造设计的完整性,后来发现当工程量渐渐变大时,单靠人工的逻辑很容易犯错,因此需要自动化测试。
因此从第二单元开始,我依靠自动化的海量测试完善自己的设计,来发现自己代码潜在的编码错误、逻辑错误和边界条件等问题,不论是逻辑完整度还是还是复杂度都有明显的优化。
后来经过深入学习,发现自动化测试也分为许多方面–黑箱测试,白箱测试,压力测试等等……这才知道原来一个设计的测试是那么复杂,需要特别全面,有时候比一个设计的成形甚至付出还多,因此在第二单元后期我的测试更加全面,因为对于时间有要求,因此对于这方面涉及也比较多。然后依照测试,我还会对程序的内部逻辑和实现方式进行优化,让自己的代码变得更加完美。
总体来说,我的测试思维是从关注功能验证到关注内部逻辑和代码实现,再到关注测试效率和自动化,这个演进过程体现了我的测试思维与软件开发的紧密结合,通过不断的改进和创新,提高了我的软件质量和开发效率。

五.课程收获

首先,我的代码能力得到了很大的提升,这是我第一次编写这么大的代码开发,也是第一次进行迭代,我逐渐具备扎实的编程技能,能够熟练运用所选编程语言进行开发。这包括对语法、数据结构、算法和设计模式等的深入理解,能够编写高质量、可维护、可扩展的代码。
其次,我的架构设计能力有很大的提升,思想渐渐从面向过程向面向对象转变。代码工程设计需要有良好的系统思维和架构设计能力。能够将复杂的需求和问题分解为模块化的组件,并设计出合适的架构模式和系统结构。理解系统的关键模块、组件之间的交互和依赖关系,确保系统的可扩展性、可伸缩性和性能。这些都是课程中慢慢领悟的。
再者,我的测试能力也之间提升,我慢慢了解到,代码工程设计需要具备有效的测试能力,包括单元测试、集成测试和系统测试等。能够编写高质量的测试用例,覆盖系统的不同功能和边界情况,确保代码的正确性和稳定性。同时,也要了解自动化测试工具和测试框架,提高测试效率和准确性。

六.对于课程的建议

希望这门课的难度可以层层递进,或者可以提前提供一些指导和预习建议,第一周直接布置一个较大的工程对于一个基础弱的人来说压力特别大。
指导书的编写希望更加完善,有些地方解释的比较含糊不清,理解难度比较大。

最后,感谢课程组的老师和助教一学期以来的辛苦付出!!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值