BUAA_Unit4
BUAA_Unit4
一、第四单元架构设计
本单元任务为实现一个JML解析器,三次作业分别实现对类图的解析、对顺序图与状态图的解析以及模型的有效性检查,难度适中,多次运用了图的深度优先、广度优先遍历算法。
第一次作业
第一次作业实现对类图的解析,为了防止UmlElement解析顺序不一致带来的错误,进行了三次遍历。
第一次 | 第二次 | 第三次 |
---|---|---|
class, interface | attribute, operation, generalization, realization | parameter |
第二次作业
第二次作业新增了对状态图和顺序图的解析,对状态图的遍历共有5次,对顺序图的遍历有3次。其中查询状态图的关键节点采用了bfs方法
状态图:
第一次 | 第二次 | 第三次 | 第四次 | 第五次 |
---|---|---|---|---|
state_machine | region | state | transition | event |
顺序图:
第一次 | 第二次 | 第三次 |
---|---|---|
interaction | lifeline, endpoint | message |
第三次作业
本次作业实现对模型的有效性检查。检查循环继承时采用dfs对每个节点检查是否在环上。检查多重继承时采用bfs检查图是否存在两个相同的节点。架构与前一次作业相同。
另外为了降低MyImplementation类代码行数,定义了Parse类,将解析方法全部移到Parse类中并定义为静态方法。
二、架构设计思维演进
第一单元作业实现对表达式的化简,应用递归下降方法,分别对表达式、项、因子建类,每个类只需要完成自己对应的任务,实现化简、加减乘运算。由于做第一次作业时从未接触过面向对象编程,因此被卡了几天,在和同学的讨论中才顺利完成。本单元我对OO的理解主要是类的封装性与独立性,通过不同类之间方法的调用完成解析和化简
第二单元作业引入多线程,实现多电梯的调度。架构设计采用生产者消费者模式以及流水线架构,具有一定的技巧性,不再是简单的封装继承。由于在第一单元中已经有对面向对象设计的基础,第二单元中分别对横向电梯、纵向电梯、策略、乘客、缓冲区、调度器等分别建类,各个线程、类之间相互协调工作,从而实现乘客、电梯的正确运行。本单元对OO的理解主要是线程的并发执行(不是简单的顺序执行),并且保证对象之间的协调交互。
第三单元作业通过给定的JML规格书写代码,功能虽然给定但需要保证性能,因此读懂功能要求的基础上还要思考如何满足性能要求。本单元的难点主要在于理解规格背后的本质,如求最大连通块的个数、求最短路径,求最小生成树,之后就需要根据功能实现的本质来选择相应的图算法编写代码。
第四单元通过实现对UML图的解析,将UML元素进行分层解析,得出各元素之间的继承、实现等关系,并将这些关系以组合关系在类中体现出来。本单元作业加深了我对类图、顺序图、状态图的理解,而这三种图都反应了类与类之间的关系,这对分析多个类之间的层次结构有很大的帮助。
三、测试理解与实践
四个单元作业测试主要采用自动化生成数据并对拍来发现问题(评测机是白嫖的,准备这个暑假好好补一下这块内容,学期结束之时才发现自动化测试实际上也是一种硬实力),大量数据轰炸代码的好处是能发现许多诡异的bug,比如Integer,String之间的比较不能用==
,这种诡异的bug如果只是少量数据我是发现不了的。
同时也采用手动构造一些极端数据,或者对特定函数或功能构造相应的数据进行测试。另外写代码前构思好思路,可以节省大量debug时间。
四、课程收获
直接收获:
- 掌握了Java编程语言、语法
- 学习了多线程编程思想
- 学会了如何根据JML规格书写代码
- 掌握了UML图的结构
间接收获:
- 从零开始建立了面向对象的编程思想
- 从完成任务到现在追求好的架构、好的性能的转变
- 博客的书写、git的使用、IDEA使用技巧
五、改进建议
- 强烈建议在寒假的pre阶段就对第一单元用到的架构和思想进行一些铺垫,仍然记得第一单元第一次作业是本学期最痛苦的一段经历,在图书馆坐牢2天,啥也没想出来。
- 可以将部分课时讲授实用方法,如自动化测试程序的编写。因为每次上课我好像都在摸鱼?(主要是感觉讲的内容和作业关系不大,听不懂)
- 希望实验课每次提交能显示分数和对错
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?