BUAA OO 第四单元及课程总结

郭俊杰 -22371240 学生 2024-06-15 16:51:35

正向建模与开发

正向建模与开发是从需求分析到系统实现的一种开发方法,强调从问题的角度出发,通过建立模型来描述系统的结构、行为和关系,并将这些模型转化为可执行的代码。
在课程中使用了三种UML图表进行建模,分别是类图,状态图和顺序图。

  • 类图:用来表示系统中对象的类型以及它们之间存在的各种关系。作业中给出了图书馆,学生,各个部门类的属性和方法,以及它们之间存在的各种关系。
  • 状态图:描述一个特定对象的所有可能的状态以及引起状态转换的事件。在作业中将图书的所在位置作为状态,描述了图书位置的变化过程,以及引起变化的方法。
  • 顺序图:描述了对象之间发生交互的过程。能够清晰地表示出图书馆系统处理请求地整个过程,对象之间地调用关系。
    在前三个单元的程序编写过程中我都是先编写代码,再逆向生成类图来分析架构。这样的好处是在编写代码的过程中更容易发现问题从而随时调整,但是缺点也很明显:在发现当前所用架构不能满足需求时需要重构,会导致效率低下。在本单元中我开始尝试先使用UML表示出程序大致的架构,虽然最终完成的版本与最初所设想的有所出入,但大致的框架是相同的。在对程序架构有了一个清晰的认识之后,编写代码的过程就顺畅了许多,也不会出现程序写到一半需要推倒重来的情况了。

架构设计

类图

img

  • Library:图书馆实体,定义了对不同请求的处理方法,其属性包含了各个部门类的实例
  • BorrowManage:借还处,管理借还请求
  • ShelfManage: 书架,管理馆内图书
  • DriftManage: 漂流角,管理漂流角的图书
  • MoveManage:用于图书的移动
  • OrderManage: 预约处,管理预约取书请求
  • OrderRecord: 用来记录预约的信息
  • Student:学生实体,包含了信誉值,预约图书,持有图书等属性

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

在代码的编写过程中,整体架构与类的属性方法命名等都遵循UML模型。同时代码中也会根据需要添加新的方法,同时需要根据这些变化调整UML模型。通过建立代码和UML模型之间的追踪关系,可以更好地理解代码的设计意图,在代码开发和维护过程中更好地与UML模型保持一致。在同步更新中,确保两者之间的一致性和准确性。

架构设计思维的演进

第一单元

第一单元的任务是解析表达式。通过将表达式拆解成因子,项和表达式的形式,对整个表达式进行解析和化简。本次作业的架构设计中我以此为基础,将这些元素封装成类,添加解析类来统筹解析和化简操作。由于没有什么架构设计经验,许多设计比较冗余,例如将表达式因子单独设计成一个类,而非让表达式类继承因子类,这些设计也导致在整体性能上的表现没有那么好。虽然有一些问题,但在第一单元作业的完成过程中我还是领会到了一些面向对象设计的思想。

第二单元

在第二单元的电梯作业中第一次接触到多线程编程,对于互斥的理解以及代码编写中同步块和锁的选择都花费了很长时间。在架构设计上,我将任务分为请求的分配和请求的处理两部分。在请求的分配上,生产者-消费者这一经典设计模式可以很好地适配电梯调度的问题。在请求的处理上通过look算法可以达到一个不错的性能。同时加入量子电梯操作进一步优化性能。这两个任务相互独立,只需分别设计好再组合到一起,有效地降低了代码编写的难度。

第三单元

第三单元是JML,整体架构已经给出,更加注重的是内部的实现和优化。针对查询操作,尽可能地使用维护变量的方式保存信息而不是每次调用时遍历查询,这样可能会导致超时。同时,学习并使用经典的图论算法以更好地保证性能满足要求。

第四单元

第四单元中注重通过构建UML模型正向建模,对程序的整体架构有个清晰的认识,再根据模型完成代码,我认为这一点是个较大的提升。我将图书馆各个职能部门封装成类作为图书馆类的属性,这种架构保证了在后续迭代过程中只需要根据新的需求添加功能即可,具有比较好的可迭代性。

测试思维的演进

在最初,写完代码后只通过样例和少量手动构造的数据进行测试,在强测经历了一次挫折后我开始注重测试以及测试的一些思维和方法:

  • 在作业的测试中针对关键的方法编写junit测试,保证每个分支下方法的正确性。同时在代码完成后通过构造大量随机的,具有一定强度的数据进行黑盒测试,在测试出错时根据出错的测试数据进行调试,查看代码内部的问题。通过黑箱测试与白箱测试的结合,可以大大提高测试的效率以及代码的正确性。
  • 构造高强度的数据进行压力测试。通过分析程序的具体实现,找到复杂度最高的方法和对应的功能,据此构造大量测试数据进行压力测试。从而保证程序的性能符合要求。
  • 构造边界数据。针对需求描述中一些出现特殊数字的方法也需要专门编写边界数据进行测试。如U3addPersonToTagtag大小超过1111的情况。此外还要考虑一些特殊情况下数据溢出的情况。

课程收获

通过这一学期的OO课程,我收获了许多:
首先是架构设计的能力提高。在U1中,我只能先写代码,再根据代码反向建模。到了U4能够使用面向对象的思想分析需求并设计出具有较好的可迭代性的架构。
其次是代码能力的提高。经过12次的代码编写作业,通过规范的格式以及阅读JML对方法的约束,我根据预期功能编写代码的速度和正确性有了很大的提高。在后续的debug过程中节省了不少时间。同时,我也学习到一些编程的技巧和改善时间复杂度的方法。
最后,得益于互测我掌握了一些数据构造的技巧,这对于我以后测试自己的程序也具有很大的帮助。

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

301

社区成员

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

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