BUAA-OO 第四单元总结

赵泽文-22371150 学生 2024-06-17 19:08:06

总结本单元所实践的正向建模与开发

正向建模是一种自顶向下的开发方法,它从业务需求开始,逐步细化到具体的实现细节。在本单元中,我通过以下几个步骤实践了正向建模与开发:

  • 需求分析:首先明确了图书馆管理系统的基本功能和业务规则,包括图书的借阅、归还、预约等。
  • UML 建模:使用 UML 工具(如 StarUML)创建了类图、状态图和顺序图,这些图详细描述了系统的静态结构、状态变化和对象间的交互。
  • 增量开发:作业 15 作为增量开发的一部分,我们在前两个作业的基础上进一步引入了用户信用分系统,增加了系统的复杂性。
  • 代码实现:根据 UML 模型,逐步实现了系统的功能,确保代码与模型保持一致性。

我认为, 几种 uml 图中最"有用", 或者说能非常明显地感受到不是为了画图而画图的, 就是类图了.

可能也跟顺序图和状态图是后两次作业的有关, 顺序图和状态图, 对我实际代码开发的影响微乎其微.

说白了, 已经确定好的架构, 又不敢大改, 几乎只是对着代码画图了. 想要响应要求去先画再写代码, 也只能是先画新增的一点点内容了.

如果三种图都是最开始就画或许好一点, 反正我现在是没有感受到状态图和顺序图的作用.

但是类图不一样, 类图是真的能够帮助我理清思路, 确定类之间的关系, 以及类的属性和方法.

总结本单元作业的架构设计,并对比分析最终的代码设计和 UML 模型设计之间的追踪关系

img

架构设计概述

本单元的架构设计围绕图书馆管理系统,涉及以下几个核心组件:

  • Library:作为系统的核心,接受请求并协调各个子系统的工作。
  • AppointmentOfficeBorrowReturnOffice:分别处理预约和借还业务。
  • BookShelf:管理书架上的图书。
  • UserOrder:代表用户和他们的预约订单。

我觉得我的架构最特殊的一点, 就是容器的分层管理.

  • BookContainerAppointmentOffice 包含的 OrderContainer 实现容器操作的统一管理和分层管理,这是一种高效的设计策略,可以提高代码的可维护性和可扩展性。

  • BookContainer:这一层负责管理图书馆中所有图书的副本,它只关心图书副本的存储和基本操作,而不涉及图书副本的借阅状态或用户关系。

  • OrderContainer:在AppointmentOffice内部,OrderContainer 管理用户的预约请求(以及相应请求分配的书)。它负责更复杂的逻辑,如订单的过期检查、订单与用户的关联等, 在 ao 中的两个实例对应响应和未响应的请求。

这样设计的优势

  1. 可维护性:由于容器操作的统一性,对容器进行修改时,只需要关注一个接口,减少了维护成本。

  2. 可扩展性:当需要添加新的容器类型或新的容器操作时,可以很容易地集成到现有系统中,而不需要对现有代码进行大规模修改。

  3. 复用性:统一的容器操作接口允许在不同的上下文中重用相同的容器实现,提高了代码的复用性。

  4. 解耦:分层管理有助于将系统的各个部分解耦,使得每一层可以独立变化,而不会对其他层产生影响。

  5. 灵活性:在面对需求变更时,分层管理的容器可以灵活地调整其内部实现,以适应新的需求,而不破坏现有接口。

代码设计与 UML 模型追踪关系的个人体验

在将 UML 模型转化为代码时,我遵循了以下原则:

  • 一致性:我确保了代码中的类和 UML 类图中的类一一对应,每个类的方法和属性都与 UML 模型中的描述一致。

  • 扩展性:在设计类的时候,我考虑到了将来可能的扩展,比如通过使用接口和抽象类来允许未来添加新的功能。

  • 可维护性:我通过模块化设计和良好的封装,使得代码易于理解和维护。

总结自己在四个单元中架构设计思维的演进

回到第一节课的课程介绍

img

四个架构设计能力要求, 分别对应四个单元

  • 层次化架构设计能力
  • 线程安全设计能力
  • 规格化设计能力
  • 模型化设计能力

第一单元:层次化架构设计能力

