2024OO第四单元总结

杨汇一-22371376 学生 2024-06-16 02:46:20

1. 正向建模与开发

正向建模是一种用于描述和分析系统或过程的建模方法。它基于系统的目标和行为,以及各个组成部分之间的相互作用关系,从而生成系统的模型。在正向建模中,建模过程从系统的高层目标出发,逐步细化到具体的组成部分和其行为。这种方法着重于描述系统的结构和功能,以及各个组件之间的交互关系。

在本单元作业中,体现在书写代码前,先根据业务功能和潜在拓展大致设计UML类图、状态图和顺序图对图书馆系统进行建模,然后再具体书写代码和完善UML图。

2. 架构分析

2.1 架构设计

img

img

实现单独的Book类,有利于存储图书借还期限、捐献书籍人、被借还次数等信息。实现单独的Student类,有利于存储信用积分、持有书籍、预约书籍等信息。将每个部门看作一个类,体现了图书馆不同部门的之间的分离。具体地,借还处对应BorrowOffice,预约处对应OrderOffice,图书漂流角对应DriftCorner,书架对应BookShelfDriftCornerBookShelf都可以看作是增加书籍、移除书籍、查询书籍的容器,因此都继承自BookContainer。比较独特的一点是,我为预约单独实现了一个类Appointment,本意是可以存储预约信息方便判断预约失效,但事后经过思考后发现可以就在Book类里实现,因此意义不大。

2.2 比对分析

2.2.1 类图

  • 正确性检验:除了reture之外的元素name都不为空,无重名类,无循环继承和重复继承,无接口。
  • Class检验:每个类、属性和方法都与程序对应。
  • Interface检验:类图中与程序中都无接口。
  • Enum检验:类图中与程序中书籍的状态State一一对应。
  • 关系检验:类图中继承、实现和关联都与程序中一致。

2.2.2 状态图

img

  • 基本检验:只有一个起始状态,起始状态只有外出迁移,没有终止状态。
  • TriggerGuard检验:涉及到状态转移的方法都无guard,因此在状态图中全为trigger,无guard,并且与程序中有@Trigger注解的方法一一对应。
  • 路径检验:路径有解和简单路径条件均满足。

2.2.3 顺序图

img

(偷了一点小懒)

  • 两个场景:存在以orderNewBook为起始消息和以getOrderedBook为结束消息的消息路径。
  • Lifeline:命名均与代码中的某个类相同。(只画了图书馆,借还处和预约处之间的顺序图)。
  • message对应:与程序中有@SendMessage注解的方法一一对应,且涉及到的方法均为public
  • 关联检验:LibraryBorrowOfficeOrderOffice之间均有关联关系。

3. 架构设计思维

  • Unit 1 表达式解析

第一单元主要是有关递归下降的方法,其中语法树主要涉及到了ExprTermFactor,构成了树的每一层。在每次写代码之前,我都会根据作业要求画出语法树,特别是涉及到表达式因子、指数因子和自定义函数因子时有循环下降的体现,还需要将Factor再具体分为子类,因此也体现了抽象的思维。

  • Unit 2 电梯调度

第二单元主要训练多线程之间同步的实现。这一单元其实我并没有体会到太多架构的思维,因为大多数时间都用来实现look算法,寻求理想电梯调度算法以及解决经常出现的轮询和死锁问题去了。最后还是没能解决死锁问题,但认真学了操作系统后对死锁的理解还是有了提升。

  • Unit 3 网络模型

第三单元主要是针对JML的训练。这单元也没有太多架构思想的体现,因为大部分代码都是对应着JML写的,这单元主要是有关网络增删和查询算法的优化,有利于降低时间复杂度。其中利用了如DFSBFS以及并查集等算法,在掌握这些算法之后感觉还是收获了很多。

  • Unit 4 图书馆管理

第四单元主要是针对UML的训练。这单元基本上都围绕着架构正向建模,在每次写作业之前其实也不一定把UML图全部给画出来,只需要大概画个草图体现出图书馆各个部门的职责和关系,写完代码后再对UML图进行完善就行了。这单元并没未涉及太多算法的优化,各自的实现也是非常自由的,因此难度不大。

4. 测试思维

  • Unit 1 表达式解析

主要构造一些边缘数据,利用最后结果为0,单独的正负数,括号在前在后等。还构造了一些复杂数据,如自定义函数嵌套、指数函数嵌套、括号嵌套以及负号问题等。

  • Unit 2 电梯调度

主要构造一些卡时间的数据,例如选择在同一时间到达多个乘客,同一时间reset多部电梯和reset电梯载客量最小和时间最大,检验电梯调度算法的可行性。

  • Unit 3 网络模型

利用Junit进行根据JML的后置条件、不变量和可变范围进行白盒测试,在构造数据点时采用多次随机的方法。当然,有的时候要根据方法采取随机生成数据和构造特殊数据结合的方法。

  • Unit 4 图书馆管理

感谢DPO!

5. 课程收获

OO课程都围绕着面向对象进行,这其中强调了面向对象的三大特点:多态、封装和继承,而这也是面向对象建模所要实现的目标。从oopre到OO正课四个单元的训练,我已逐渐从面向过程转变到了面向对象,也体会到了面向对象在解决工程问题上的可行性和优势。

除此之外,我学会了诸多算法,例如递归下降算法、look算法、并查集算法等,还学会了如何提高代码的可读性,还学会了如何在面对大量数据点时迅速缩小有效数据的范围并找到对应的bug,还学会了如何通过JML抽象出方法的功能以及迅速阅读JML的能力,最重要的是,学会了在写代码之前先认真思考建模。

学习OO的过程是痛并快乐着的,痛在无数个找寻bug的不眠夜,痛在自信慢慢提交但最后却泛红的强测界面,痛在互测时自己单方面的被hack,痛在每周六晚死亡的ddl。但幸福的地方在于,走过来一个学期再回顾这段经历,它带给我的是坚韧,是抗压能力,是能力的塑造。

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

302

社区成员

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

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