OO 第四单元总结 & 学期小结
OO 第四单元总结 & 学期小结
本单元主要目标为学习基本的UML统一建模语言,并在此基础上实现对mdj源码的解析,官方包提供了初步的转化,我们需要运用一定数据结构进行组织,并提供相应的查询接口。本单元的学习中需要理解UML类图、时序图、协作图中的基本概念,并了解其mdj源码表示。
二、第十三次作业
1、题目要求
-
本单元作业相信大家初看还是比较头疼的,可能看完指导书还是一头雾水,其实第一次作业要求我们解析的是UML类图部分,给出mdj源码,官方包为我们转化成以下元素,我们只需要自己架构,并完成相关查询接口即可。
2、UML类图 & 具体实现
第一次作业设计的仅为Uml类图部分。首先,会给出.mdj源码,官方包已经帮我们把这些”丑陋“的源码转化为一个个实例化的Uml对象,但这些对象是一些孤立的结点或者关系,还缺乏一个数据结构来把他们组织到一起。从这里开始就是我们需要完成的操作,我们需要来创建数据结构,来建立起一棵自己的Uml元素树,然后根据后续指令留出相关查询方法的接口。
弄明白这些,我们就可以开始着手工作了。这里面最重要的就是我们自己的Uml元素树的建立。
对于这些元素我采用了相对比较严格的依赖关系来建立,一共分为3轮。
Step 1: Class, Interface
Step 2: Attribute, Operation, RealizeInterface, AssEnd, Gen
Step 3: Association, Parameters
为了便于查询,本次我封装了MyClass,MyInterface以及MyOperation三个类,按以下的结构进行组织,在内部预留出相关的属性和接口以便查询。
其余部分按照指导书展开即可,在群里面发现本单元大家面临的问题还比较多,可能有这些易错问题。
-
getClassImplementInterfaceList,要考虑继承方式间接实现的接口,注意不重不漏
-
getClassAttributeCouplingDegree,本指令的查询需要考虑继承自其各级父类所定义的属性,但不需要考虑实现的接口所定义的属性,注意每种Reference只记一次
-
getClassOperationCouplingDegree,只考虑自己定义的方法,注意错误类型的优先级更高且需要考虑所有参数,判重时只考虑传入参数,同时注意一一映射,Reference同上。
三、第十四次作业
1、作业要求
-
本次作业新增了状态图和顺序图的解析,首先需要理解其层次结构,然后建立起对应数据结构,并实现查询
2、UML类图 & 具体实现
-
第二次作业的层次化解析我是按这样来建立的
Step 1: StateMachine, Interaction
Step 2: Region, LifeLine
Step 3: Message, State
Step 4: Transition
Step 5: Event -
为了便于查询,本次我封装了MyStateMachine,MyRegion, MyState, MyInteraction, MyLifeline几个类,按以下的结构进行组织,在内部预留出相关的属性和接口以便查询。
-
本次作业中较难的查询为判断是否为关键状态,在这里我选择了用bfs来实现:(支撑的数据结构见上图)
///////////////////// 根据题设抛出异常并判断结果 ///////////////////////////
public boolean checkCritical(String stateMachineName, String stateName)
throws StateNotFoundException, StateDuplicatedException {
if (name2State.containsKey(stateName)) {
ArrayList<MyState> statesList = name2State.get(stateName);
if (statesList.size() == 1) {
MyState state = statesList.get(0);
if (finalStates.size() == 0 || state.getType() == ElementType.UML_PSEUDOSTATE
|| state.getType() == ElementType.UML_FINAL_STATE) {
return false;
}
ArrayList<MyState> canArrive0 = getCanArrive(null);
ArrayList<MyState> canArrive1 = getCanArrive(statesList.get(0));
if (canArrive0.size() != 0 && canArrive1.size() == 0) {
return true;
}
return false;
} else {
throw new StateDuplicatedException(stateMachineName, stateName);
}
} else {
throw new StateNotFoundException(stateMachineName, stateName);
}
}
/////////////////// bfs 查找可以达到的终点状态 /////////////////////
public ArrayList<MyState> getCanArrive(MyState myState) {
MyState begin = this.startState;
Queue<MyState> queue = new LinkedList<>();
queue.add(begin);
ArrayList<MyState> canArrive = new ArrayList<>();
HashSet<MyState> book = new HashSet<>();
book.add(begin);
while (!queue.isEmpty()) {
MyState now = queue.poll(); // 返回并删除队首元素
HashSet<MyState> nextStates = now.getNextStates();
for (MyState state : nextStates) {
if (myState != null && state.equals(myState)) {
continue;
}
if (!book.contains(state)) {
queue.add(state);
book.add(state);
if (state.getType() == ElementType.UML_FINAL_STATE) {
canArrive.add(state);
}
}