BUAA OO 2024 第四单元总结

李卓远-21377153 学生 2024-06-17 13:53:02

正向建模与开发

在软件工程中,正向建模与开发是指从需求分析开始,通过系统化的过程逐步构建软件系统的方法。这种方法通常包括需求分析、系统设计、代码实现、代码测试、部署和维护等阶段。正向建模与开发通常与“反向建模与开发”相对比,后者指从已有的软件系统出发,通过分析其行为和代码来提取出系统的设计和需求。正向建模着重于从抽象到具体的开发过程,是最传统也是最常见的软件开发方法。

在本单元中,我们的任务是通过正向建模的方法,设计并实现一个图书管理系统,其中设计阶段涉及到类图、顺序图、状态图等UML图的绘制。在完成作业的过程中,我按照正向建模的方法,先仔细阅读指导书并画了草图以明确需求进行整体的规划,包括需要设计哪些类、类之间怎样交互等,而后开始进行更为详细的设计,包括构思每个类需要提供的属性和方法,并绘制类图、顺序图、状态图等UML图。在设计完成后,开始实现各个类和方法,并根据实际代码编写的需要调整自己的UML图,以保证代码的准确性,虽然刚开始绘制UML图有些生疏(以及StarUML确实不大好用),但正向建模的方式确实比起直接手搓代码显得事半功倍,在实现代码时也更加胸有成竹。在代码实现完成后,我进行了单元测试和黑盒测试,验证了代码的准确性。

经过本单元的作业实践,我也认识到正向建模与开发的重要性,虽然前期需要费一定脑力精力进行架构设计,但它能够使得我们设计出的系统更加合理且有更好的可维护性。

本单元作业架构设计

类图

本单元最终类图如下:

img

笔者采用如下架构:在MainClass类中完成对输入的初步处理,然后在核心的Library类中分发完成各个操作,包括与AppointmentOffice类、BorrowAndReturnOffice类、BookShelf类、BookDriftCorner类以及各个User之间的交互。每个类的功能如下:
MainClass:处理输入,并将指令传递给Library类进行处理。
Library:整个代码体系的核心,支持整理、借书、还书、续借、捐书、预约等操作,与其他功能类进行交互。
BookShelf:模拟图书馆书架,支持查询在架书籍,以及图书的借阅和放回。
AppointOffice:模拟图书馆预约处,用一个容器存放当前接收到的预约,并在整理时处理预约单。
BorrowAndReturnOffice:模拟图书馆借还处,支持暂存书、送回书的功能。
User:模拟图书馆的用户,支持借书、捐书、还书等交互功能,并为每个用户管理一个信用分。
BookDriftCorner:模拟图书漂流处,支持图书查询、借阅、还书等功能。
Order:记录用户的预约订单,存放在AppointOffice类中。
Book:记录一本书的相关信息,以便于查找。

代码设计和UML模型设计之间的追踪关系

在软件开发的过程中,需求的变更以及扩展是很常见,我们的架构设计也是一个动态变化的过程。在本单元中,我们需要在每次作业迭代中更新自己的已有UML图,并引入新的UML图(状态图、顺序图)来更好地刻画架构关系,并基于此更新自己的代码来确定设计和实现的一致性。

总的来看,我的代码设计和UML模型设计之间呈现出了良好的追踪关系,体现在:

  1. 一致性:代码与UML图的一致性是最基本的要求,即代码中的每一个类、方法、属性都能在UML图中找到对应的部分,反之亦然。在代码实现的过程中,我会根据UML图中的设计来实现代码,确保代码的正确性。
  2. 可追溯性:对于UML图中的每一个组件,都有代码中的对应的实现,且代码中的每一个部分也都能够在UML图中找到对应的部分,这样在代码出现问题时,可以通过UML图快速定位问题所在。其中,类图描述了代码实现中的类和类之间的关系,顺序图描述了代码实现中预约图书的过程,状态图描述了图书的状态变化。
  3. 更新迭代:在更新代码的时候,难免会因为设计阶段没有考虑周到而需要对UML图进行一定的修改,比如需要增加辅助方法、或是传入的参数没考虑全面,这时我的做法在代码中进行标记,最后集中更改相应的UML模型,以确保代码和UML模型的一致性。

