「BUAA OO」第四单元总结

前言

本博客记录了笔者在面向对象编程第四单元的学习过程与相关思考,以及对本课程四个单元学习的总结(源码见Github)。

  • UML图绘制使用StarUML绘制

题目说明

面向对象编程第四单元的主题为:基于UML的层次化设计。

  • 第一次迭代:实现一个能够处理用户请求的图书馆系统
  • 第二次迭代:增加图书借阅期限限制;增加图书漂流系统
  • 第三次迭代:引入用户信用分系统;增加预约限制

三次迭代

由于后两次迭代增加的任务量较少,笔者在架构上并没有进行过多调整。

第十三次作业

第一次作业内容量相比前三个单元的第一次作业内容量都少了很多,架构设计容易了不少。

架构图

第十三次作业

第十四次作业

本次作业增加了图书漂流系统,需要对 Library 类的属性以及方法进行调整。

架构图

第十四次作业

第十五次作业

本次作业只增加了信誉积分系统,在架构上基本没有变化。

架构图

第十五次作业

正向建模与开发

正向建模与开发是指在工程开发中,先分析需求,然后设计整体架构,最后实现业务代码并完成后续测试。它是一种从抽象需求逐步细化到具体实现的过程,有助于开发者统一对于系统的需求、结构和行为的理解。

类图、状态图和顺序图是 UML 建模语言中常用的三种图,它们各自聚焦于系统的不同方面,但在整个建模与开发过程中共同协作,确保设计的一致性和完整性。

类图

类图主要描述系统的静态结构,展示系统中的类、接口、对象及其之间的关系(如继承、关联、聚合、依赖等)。它是对系统结构的高层次抽象,帮助设计者定义系统的构成模块以及这些模块如何相互作用。在正向建模中,类图是起点,它为后续的状态图和顺序图提供了基础框架和元素。

状态图

状态图描述一个特定类的对象在其生命周期内可能经历的各种状态,以及引起状态转换的事件。它关注的是单个对象的行为,揭示了对象状态变化的规则和条件。在正向建模过程中,状态图基于类图中定义的类来细化,为类的行为建模提供细节,确保设计时考虑到了所有可能的状态转换,从而保证系统的动态行为正确无误。

顺序图

顺序图展示对象之间的动态交互序列,包括消息传递的时间顺序,展示了在特定情境下对象如何协同工作以完成某项功能或任务。它以时间轴的方式直观地表示了方法调用的顺序和对象间的交互流程。顺序图的设计直接依赖于类图中定义的类和接口,同时结合状态图中定义的状态转移逻辑,确保交互过程的逻辑连贯性和一致性。

三种图保持一致的重要性

  • 确保设计的完整性
    类图定义了系统的基本组成和结构,状态图和顺序图在此基础上进一步描述了这些组成部分的行为和交互。三者的紧密配合确保了系统设计的全面性,避免了设计上的遗漏。

  • 促进团队协作
    通过保持这三种图之间的一致性,团队成员可以更好地理解系统的设计意图,减少误解和沟通成本。一致性的模型有助于开发人员、设计师和项目管理者之间建立共同的语言和理解。

  • 简化维护与迭代
    当系统需要修改或扩展时,保持模型间的一致性使得影响分析更加直接,便于定位和调整相关部分,而不会引入不一致性或错误。这对于长期的系统维护和迭代开发至关重要。

  • 验证系统逻辑
    通过对比和校验类图、状态图和顺序图,可以在设计阶段早期发现潜在的问题,比如状态遗漏、交互逻辑错误等,有助于提前修正设计缺陷,提高软件质量。

四个单元

架构设计思维的演进

说来惭愧,笔者的架构设计思维并没有明显的演进过程,第一单元的架构设计思路一直沿用到了最后一单元。从第一单元开始,笔者便本着“绝不重构”的原则书写代码,尽量在代码书写前先构想一个合理的架构,然后再开始敲代码。但无论如何,在总结时回想起来,还是有了很多新的认识:

  • 架构与需求挂钩:架构仅为需求服务,根据不同的需求往往会设计出截然不同的架构。架构设计能力也直接与程序员的代码水平相挂钩。
  • 可维护性:可维护的代码使得程序员能够更容易地理解、修改现有代码,能够有效地降低时间成本。可维护性与可扩展性可以有效地降低迭代的工作量。
  • 可扩展性:设计时应考虑未来可能的增长,确保系统能够容易地扩展以应对增加的用户量、数据量或功能需求。同时也应注意应在适当范围内预留扩展空间,毕竟过犹不及,过度预留会导致时间与精力的浪费。

