BUAA_OO_2024 Unit 4 BLOG

邝晓文-22373445 学生 2024-06-13 23:32:41

BUAA_OO_2024 Unit 4 BLOG

任务简介:建立图书管理系统,需要完成的任务为实现简单书籍交易的模拟和查询,学习目标为锻炼程序架构的设计和抽象能力,以及UML建模能力(包括类图、状态图和顺序图)。

正向建模与开发

正向建模与开发是一种工程和设计方法,这种方法强调从概念到最终产品或系统的逐步构建过程,强调系统性和顺序性,有助于确保每个阶段都得到充分的考虑和执行。  

在本单元中,有意识地采取了“正向建模”的开发过程,即在开展代码的细节实现前,先分析需求、进行概念设计,绘制了初步的UML类图

正向开发的过程,让我感觉是在从绘制设计草图开始搭建一栋房子,它与“缺啥补啥”的室内装修不同,你需要在房子未动工前就设计好布局和隐藏在水泥之下的水电布线。而在我们的开发过程中,这就相当于在真正写代码前确定好需要有哪些类和类与类之间的关系

在实际的操作过程中,前期确定需要建立哪几个类来实现图书馆的各项功能确实花费了一些时间,并且在实际代码实现的过程中,也发现了很多不合理之处,需要反过来修改设计的UML类图,但是三次迭代结束后,会发现架构设计的总体框架在第一次确定后基本延用,并且迭代增加的各项功能很多都可以用到原有的数据结构和方法,我才慢慢意识到前期确立下一个好的架构是多么重要。我想我会在今后继续使用这种开发方法,做一个好的架构设计师。

架构设计

  • UML类图

img

本次作业围绕“图书”“命令”“用户”几个核心概念展开,为实现指导书中所要求的各项功能,设计了LibraryBookReservationCirculationDeskStudent四个类,它们的主要功能分别是

  • Library:负责处理分配主类Main传送而来的各种请求,同时负责管理书架及后期漂流角书籍及其信息。
  • BookReservation:预约处,当书籍从书架送至预约处后则交由预约处管理,有相关数据结构记录书籍送达日期及目标预约,需要实现对逾期书籍进行清理并移送至书架的功能。
  • CirculationDesk:借还处,当书籍由于学生借阅变动后可能由借还处进行管理,并要有开闭馆时的整理以及捐献书籍转为正式书籍过程的实现。
  • Student:学生,是产生书籍借阅、查询命令的主体,可以拥有不同类型的书籍,也可以拥有不同类型书籍的预约。

本次架构设计的总结反思

  • 可以直观地看出,本次作业中所涉及到的类很少,对于书架、漂流角等概念并没有设计专门的类来实现,Library内涵盖的内容似乎过于丰富,这之中或许有本人“面向作业偷懒”的成分,但从层次化设计的角度来说,多加考虑些或许有更好的实现方式。
  • 但是本次“先设计再实现”的过程完成较好,UML模型设计是合理的,在代码设计中依照实现即可。

Unit 1-4 总结

架构设计思维的演进

Unit 1:通过对表达式的解析,学习如何层次化设计,也是在这个单元中,学习到递归下降法,并将其运用到自己的设计中。虽然前期在理解上花费了一些时间,但是在U1中摸索到如何去获得每次作业需要的知识以及如何去设计,为后续作业更好地完成奠定了基础。

Unit 2:多线程实时电梯系统,学习如何设计多线程程序,“锁与同步块”的概念被引入到设计。电梯调度的讨论度可以说是这几个单元之最,在开始前就听说“不好的架构在迭代中将面临重构的风险”,所以先了解了一些学长学姐的实现方式后才进行了架构的设计,例如将电梯的状态和动作进行分离,候乘表和调度器的设计细节等等。在多线程程序中,线程间的协作关系十分重要,如何保证共享对象的访问和修改的线程安全也是设计中的重要部分,但是起初我对线程并发的理解并不准确,设计时思维还没有从第一单元转变过来,导致出现了很多bug,debug的过程可以说是十分艰辛,但是这个单元也可以说是我收获最多的一个单元,为了弄清楚自己的架构设计在哪一部分出现了问题,主动去找了很多同学进行架构层面的交流,学习到了很多优秀的设计思路,所以这个单元教会我的是:当架构设计遇到瓶颈时不妨多多交流,或许困难都是信息差导致的。

Unit 3:规格化设计,在这一单元中,学习到什么是JML以及如何阅读JML,还有如何依照JML完成程序设计,至今仍记得吴际老师所说的“好钢用在刀刃上”,而这个单元正是教我们如何用在“高精尖”开发刀刃上的好钢——JML。理解规格和实现的分离也是这一单元中很重要的收获,虽然JML已经给出,我们需要做的工作看似只是简单的代码实现,但稍有不慎就可能出现超时,我们还要在正确性的基础上考虑如何优化

Unit 4:正向建模,相比于前几个单元有较为严格的设计要求,这一单元给了我们很多自我发挥的空间,而我也是依照先分析需求进行设计,再进行代码开发的顺序完成作业,我认为这种正向建模与开发的过程还是好处多多,它确实帮助我避免了很多由于前期设计不周慌忙开始而导致的错误,也不会只见树木,不见森林,而我也可以运用在前几个单元中积累的设计经验让代码看起来没有那么“丑陋”,可以说这一单元虽然强度低,但是自主独立进行了架构设计,感受还是很不一样的。

测试思维的演进

在本学期开始的时候,我关注的重点总是在于开发而非测试,但随着课程的深入以及在作业中遭受的重创,我开始正视测试的重要性,并且逐步学习如何去做好测试。

  • 在表达式展开和电梯调度中,我更多的用到的是黑箱测试,用大规模的数据作为输入,检查输出是否符合某种要求,在这些单元中,还需要进行边界测试、压力测试,确保程序在这些情形下也不会产生错误。
  • 从JML这一单元开始,才开始比较熟练地运用单元测试(虽然这在oopre中已经介绍),对最小的可测试部分即方法进行测试,同时还学习了功能测试、回归测试等,测试时考虑的角度也与以往不同,开始有针对性地测试那些新增的、易错的部分,包括本学期的互测机制也让我学习到很多测试技巧,曾经感觉看别人代码还是挺头大的,但是后面也能够通过构造样例和观察实现发现别人代码的漏洞。

课程收获——OO,再会

经过认证,OO确实是大二“三大涅磐”之一。
OO给我的感受是复杂的,它曾数次告诉我,其实你什么都不会,其实你什么都没学懂,但是回想起来,那些问题都似乎也被一个个解决了,所以它又让我觉得,我有能力解决一切问题。所以,在这门课程中,我不仅学习到如何去写代码,更学习到如何去解决一个问题,如何一步步解决一个你以为解决不了的问题。
我想起马原课老师说,一届又一届不同的学生总是在课上写着相同的OO作业,所以OO的痛苦看似是结束了,其实只是转移了。而我也要在这次告别后,去拥有新的痛苦,去感受,去怀疑,最重要的是,去学会如何将它们解决。
聚散终有时,再次感谢在oopre和四个单元中陪伴过、帮助过我的朋友们,我想这段共同的OO记忆会以某种方式与我们再会。

...全文
95 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

301

社区成员

发帖
与我相关
我的任务
社区描述
2023年北航面向对象设计与构造
学习 高校
社区管理员
  • YannaZhang
  • CajZella
  • C_ecelia
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