BUAA_OO第四单元反思与总结
OO第四单元反思与总结
18375182 范竞元
第十三次作业
第十三次作业主要实现了11个针对类图的查询指令。
架构分析
首先,在做这次作业之前,我并没有对mdj文件有着很深的了解,因此思考这次作业如何开始花费了我比以前更长的时间(甚至有段时间以为这单元要写的和jml相似),希望老师上课能够更加详细地讲一下mdj文件的结构以及类图,顺序图和状态图中各个元素的内容和之间的关系。
这次作业中的指令全是通过类名来查询类的,因此我首先建立了这样一个数据结构:
HashMap<String, ArrayList<String>> classes;
其中第一个String存放的是class的名字,第二个String存放的是class的ID,因此通过这个数据结构可以轻松的找出相应的class并且判断class是否不存在或者有多个。
另外,我新建了一个MyElement类,这里存放着相应的Element,我也新建了许多需要查询信息的类,比如说MyClass类,MyInterface类等等,这些类存放着和自己有关系的数据,比如说MyClass类中存放着自身的可见性,associations,attributes等等,这些类也继承着MyElement类,通过getElement方法也可以获取相应的Element实例。并且只要获取到相应的MyClass实例,就可以得知它的一切信息,不用再去费时间寻找。这些类的初始化也一并通过MyUmlGeneralInteraction类的构造函数创建。
UML类关系图
关系图大致如下。

第十四次作业
第十四次作业主要实现了三个关于UML状态图的查询指令和三个关于UML顺序图的查询指令。
架构分析
这次作业比较友善,因为UML状态图和顺序图中的元素种类本身就比较少,因此在理解本次作业的要求上没有花费太多的时间。
有关于架构方面的话,因为上次作业的代码行数比较多,所以我这次将构造函数单独拎了出来放到了另外一个类中,因为这次主要是针对region和interaction的名字进行查询,所以我也建立了和上次作业一样的数据结构,在此也就不过多赘述了。
private HashMap<String, ArrayList<String>> interactions;
private HashMap<String, ArrayList<String>> regions;
值得一说的是,关于UML状态图的查询指令中的查询触发事件的指令,最开始并不是很理解,后来才知道状态迁移是状态迁移(transition),触发事件是触发事件(event),其中一个状态迁移中可能会有很多的触发事件。这里我也是看指导书里的例子才知道的。
UML类关系图
关系图大致如下。

第十五次作业
第十五次作业主要实现了针对模型的有效性检查。
架构分析
这次作业我并没有新建任何额外的数据结构,只是使用了之前的数据结构来进行检查。
这次作业的有效性分析我也同上次一样额外拎到了另一个类里去写,因为这次作业CPU时间限制为10秒,所以我并没有很在意性能,例如R002和R003都是用的暴力搜索。值得一提的是,有效性检查中的R002和R003我是合在一起写的,为此我重写了一下官方包中的checkForAllRules方法,将R002和R003合并为一个方法。
public void checkForAllRules() throws PreCheckRuleException {
this.uml1();
this.uml23();
this.uml4();
this.uml5();
this.uml6();
this.uml7();
this.uml8();
}
另外有关R007,其中在顺序图中的lifeline的represent指向的是interaction,那么在同一sequence diagram中的意思是interaction的parentId和attribute的parentId要一致。
UML类关系图
关系图大致如下。

四个单元中对架构设计及面向对象方法理解的演进
在学习面向对象课程之前,其实我也就主要会面向过程方法,去年写计组那时候才沾点结构化的边。
第一单元中进行的架构设计主要是根据功能来设计的,比如说这个类用来解析字符串,那个类用来进行递归下降词法分析的等等。在写作业过程中主要考虑的还是如何建立数据结构,架构其实没考虑太多。
第二单元的架构也没咋想,就是生产者-消费者模式,再加个黑板也就是线程安全类完事。主要问题是第三次的换乘并不能很好的兼容我这个架构于是我把换乘扔了。
第三单元也没咋想架构,心思主要还是放在了如何降低时间复杂度上了。
第四单元的架构还是想了一会的,最后发现套一个My***的壳,将Uml***放里边,再构建点其他的数据结构就Ok。
四个单元中对测试理解与实践的演进
前两个个单元的测试我主要是手动构造数据进行测试,效率并不是很高。偶尔也还会用一些大量的随机生成的数据进行测试,但是覆盖面也并不是很好。
第三单元利用JUnit单元测试,将测试模块化。
第四单元就是手动构造加对拍。
课程收获
- 首先就是体会到了面向对象思想的内涵,掌握了一些搭建框架的能力,并且了解了一些Java开发的常见设计模式。
- 学会画类图,顺序图和状态图。
- 学会了多线程的常见架构和保证线程安全的通常方法。
- 巩固了以前学过了算法,比如说迪杰斯特拉。
- 预习了将来会用到的算法,比如说递归下降词法分析。
- 了解了协作开发会用到的JML规格,并实现了一定程度的形式化验证。
- 在这门课和OS课程中学会了Git的深度使用
- Java编程能力的提高,掌握多态,接口的使用,枚举类的使用,代码风格的统一化。
给课程提的一些改进建议
- 最后一单元的指导书写的并不是很清晰,另外,评测中的数据限制也分散在各个地方,希望能够集中一下数据限制并且针对具体的限制给出相应的指令。
- 上课讲的内容我希望能够更加贴近于作业。比如说第四单元的课上就很少讲各种元素之间的关系。
- 第一单元的递归下降方法应该多给点指导。不然自己探索真的有点耗时间。
- 希望助教能够收集每次的先进架构并且用类图的方式表达出类让我们学习一下,我认为这样搞会很好。
OO课程感想
开始前就已经在害怕的课程竟然越写越顺手,明明后俩单元比较简单,结果竟是最难的(自认为)的第一单元AK,没想到了属于是。说实话OO课程远远超出了我的预期,学到的东西真的很多,OO这门课也真的很完美,我也很希望OO这门课不断地变好。

浙公网安备 33010602011771号