BUAA-OO-2024 第四单元总结(UML 统一建模语言)

沈锎-22373080 学生 2024-06-12 15:24:14

目录

  • 本单元所实践的正向建模与开发
  • 本单元作业的架构设计
  • 四个单元中架构设计思维的演进
  • 第一单元:递归下降,对象递归嵌套
  • 第二单元:线程纠葛,数据如何传递
  • 第三单元:提前建模,带着镣铐舞蹈
  • 第四单元:设计规划,思考先于表达
  • 四个单元中测试思维的演进
  • 面向对象的课程收获

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

在本单元第一次中,我真正采取了 “正向建模” 的开发过程,即先对根据题目需求,设计项目架构,并绘制初步的 UML 图。在这一阶段,我确定了整个单元项目的主体结构,即图书馆、书籍存储、用户这样三位一体的布局。

设计完成后,整个项目的结构便跃然纸上,写起来也比较的轻松。只有一点:编写代码的时候会对原有设计进行修改,我忘记了实时同步,导致最终花了大量的时间进行 UML 类图的更新。

正向建模便也是这样的一个过程:先设计建模,再开发修改。对于大型项目,有助于我们对代码进行良好的规划。

本单元作业的架构设计

本单元围绕四个核心部件进行:图书馆(LibraryCore),书籍存储(BookStorage),用户(User),预约订单(Order)进行。

简化类图如下(太复杂也没人看,不如简化一下):

img

用户需要维护一下自己借的书,以及所借书籍的相关状态,并提供检查方法,已确定用户层面是否满足借阅等需求。

预约订单全部由预约处(OrderOffice)控制,在我的设计中用户并没有维护自己预约的书,在第三次作业中导致了一些麻烦,但不多,毕竟 设计的时候只要管架构,实现起来要考虑的事情就多了

同时,图书馆(LibraryCore)提供了一系列的 on* 方法,用于相应不同的请求,并在主方法中通过表驱动简化代码,我觉得还是不错的。

img

四个单元中架构设计思维的演进

第一单元模块化编程初见,第二单元设计模式与多线程,第三单元形式化描述,第四单元架构先行建模。四个单元侧重不同的主题,教给我们建模的方法设计的思路代码编写可能倒不是那么主要,重要的是设计,这将有助于我们去开发更大型的项目,去进行更多的尝试。

第一单元:递归下降,对象递归嵌套

第一单元,初入 OO,学习了递归下降这一极其重要的算法思想,我相信它一定会很有用。这一单元的架构设计比较简单,比较清晰,即使里面有嵌套,但可以围绕文法定义来进行。

我认为这一单元给我留下的最深刻的印象便是“不可变对象”的重要性,它也将在第二单元发挥作用。

第二单元:线程纠葛,数据如何传递

多线程确实难搞啊,头都要搞大了,纵使不是第一次接触多线程(进程),也好好吃了一壶。对于电梯来说,我将线程与对象分离,也即将动作状态分离,极大地辅助了整体的设计。与此同时,不可变对象的引入,也保障了线程的安全

这一单元极大地提升了我多线程编程的能力,虽然代码远没有设计地如此优雅,最终也取得了一个不错的成绩。

第三单元:提前建模,带着镣铐舞蹈

Jml 之流确实之前完全没有接触,一开始也觉得怪费劲的,虽然有一些不愉快的地方,但整体也体会到了“形式化”、“规范化”的意义。

同时,这一单元我也体会到了标准与实现相分离的特点,我们需要在满足规范约束的前提下尽可能去优化算法,这也是一个不小的考验。

经验教训:简单也行,困难也行,时刻不能放松警惕,谨防阴沟翻船。

第四单元:设计规划,思考先于表达

这次作业,“先设计,再实现”的理念落实得比较好,我也切实体会到了它的好处(仅限于这次需求不是很复杂,我不清楚当项目变得再复杂一些,这样的好处还能不能保持)。

当然了,建议测评机在检查类图时,可以一次性多反馈几条错误。

四个单元中测试思维的演进

对于我来说,严格而言,并不能算 “演进”,每个单元有各自的特色,我也采取了不完全相同的测试策略

第一单元,适合于对拍,因为那两个答案相减,可以比较轻松的判断是否一致。因此我主要采取这样的方式构建测评机。同时,我忽视了答案的文法检查,好在没出大岔子。第一单元比较适合作单元测试,因为里面有一些关键方法,有着较为明确的输入、输出。

第二单元,适合于测评机检查,因为测评机维护电梯、乘客状态比较容易。同时,多线程测评的交互也是一个比较有趣的地方。这一单元适合黑盒测试,当然电梯的运行策略和调度策略可以考虑单元测试,但是总感觉怪麻烦的,似乎有点得不偿失。

第三单元,适合于单元测试,因为有详细的约束,可以很方便地构建测试与检验。但是数据生成又是一个难题,题目也要求我们去进行某些方法的单元测试,这里就可以感觉到数据生成对其的重要意义,还是比较难搞的。

第四单元,适合于单元测试,和测评机黑盒测试。针对图书馆的相关操作,可以构建测试用例,同时,也可以针对整体进行用例的测试。

我发现我还是习惯于传统的基于测评机的测试,测评机的代码比作业代码都要多好多,还学了好多稀奇古怪的东西,也算是课程的红利?

面向对象的课程收获

除了对象,其他收获还真不少。 比如对 Java 和 Python 的熟练度上升很多,也学会了模块化编程的重要思想。我能够直面多线程的复杂情景,也能够了解形式化验证的相关内容。UML 既给了我一种建模的手段,也是一种展现思路的方式。

对于面向对象来说,Java 的设计真的很清晰明了,没有那么多逼仄的东西,很多情况下也符合常理,总体体验还是比较舒服的。

作为连接 CO 和 OS 的一门课,面向对象是最上层的,但处处也都有其影子,譬如 OS 的设备表那块,绝对有面向对象的设计理念蕴含其中。

因为我的测评机有图形化界面,我也更能够体会到面向对象在实际开发中的重要应用,能够充实我的学习生活。

好耶!

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

301

社区成员

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

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