架构设计思维演进

第一单元

第一单元我们需要实现对表达式的解析和化简,在第一单元的学习中,虽然经历了一些起伏,但也算是完成了任务(不是那么顺利)。这是还没有很成熟的架构设计的思想,主要还是借鉴了往届同学的架构。在第二次作业中,我在处理运算中化简合并同类项时因为需要大改,没有下定决心对架构进行彻底的重构,这使得第二次作业狠狠TLE,并在第三次作业中进行了大规模的重构。这一经历教会了我:需要细致地规划并及时修正错误,调整架构,不然迟早会爆雷。

第二单元

第二单元中,我们学习并实践了Java的多线程编程,并完成了一个多线程电梯任务调度。尽管这一阶段的设计架构较第一阶段有所成熟,但仍有改进空间。这也限制了我在电梯调度策略上采用更优的设计,只使用了较为基础的分配策略。另外在这一阶段的学习中,我还了解并实践了多线程中常用的生产者-消费者模式,这提供了一个非常经典的架构设计的思路。

第三单元

第三单元主要涉及JML规格化设计,模拟实现一个社交网络。这部分的架构设计自由度较低,主要根据已有的规格实现具体的代码,并注重算法性能的优化。尽管如此,官方提供的架构设计仍然为我提供了非常好的参考,也让我认识到事先拥有一个好的架构并在此基础上进行代码实现能够事半功倍。

第四单元

第四单元中我学习并实现了UML正向建模与实践,并完成了一个模拟图书馆系统,架构设计也是这一单元的重点内容,我更加深入地理解了正确的架构设计与代码实现应如何协调配合。在实际设计时,根据正向建模的方法,先对需求进行分析确定大致架构,然后绘制UML图以描述类间关系、类间消息传递过程、状态转换,分别对应于类图、顺序图、状态图,接着再进行具体代码实现,最后根据代码实现过程中的需要对UML图进行完善和补充。在这一单元的联系中,我更加注重类的需求与功能以及类间的交互,实现思路也更加清晰,视野从一行一行的代码提升到了整个架构。

测试思维演进

第一单元

在第一单元的开始,我缺乏测试经验,导致在强测中有爆出过很粗心的bug,在互测中也往往就是随便交几个测试点拿个基础分,或者碰运气撞对几个,并没有很好的测试思维。

第二单元

然而从第二单元开始,代码难度再上一个台阶,互测的强度开始显著提升。我开始尝试构造一些临界数据,来检验自己的代码以及在互测中实施hack。

第三单元

第三阶段的单元测试为我提供了新的测试思路(准确来说是温习了在OOpre中的测试思路),这帮助我更好地检验自己的代码的正确性。在互测方面,我也能够进行白箱测试定位到容易出错的代码部分对有漏洞的代码进行精准打击,取得了一定的成效。

第四单元

第四阶段我继续采用原先的测试思路,进行随机和临界测试等。完善的测试很好地保证了我的代码的正确性。

课程收获

通过一学期的《面向对象设计与构造》课程,我深刻感受到这门课程的挑战性和价值,并掌握了层次化设计、线程安全设计、规格化设计、模型化设计等设计方案。它不仅展示了面向对象的思维模式,并通过四个单元的迭代开发实践,深化了我们对面向对象的理解和应用能力。另外,不同于大一阶段的程序设计,本课程中完成的作业都是规模更大且具有迭代性的,显著增强了我的码力以及面对复杂系统的debug能力。通过这门课,我在架构设计和测试思维上都有了显著提升,这将为我的未来学习和工作奠定坚实的基础。

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

301

社区成员

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

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