OO第四单元UML总结(暨学期OO总结)
一、 本单元作业架构设计
1.第一次作业
(1)涉及相关UML元素(第一次作业只有类图中元素)中有用部分
UmlClass / UmlInterface:
id:类/接口名称
name:类/接口对应的独一无二id
UmlAttribute / UmlOperation
id:属性/操作独一无二id
name:属性/操作名称
visibility:属性/操作可见性
parentid:属性/操作所属的类、接口id
UmlParameter
parentid:参数所在操作id
direction:参数的类型
UmlAssociationEnd
reference:对应的类、接口id
UmlAssociation
end1:关联一段end的id
end2:关联另一段end的id
UmlGeneralization
source:子类、子接口id
target:父类、父接口id
UmlInterfaceRealization
source:实现接口的类的id
target:被实现的接口id
(2)架构分析:
主要分为基础信息保存和对外信息管理,因为第一次作业只有类图,所以实现的MyUmlInteraction即进行“类”的管理,对自己建立的“Class”管理,处理命令后调用Class的方法服务。而在Class中保存了类的信息,比如属性、方法、关联对端和继承的接口等,完成基础操作。
2.第二次作业
(1)涉及相关UML元素(第一次作业只有类图中元素)中有用部分
UmlStateMachine
UmlRegion
parentid:对应UmlStateMachine的id
UmlPseudostate / UmlState / UmlFinalState
id:独一无二的id
UmlTransition
parentid:所在Region的id
sorce:原状态id
target:下一状态id
UmlAttribute
UmlInteraction
name
id
UmlMessage
parentid:所在interaction的id
source:发出消息的lifeline的id
target:接受消息的lifeline的id
UmlLifeline
parentid:所在interaction的id
(2)架构分析:
第二次新增了时序图和状态图,第一单元的MyUmlInteraction更名为ClassInteraction,只进行对类图信息的管理,StateMachineInteraction管理StateMachine,后者储存了一个状态机的状态并提供了操作状态机的方法接口,前者管理所有的状态机,通过调用状态机的方法提供服务;SequenceInteraction管理Sequence,后者储存了一个顺序图的所有内容并提供管理方法接口。
需要注意的是由于每一个UmlStateMachine有唯一对应的UmlRegion,所以我实现的StateMachine直接管理了UMLRegion。
然后在MyUMLGeneralInteraction中实例化了ClassInteraction、StateMachineInteraction、SequenceInteraction对象,得到一个UMLElement时依次在三者中添加,如果符合该图中元素类型则在该Interaction中储存并返回true、不继续尝试添加,否则就尝试下一个图类型。将所有元素都添加完毕后建立完整的管理并调用合适的Interaction方法以实现接口要求。
3.第三次作业
(1)R001:维护一个<classid, <name, Arraylist ids>>的容器。对每个类id,name是其参数或对端end的名字,ids中保存该类该名称的id。当对应name中有超过1个id则重复
(2)R002:对每个类,有且只有一条到达top的有向路径,如果行走过程中出现重复,则代表找到了一种类继承的循环。完成一整条路径的检查,则路径上的所有点都不需要再检查。对每个接口,通过dfs查找有向路径上是否有圈,并保存路径上的点。查找1个点所有可达的点都不需要再检查。
(3)R003:由于类不存在多继承,因此R003中不需要考虑类。对每个接口,用bfs遍历继承树,寻找是否存在重复出现的接口。如果对一个点全遍历后不存在重复接口,则遍历的所有点都不需要再遍历。
(4)R004:间接实现一个接口:父类实现的接口、实现接口继承的接口。对每个类,收集直接实现、间接实现的接口,如果出现重复则异常。
(5)R005:在传递参数的时候对每个有名元素检查。
(6)R006:对每个参数进行检查,如果属于接口且不是public则异常。
(7)R007: 判断UMLAttribute是否属于同一个sequece diagram,实际是判断该UmlAttribute的parentid和对应UmlInteraction的parentid是否一致。
(8)R008:对每个初始状态进行检查,如果存在迁移,但迁移对象超过1个或存在trigger和guard,则异常。
二、 四单元架构设计及OO方法理解的演进
1.第一单元
刚接触OO,感觉这个时候基本都是一锅炖,方法都在一个类里,直到500行满了就换

2.第二单元
这一单元开始的时候和一个学长讨论了半天调度器、控制器等独立模块,总算形成了基本的对象意识。调度器只管乘客分配,控制器只管等待队列的操作和时长、容量设定,电梯只负责电梯内乘客,而电梯线程负责电梯运行。就清晰了很多,debug也没那么难了

3.第三单元
这一单元更多地是如何选择数据结构将JML中的规格以更低的复杂度实现,许多类的实现是为了方便建立某些特殊的数据结构,方便对数据进行管理。所以有的时候除了一味关注层次模块还不能忘记基础数 据结构的性能优化。

4.第四单元
这一单元主要就是总体思想吧,按层次抽象,基础层次管理信息细节并隐藏这些细节向高层提供服务,中间层进一步抽象向更高层提供更加简洁的服务,顶层元素只需要调用下层方法即可。

三、 四单元测试理解与实践的演进
1.第一单元
自己的数据生成程序+面向数据反馈debug
2.第二单元
因为多线程很难复现,再加上这次作业我写的比较顺利,基本是一遍过的,就没有怎么测试,大概测试就是输出结合IDEA观察线程状态的功能观测线程结束情况
不过有点吃亏的是由于不会测试性能,直接用了自以为的优化,导致性能极差,几乎没有性能分
3.第三单元
借同学的测评机和数据+自己写的数据生成
4.第四单元
Junit+同学的测评机和数据
四、 课程收获
- 学会了设计模式,真的好好用啊……程序结构清晰了很多,debug的时候目标性更强了,效率也变高了。
- 开始有模块化意识了。由原先一个大类里面杂七杂八一堆函数变成了一个对象只负责和自己有关的部分
- 代码可维护性好了很多,迭代的时候基本不用大改了,只加基本不改。
五、 改进建议
- 可以大致展示一下自动测评机搭建的思路或者指明一下自学途径就好了,感觉课程一直在强调测评机,但新手完全无从下手,倒是有写数据生成的代码,但不会写批量运行导致自动测评搁浅
- 课上测试希望有反馈,想知道自己有没有错、错在哪了
- 第二单元的训练栏目希望可以扩充一下,讲一下调度器的应用什么的

浙公网安备 33010602011771号