OO_BLOG4_UML系列学习
Unit4 作业分析
作业 4-1 UML类图解析器UmlInteraction
1. 架构设计
1)度量分析
2)结构分析
3)算法分析
-
// MyClass.ID -> MyClass private HashMap<String, MyClass> classIdToMyClass; // UmlClass.Name -> UmlClassID[x] private HashMap<String, ArrayList<String>> classNameToClassIds; // UmlElementID -> UmlElement private HashMap<String, UmlElement> elementIdToElement; // the Number of Interfaces, ADD when a UmlInterface comes. private int interfaceCount = 0;
-
/* * 由于各类型之间有先后顺序的要求,所以我利用了用(1+1+1)个for循环完成数据输入 * 下面用伪代码说明逻辑。 */ for (UmlElement element : elements) { elementIdToElement.put(element.ID, element); if (element instanceof UmlClass) { classIdToMyClass.put(element.ID, new MyClass(element)); ADD_IT_TO_classNameToClassIds; } else if (element instanceof UmlInterface) { classIdToMyClass.put(element.ID, new MyClass(element)); interfaceCount++; } else if (element instanceof UmlOperation) { operaIdToMyOperation.put(element.ID,new MyOperation(element)); } } for (UmlElement element : elements) { if (element instanceof UmlInterfaceRealization) { ADD_TARGET-UmlInterface_TO_SOURCE-MyClass; // use method - MyClass.addInter() } else if (element instanceof UmlAttribute) { ADD_TARGET-UmlAttribute_TO_SOURCE-MyClass; // use method - MyClass.addAttr() } else if (element instanceof UmlParameter) { ADD_TARGET-UmlParameter_TO_SOURCE-MyOperation; // Myoperation 对参数进行分析 } else if (element instanceof UmlAssociation) { ADD_ASSOCIATION_TO_EACH_OTHER; // use method - MyClass.addAsso() } else if (element instanceof UmlGeneralization) { ADD_FATHER-MyClass_TO_CHILD-MyClass; // use method - MyClass.addUpClasses() or MyClass.addFather() } } for (Each MyOperation : operaIdToMyOperation) { MyClass.addOperation(MyOperation); }
作业 4-2 扩展解析器(UML顺序图、UML状态图解析,基本规则验证)
1. 架构设计
1)度量分析
2)结构分析
3)算法分析
-
classModel (类图)
-
Dfs:图的遍历接口
-
MyClass :可以由UmlClass或UmlInterface构造(统一管理类和接口);内含一个Class所有需要的内容:
private int assocCount = 0; private MyClass fatherClass = null; private UmlClass umlClass = null; private UmlInterface umlInterface = null; private ArrayList<MyClass> upMyClasses; private HashMap<OperationQueryType, ArrayList<UmlOperation>> modeToOpera; private HashMap<AttributeQueryType, ArrayList<UmlAttribute>> modeToAttr; private HashMap<String, String> assocIdToName; private HashMap<String, ArrayList<String>> operaNameToIds; private HashMap<String, Visibility> operaIdToVis; private HashMap<String, ArrayList<String>> attrNameToIds; private HashMap<String, Visibility> attrIdToVis; private ArrayList<UmlAttribute> unhiddenAttrs; private HashMap<String, String> interIdToName;
-
MyOperation:类的操作,功能 - 处理和关联UmlParameter与UmlOperation
-
OldUmlClassModelInteraction:同UML第一次作业UmlInteraction
-
MyUmlClassModelInteraction:继承Old的基础上增加了规则检查 - R001 遍历所有
myClass
,检查myClass
的所有属性名称和关联端(UmlAssociationEnd)的名称是否有重名;R002 遍历所有
myClass
,对于每一个myClass
运用DFS遍历它的父类形成的图,若有环,则违反规则(“类与接口之间实现关系”不可能构成圈,无需考虑,只需考虑类之间的继承以及接口之间的继承,即MyClass的继承);R003 (1)对于每一个UmlClass构建的
myClass
,观察它的类和父类中是否实现了重复的接口(考虑接口的继承),若出现,则将该myClass
加入异常数组;(2)对于每一个由UmlInterface构建的myClass
,观察接口和接口的继承有无重复的UmlInterface,若有,则将该myClass
加入异常数组;
-
-
collaboration (顺序图)
-
MyInteraction:承载一个顺序图图的所有需要信息
private int lifelineCount; private int messageCount; private HashMap<String, Integer> lifelineNameToTimes; private HashMap<String, String> lifelineIdToName; private HashMap<String, Integer> llNameToIncomingCount;
-
MyUmlCollaboration
-
-
stateChart (状态图)
-
MyRegion:承载一个状态图的所有需要信息
private int stateCount; // 状态数 private int transitionCount; // 转换数 private HashMap<String, Integer> stateNameToTimes; // 记录同名的状态数 private HashMap<String, MyState> stateNameToMyState; // UmlState.NAME -> MyState private HashMap<String, MyState> stateIdToMyState; // UmlState.ID -> MyState
-
MyState:状态
-
MyUmlStateChartInteraction
-
-
MyUmlGeneralInteraction(官方接口实现)
架构设计及OO方法理解的演进
-
简单表达式求导
实事求是地说,通过这一单元的学习,我对OO的理解以及架构设计的长进甚微。如果说收获的话,我想是
- 输入处理,尤其是正则表达式的熟练使用;
- 数据结构知识回顾,在我看来,第三次作业是本次OO课程的难度顶峰,它对输入分析、数据结构和算法的要求较高,戳中痛点;
-
多线程电梯模拟
通过这一单元的学习,我受益颇深:
- 多线程设计,如何设计出优雅的、无死锁的程序是这一单元的核心问题,在三次作业中,我体会到了(1)线程的增加会给程序设计带来哪些变化以及应该怎么修改程序来适应这些变化和挑战(2)面向对象的思维方式在多线程中如鱼得水,十分契合。
- 平衡架构、运行时间的尝试,和算法的选择。这一部分的优化,个人感觉非常困难,也非常痛苦。但是在尝试中,也算是锻炼了平衡架构、运行时间的尝试,和算法的选择的能力。
-
规格化设计
这一单元引入了JML,引导我们进行契约化和规格化设计。在本单元的学习中,我学习了从抽象到具体、逐层构造的方法,学习了JML的简单基础语言,这一单元的课下作业给人的感觉非常顺滑,我想这就是契约化和规格化设计的魅力所在吧。
-
UML模型学习
记得研讨课上,来自西安某研究所的老师说,UML语言是他现在使用最多的语言,“推荐大家学习”。通过本单元对UML的结构化探索,以及规则检测的尝试,对UML有了初步的理解。
测试理解与实现的演进
- 对测试的理解,由好的测试是测不出bug 到 好的测试是测出bug的转变,由数据压力测试 到 更加注重模块化、局部性检测。
- 实现上,从最初只靠人眼和课程组给出的样例来DEBUG,到尝试数据生成器+对拍器来DEBUG,再到Junit、JML等联合起来DEBUG,DEBUG的层次由浅入深,从盲目到精确。
课程收获
- JAVA 编程能力
- 面向对象的思维和简单的架构设计
- 程序测试能力
给课程的三点建议
- 更加具体地进行架构设计指导。 我们可以真切地感受到老师对架构的重视,同时,在老师的不断强调下,我们也深切地认识到架构的重要性,但是,对架构的指导好像多流于泛泛而谈,同学们很难理解,希望能在作业指导书中、或是以其他方式,更加具体地更好地指导同学们去锻炼自己的架构设计和面向对象思维。
- 适当增加设计模式的讲解。 何岱岚同学对设计模式的讲解给我们带来耳目一新的感觉,希望课程组在课程设计时也能穿插一些设计模式的讲解,我认为会很有帮助的。
- 减少互测屋人数。个人认为,本学期OO课程组将互测改为“互测屋”是一次非常成功的改革,但是还存在着一些问题。其中最突出的问题就是互测屋人数过多,本身同学在互测之前已经耗费了大量的时间去思考解法、设计架构、编写代码,心里上的疲惫加上其他课程的压力,让互测变成了“最虚弱”的一环,如果它的任务量一上来就把大家吓到,那可能大多数人都会选择去用大量数据对拍的“黑盒”策略(撞运气),而不去选择吃力地读“晦涩难懂”的代码。