测试思维的演进

  • 第一单元
    • 自己手搓简单数据检验基础功能正确性
    • 使用同学设计的评测机进行高强度的正确性测试
    • 自己手搓特殊/极端数据测试代码性能
  • 第二单元
    • 自己手搓简单数据检验基础功能正确性
    • 使用自己设计&同学设计的评测机进行高强度的正确性测试
    • 自己编写数据生成器测试代码性能
  • 第三单元
    • 自己手搓简单数据&编写 Junit 检验基础功能正确性
    • 使用同学设计的评测机进行正确性测试
  • 第四单元
    • 自己手搓简单数据检验基础功能正确性
    • 使用同学设计的评测机进行正确性测试

在第三单元系统性地学习了黑箱测试、白箱测试、压力测试等测试方法,对于代码性能测试等方面有了一个大致的了解。最遗憾的是在本学期没有能自己独立设计一个评测机,只完成了评测机的部分功能(数据生成器等)。

课程收获

个人感觉这门课程带给自己更多的是非知识性的收获,难以用一段话来总结。如果硬要写点什么,那么本人:

  • 在掌握面向对象编程思想的基础上,系统性地学习了面向对象编程的架构设计思想。笔者在第一单元第一次作业阅读了大量学长的设计思路以及设计架构后,才勉强地完成了自己的架构设计;而在后续的单元、作业中,笔者减少了对于往届学长代码的参考,更多地去主动思考并解决架构设计相关的问题。
  • 养成了先构想架构,再写代码的习惯。在面向对象课程的先修课程中,笔者几乎没有进行架构设计这一步,通读迭代要求之后直接进入代码书写环节。
  • 对并发设计进行了系统性的学习,了解了 IDEA 实现多线程的基本原理,获得了锁、死锁、阻塞、线程安全等相关问题的初步认识。
  • 掌握了很多新的算法,如递归下降、 LOOK、bidirectional-bfs 等;也自己尝试对一些算法进行了改进。
  • 提升了 java 编程的能力,能够得心应手地选择并使用恰当的容器、继承父类/实现接口…
  • 认识了很多友善的助教和同学。

在最后的最后回想起这一切,没有想象中结束的那份喜悦,只有一点抵达终点的释然。

试问岭南应不好,却道:此心安处是吾乡。

03-20
### BUAA 面向对象编程课程的核心内容 面向对象编程(Object-Oriented Programming, OOP)作为现代软件开发的基础范式之一,在BUAA的相关课程中得到了深入探讨。该课程不仅注重理论知识的学习,还通过实践项目强化学生对OOP的理解和应用能力。 #### 1. **课程目标** - 本课程旨在引导学生从传统的面向过程编程转向更加灵活高效的面向对象思维方式[^1]。 - 学生能够掌握核心概念如封装、继承与多态,并将其应用于实际工程项目中[^2]。 - 提升代码质量的同时降低维护成本,使开发者可以专注于解决复杂的业务需求而非纠缠于低效的实现细节[^3]。 #### 2. **主要教学模块** ##### (1) **基础概念介绍** - 封装:隐藏内部状态并提供接口访问机制;保护数据安全性和一致性[^4]。 - 继承:子类可以从父类获取属性和方法,减少重复编码量[^5]。 - 多态:允许同一操作具有多种表现形式,增强系统的灵活性和扩展性。 ##### (2) **工具和技术支持** - JUnit框架被广泛用于自动化测试环节,尽管部分同学对其强制性的覆盖率要求存在异议,但它确实有助于发现潜在缺陷并提高产品质量^。 ```java @Test public void testAddition() { Calculator calc = new Calculator(); assertEquals(4, calc.add(2, 2)); } ``` ##### (3) **实战演练——迭代作业体系** - 通过五个阶段逐步深化的知识点引入方式,帮助学员构建完整的OOP技能树。 - 初始阶段重点在于熟悉基本语法规则及简单类的设计思路;后期逐渐过渡至复杂场景下的综合运用能力培养。 #### 3. **常见反馈与改进建议** - 许多参与者反映JUnit学习曲线陡峭且缺乏足够的官方文档支撑,因此建议增设专门针对此主题的教学资源。 - 另外还有呼声较高的几点改进方向包括但不限于延长授课周期匹配现有任务负荷水平、提前阐明重要技术要点以便规避不必要的返工现象发生等等. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值