OO_Unit4_分析与总结
1 总结本单元所实践的正向建模与开发
在本单元中,我们主要实践了以下几种UML图,用于正向建模与开发:
1.1.1 类图 (Class Diagram)
类图用于描述系统中的类及其相互关系。通过类图,我们可以明确类的属性、方法以及类之间的继承、实现、关联和依赖关系。
- 类的定义:明确每个类的名称、属性和方法。
- 关系的定义:表示类之间的关系,包括继承(Generalization)、实现(Realization)、关联(Association)、聚合(Aggregation)和组合(Composition)。
- 可视化结构:类图提供了系统结构的可视化表示,有助于理解和设计系统架构。
1.1.2 状态图 (State Diagram)
状态图用于描述类的生命周期,即对象在其生命周期中所经历的各种状态及状态之间的转换条件。
- 状态:表示对象在某一时刻的条件或情况。
- 事件:触发状态转换的事件。
- 转换:从一个状态到另一个状态的变化。
- 状态行为:在进入状态、退出状态或在状态中持续存在时执行的行为。
1.1.3 顺序图 (Sequence Diagram)
顺序图用于描述对象之间动态交互的顺序。它展示了对象之间消息传递的时间顺序,帮助理解系统的动态行为。
- 对象:参与交互的对象。
- 生命线:表示对象存在的时间跨度。
- 消息:对象之间传递的信息,分为同步消息、异步消息、返回消息等。
- 激活:表示对象在某一段时间内执行的操作。
1.2 实践过程
1.2.1 需求分析与类图设计
通过需求分析确定系统中的主要实体及其关系。
绘制类图以可视化系统的静态结构。
1.2.2 状态图设计
识别关键类的状态及其转换条件。
绘制状态图以描述对象的生命周期及其状态变化。
1.2.3 顺序图设计
确定系统中关键用例的动态交互过程。
绘制顺序图以展示对象之间的消息传递顺序。
1.3 总结
通过类图、状态图和顺序图的结合使用,我们能够全面而深入地进行系统的正向建模与开发。从静态结构到动态行为的多层次描述,确保了我们对系统的理解和设计的准确性与完整性。这些UML工具的应用不仅帮助我们理清了系统的内部逻辑,也为后续的开发提供了清晰的指导。
2 总结本单元作业的架构设计,并对比分析最终的代码设计和UML模型设计之间的追踪关系
2.1 UML类图
2.2 架构设计
Main
:程序的入口点,负责初始化图书系统和分析各类信息传入Library
类处理
Library
:图书馆系统类,用于交互用户的各个请求,并且设置有一HashMap
类型变量Bookshelf
作为书架,实例化有以下三类地点,四个对象之间进行信息交互
Ao
(
a
p
p
o
i
n
t
m
e
n
t
o
f
f
i
c
e
appointment\;office
appointmentoffice):预约处,用于处理用户的预约请求
Bro
(
b
o
r
r
o
w
a
n
d
r
e
t
u
r
n
o
f
f
i
c
e
borrow\;and\;return\;office
borrowandreturnoffice):借还处,处理借书和还书请求
Bdc
(
b
o
o
k
d
r
i
f
t
c
o
r
n
e
r
book\;drift\;corner
bookdriftcorner):图书漂流角,用于存储非正式书籍,处理非正式图书升级行为
Student
:学生类,用于存放学生信息和他持有的书籍,以及检查其持有图书当前是否合法
Students
:学生总集合,用于通过学生ID
取出特定学生进行操作
2.3 比对分析
2.3.1 类图 (Class Diagram) 与代码设计
- 追踪关系:
- 类结构:类图中的每个类应在代码中都有对应的类定义,包括类名、属性和方法。
- 继承/实现关系:类图中定义的继承(Generalization)和实现(Realization)关系在代码中通过extends和implements等关键字实现。
- 关联关系:类图中的关联(Association)、聚合(Aggregation)和组合(Composition)在代码中通过成员变量和构造方法等实现。
- 对比分析:
- 一致性检查:代码中的类、属性、方法完整且与类图设计一致。
- 关系验证:代码中的继承、实现以及类之间的依赖关系与类图中定义的关系一致。
- 命名规范:类名、方法名和属性名在代码和类图中保持一致,便于追踪和理解。
2.3.2 状态图 (State Diagram) 与代码设计
- 追踪关系:
- 状态枚举:状态图中定义的不同状态在代码中有相应的枚举类型或常量定义。
- 状态转换:状态图中的状态转换逻辑在代码中通过条件语句(如if、switch)或状态机模式实现。
- 事件处理:状态图中触发状态转换的事件在代码中有对应的事件处理机制。
- 对比分析:
- 状态定义:代码中定义了所有状态图中的状态。
- 转换逻辑:代码中的状态转换逻辑与状态图中描述的一致,确保事件触发和状态变化准确。
- 行为一致性:确保进入状态、退出状态和持续状态的行为在代码中得到正确实现。
2.3.3 顺序图 (Sequence Diagram) 与代码设计
- 追踪关系:
- 对象交互:顺序图中描述的对象之间的交互在代码中通过方法调用体现。
- 消息传递:顺序图中显示的消息和方法调用在代码中实际实现,包括参数传递和返回值处理。
- 时间顺序:顺序图中的调用顺序在代码执行过程中保持一致,确保逻辑正确。
- 对比分析:
- 方法实现:代码中实现了顺序图中涉及的所有方法和消息传递。
- 调用顺序:代码执行时的方法调用顺序与顺序图一致,确保逻辑流程的正确性。
- 异常处理:确保代码中处理了顺序图中可能未详细描述的异常和边界情况。
3 总结自己在四个单元中架构设计思维的演进
3.1 Unit 1
第一单元主要是对递归下降方法的实现,在最初是不是特别理解这种思想,实现上有一些疏漏,以及整体代码构建不佳,以至于后续两次迭代实现都不是非常顺利。
在此单元学习后,我在处理问题时尽量先实现一个比较好的方法体系构建再继续进行扩展,防止像第一单元出现的这种问题再次出现。
3.2 Unit 2
第二单元主要是对多线程的学习。在其中由于一些锁忘记加了导致影子电梯实现时出现了一些安全性问题,并且在最后一次迭代时由于安全性问题难以查找在影子电梯算法中的何处,选择直接替换影子电梯算法为随机调度(得益于第一单元的教训,我这里的设计只需要把影子电梯的策略类直接抽离换成随机调度策略类即可,其他部分均不用改变)。这个单元是四个单元中最难的一个。整个单元中的CTLE不能单步调试,只能依靠打印来debug。不过经历了这个单元后,我对多线程,锁,同步与互斥,生产者-消费者模式都有了一定的了解,这也为之后os的学习打下了基础。
3.3 Unit 3
第三单元主要是对JML规格设计的学习。在这一单元中只需要读懂JML语言的“代码要求”并且加以实现即可,实现方法非常的灵活,这也就造就了课程组对性能进行检查导致部分数据点性能不过关的问题。在经过第一次作业TLE的教训后在后续实现中均选择动态更新各种数据集以达成查询不用整体重构数据集的效果。
3.4 Unit 4
第四单元主要是对UML的学习。在本单元的学习中,课程组强调了我们需要深入理解并掌握正向建模与设计的方法,同时提倡我们利用UML图作为辅助工具来优化程序设计流程。我深刻认识到,在开始编程之前预先规划好一个稳固的架构是至关重要的。这样的做法不仅有助于我们将复杂的任务拆解为若干个易于管理的子问题,从而简化理解过程,还能为后续的详细实现和未来的功能拓展提供明确的指导。当然,我也意识到自己在架构设计方面的能力并非一蹴而就,而是需要在不断的编写和修改过程中逐步积累和提升。尽管如此,我仍感到自豪,因为我已在这学期内取得了显著的进步,对架构设计的理解与应用能力得到了显著提升。
4 总结自己在四个单元中测试思维的演进
4.1 Unit 1
仅测试一些特殊情况,大规模数据点测试选取同学构建的dpo网站进行测试,获得错误数据点后通过不断删减部分表达式进行对拍来简化错误数据点,用最终的数据点来进行调试。
4.2 Unit 2
构造一些在时间上强度大的情况,成功hack到一些同学的实现,发生了TLE(这个数据点在我看到课程组的数据范围时就已经想到可以这样构建了,并且在第二次使用影子电梯也成功测出了我的电梯的问题)。
4.3 Unit 3
尝试自己采用@Parameters
进行随机参数化测试,成功了一部分(第一次作业的图test成功了,后续由于随机生成策略问题最终选择特定数据点测试),之后仍选择采用github上其他同学构建的测试机。
4.4 Unit 4
仅采用同学的dpo网站进行测试。
5 总结自己的课程收获
通过本课程的学习,我在面向对象程序设计方面获得了显著的提升和深刻的理解。以下是我的主要收获:
首先,我学习了多线程编程,了解了如何在Java中创建和管理线程,并解决并发编程中的挑战,如线程同步和死锁问题。这使我能够设计和开发高效的并发应用程序,提高了系统的性能和响应能力。
通过JML的学习,我学会了为Java程序编写形式化规范,以便进行程序验证和调试。这一技能提升了我编写高可靠性和可维护性代码的能力,并增强了我的软件工程实践经验。
最后,在UML的学习中,我掌握了使用类图、状态图和顺序图进行系统建模的方法。这帮助我更好地进行系统设计和架构规划,确保设计与实现的一致性,并提升了我与团队成员沟通和协作的效率。
综合来看,这门课程不仅强化了我的面向对象编程技能,还提供了从解析、并发、形式化规范到系统建模的全面知识体系,为我未来的软件开发实践打下了坚实的基础。