在第一单元的学习中,我体验了从无到有的过程。课程组提供的架构为我搭建了一个基础框架,让我能够开始理解层次化架构的重要性。通过模仿和实践,我学习了如何将复杂问题分解成多个层次,每个层次负责不同的职责。虽然一开始我的设计能力较弱,但通过这次作业,我开始意识到提前设计的重要性,并在后续的增量开发中尝试应用这一思想。

第二单元:线程安全设计能力

第二单元的重点是多线程,这对我的架构设计能力提出了新的挑战。我需要考虑如何在多线程环境中保持数据的一致性和安全性。在这一单元中,我犯下了策略类和调度类关系不清晰的错误,这导致我不得不多次重构架构。这个过程虽然痛苦,但教会了我如何更清晰地定义类和模块之间的接口,以及如何设计一个能够适应并发环境的稳定架构。

第三单元:规格化设计能力

第三单元的学习让我从规格的角度理解架构设计。JML的使用让我认识到了规格说明在软件开发中的重要性。虽然我在这个单元中没有太多机会进行自己的架构设计,但我学会了如何根据规格说明来验证和测试我的代码。这种从规格出发的设计方法,让我的设计更加严谨和规范。

第四单元:模型化设计能力

第四单元是我第一次真正体验到模型化架构设计的力量。通过 UML工具,我能够在编写代码之前就深思熟虑地设计架构,并将它们以 UML 图的形式表达出来。这个过程不仅锻炼了我的设计思维,也提高了我的抽象能力。如何将现实世界的问题转化为模型,并用模型来指导实际的代码实现。

个人感受

在整个课程的学习过程中,我从一个对架构设计一知半解的状态,逐渐成长为一个能够独立进行复杂系统设计的开发者。我学会了如何从不同角度审视问题,如何将问题分解并设计出层次清晰、模块化的系统。我也意识到了设计之初就要考虑到未来可能的扩展和变化,以及如何在设计中融入线程安全、规格化和模型化的思想。

总结自己在四个单元中测试思维的演进

初始阶段:手工构造数据

一开始,我对测试的理解较为基础,主要通过手工构造数据来测试程序的不同部分。我会特别关注边缘情况和极端数据,以确保程序在非正常或边界条件下的行为符合预期。这种方法虽然有效,但效率较低,且容易遗漏某些情况。

发展阶段:数据生成器的使用

随着作业复杂度的提升,我开始使用数据生成器来随机生成测试数据。这大大提高了测试的覆盖率和效率。在第二单元的多线程环境中,我主要依靠随机数据生成来模拟并发情况,同时在互测阶段,我依然会手动构造一些极端或特殊的数据来测试程序的鲁棒性。

成熟阶段:JML与JUnit的结合

在涉及JML的单元中,我对测试的理解达到了一个新的高度。JML不仅为我的程序提供了规格说明,也为测试提供了明确的目标。通过将JML规范直接转化为JUnit测试用例,我能够系统地验证程序的每个部分是否符合预定的规格。这种方法显著提高了测试的准确性和有效性。

在整个课程的学习过程中,我的测试思维经历了从直观到系统,从手动到自动化的转变:

  • 直观测试:依赖于直观和经验来构造测试用例,这虽然有助于理解程序的基本行为,但缺乏系统性。

  • 系统测试:随着对数据生成器的引入,我开始进行更系统的测试,覆盖了更广泛的输入场景,包括随机和边界条件.

  • 自动化测试:JUnit自动化测试.

通过整个课程的学习,我体会到了测试在软件开发中的重要性。测试不仅是验证程序正确性的手段,也是推动程序设计和实现的重要动力。我学会了如何根据不同的需求和环境选择合适的测试方法,并通过测试来提高代码的质量和可靠性。

我意识到,无论是手动构造数据、使用数据生成器还是结合JML进行自动化测试,每种方法都有其适用的场景和优势。在未来的开发工作中,我将继续运用和发展这些测试技能,以确保交付高质量的软件产品。

总结自己的课程收获

尽管过程中遇到了很多困难和挑战,但每一次克服它们都让我的设计能力更进一步。我感到非常庆幸能够在这样的课程中学习和成长,我相信这些经验将对我的未来职业生涯产生深远的影响。

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

302

社区成员

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

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