BUAA_Unit4

BUAA_Unit4

一、第四单元架构设计

本单元任务为实现一个JML解析器,三次作业分别实现对类图的解析、对顺序图与状态图的解析以及模型的有效性检查,难度适中,多次运用了图的深度优先、广度优先遍历算法。

第一次作业

第一次作业实现对类图的解析,为了防止UmlElement解析顺序不一致带来的错误,进行了三次遍历。

第一次 第二次 第三次
class, interface attribute, operation, generalization, realization parameter

image

第二次作业

第二次作业新增了对状态图和顺序图的解析,对状态图的遍历共有5次,对顺序图的遍历有3次。其中查询状态图的关键节点采用了bfs方法

状态图:

第一次 第二次 第三次 第四次 第五次
state_machine region state transition event

顺序图:

第一次 第二次 第三次
interaction lifeline, endpoint message

image

第三次作业

本次作业实现对模型的有效性检查。检查循环继承时采用dfs对每个节点检查是否在环上。检查多重继承时采用bfs检查图是否存在两个相同的节点。架构与前一次作业相同。

另外为了降低MyImplementation类代码行数,定义了Parse类,将解析方法全部移到Parse类中并定义为静态方法。

二、架构设计思维演进

第一单元作业实现对表达式的化简,应用递归下降方法,分别对表达式、项、因子建类,每个类只需要完成自己对应的任务,实现化简、加减乘运算。由于做第一次作业时从未接触过面向对象编程,因此被卡了几天,在和同学的讨论中才顺利完成。本单元我对OO的理解主要是类的封装性与独立性,通过不同类之间方法的调用完成解析和化简

第二单元作业引入多线程,实现多电梯的调度。架构设计采用生产者消费者模式以及流水线架构,具有一定的技巧性,不再是简单的封装继承。由于在第一单元中已经有对面向对象设计的基础,第二单元中分别对横向电梯、纵向电梯、策略、乘客、缓冲区、调度器等分别建类,各个线程、类之间相互协调工作,从而实现乘客、电梯的正确运行。本单元对OO的理解主要是线程的并发执行(不是简单的顺序执行),并且保证对象之间的协调交互

第三单元作业通过给定的JML规格书写代码,功能虽然给定但需要保证性能,因此读懂功能要求的基础上还要思考如何满足性能要求。本单元的难点主要在于理解规格背后的本质,如求最大连通块的个数、求最短路径,求最小生成树,之后就需要根据功能实现的本质来选择相应的图算法编写代码。

第四单元通过实现对UML图的解析,将UML元素进行分层解析,得出各元素之间的继承、实现等关系,并将这些关系以组合关系在类中体现出来。本单元作业加深了我对类图、顺序图、状态图的理解,而这三种图都反应了类与类之间的关系,这对分析多个类之间的层次结构有很大的帮助。

三、测试理解与实践

四个单元作业测试主要采用自动化生成数据并对拍来发现问题(评测机是白嫖的,准备这个暑假好好补一下这块内容,学期结束之时才发现自动化测试实际上也是一种硬实力),大量数据轰炸代码的好处是能发现许多诡异的bug,比如Integer,String之间的比较不能用==,这种诡异的bug如果只是少量数据我是发现不了的。

同时也采用手动构造一些极端数据,或者对特定函数或功能构造相应的数据进行测试。另外写代码前构思好思路,可以节省大量debug时间。

四、课程收获

直接收获:

  • 掌握了Java编程语言、语法
  • 学习了多线程编程思想
  • 学会了如何根据JML规格书写代码
  • 掌握了UML图的结构

间接收获:

  • 从零开始建立了面向对象的编程思想
  • 从完成任务到现在追求好的架构、好的性能的转变
  • 博客的书写、git的使用、IDEA使用技巧

五、改进建议

  1. 强烈建议在寒假的pre阶段就对第一单元用到的架构和思想进行一些铺垫,仍然记得第一单元第一次作业是本学期最痛苦的一段经历,在图书馆坐牢2天,啥也没想出来。
  2. 可以将部分课时讲授实用方法,如自动化测试程序的编写。因为每次上课我好像都在摸鱼?(主要是感觉讲的内容和作业关系不大,听不懂)
  3. 希望实验课每次提交能显示分数和对错
posted @ 2022-06-24 17:14  FYQS  阅读(26)  评论(0编辑  收藏  举报