BUAAOO 第四单元总结

BUAAOO 第四单元总结

经过一轮又一轮OO的洗礼,终于迎来了最终完结撒花的时刻。此时此刻,一边打字,一边心里还是有些小激动的(此处应有表情包♪(^∇^*))。

最后一单元是关于UML类图的,两次作业(包括这次博客...)都在我的烤漆之中,可以说是在枪林弹雨中杀出一条血路(ง •_•)ง。不过最终结果还算好,也算是给OO画上了一个还不错的句号了。

以下,是我对于这一单元的OO作业,以及这一学期的OO学习的总结。

 

一. 本单元两次作业的架构设计 

1. 第一次作业

类图

复杂度表

Method ev(G) iv(G) v(G)
Class.Class(String,String,String,Visibility) 1 1 1
Class.addAssoSet(String) 1 1 1
Class.addEndIdList(String) 1 2 2
Class.addIdAtMap(UmlAttribute) 1 3 3
Class.addItfRlzList(String) 1 2 2
Class.addOpMap(Operation) 1 2 2
Class.getAssoSetSize() 1 1 1
Class.getAtByName(String) 1 1 1
Class.getAtSizeByName(String) 1 2 2
Class.getEndIdList() 1 1 1
Class.getGenClassId() 1 1 1
Class.getId() 1 1 1
Class.getIdAtMapSize() 1 1 1
Class.getItfRlzList() 1 1 1
Class.getName() 1 1 1
Class.getNotHiddenList() 1 1 1
Class.getOpSetByName(String) 2 2 3
Class.getOpSize(OperationQueryType) 1 10 14
Class.getOpSizeByName(String) 1 2 2
Class.getParentId() 1 1 1
Class.getVisibility() 1 1 1
Class.setGenClassId(String) 1 1 1
Class.setIdOpMap(UmlParameter) 1 2 2
Interface.Interface(String,String) 1 1 1
Interface.addGenItfIdList(String) 1 2 2
Interface.getGenItfIdList() 1 1 1
Interface.getId() 1 1 1
Interface.getName() 1 1 1
Main.main(String[]) 1 1 1
MyUmlInteraction.MyUmlInteraction(UmlElement[]) 1 23 23
MyUmlInteraction.getClassAssociatedClassList(String) 2 9 9
MyUmlInteraction.getClassAssociationCount(String) 2 6 6
MyUmlInteraction.getClassAttributeCount(String,AttributeQueryType) 1 3 3
MyUmlInteraction.getClassAttributeVisibility(String,String) 5 2 7
MyUmlInteraction.getClassCount() 1 1 1
MyUmlInteraction.getClassOperationCount(String,OperationQueryType) 1 1 1
MyUmlInteraction.getClassOperationVisibility(String,String) 1 4 4
MyUmlInteraction.getImplementInterfaceList(String) 2 12 12
MyUmlInteraction.getInformationNotHidden(String) 1 4 4
MyUmlInteraction.getTopParentClass(String) 1 2 2
MyUmlInteraction.throwClassException(String) 3 1 3
Operation.Operation(String,String,String,Visibility) 1 1 1
Operation.addInParameter(UmlParameter) 1 1 1
Operation.getId() 1 1 1
Operation.getName() 1 1 1
Operation.getParentId() 1 1 1
Operation.getVisibility() 1 1 1
Operation.noParameter() 1 1 1
Operation.noReturn() 1 1 1
Operation.setReParameter(NameableType) 1 1 1
Class OCavg WMC
Class 2 46
Interface 1.2 6
Main 1 1
MyUmlInteraction 6 72
Operation 1 9

分析

在第一次作业中我们最终需要实现一个UML类图解析器,可以通过输入各种指令来进行类图有关信息的查询。

这次作业中,我在UmlElement的基础上,通过简化原有元素以及加入新的元素,建立了自己的Class,Interface类,在Class类下又包括了Operation类,感觉结构还算是比较清晰。我的主要构造都在MyUmlInteraction的构造函数里面执行,MyUmlInteraction中执行的操作大多是调用了构成的类之中的函数。

相比于之前作业中的设计,我更加清楚化了类的层次结构,很大程度上减少了MyUmlInteraction中一个操作代码块太长的问题,感觉也算是一个进步吧。

2. 第二次作业

复杂度表

Method ev(G) iv(G) v(G)
Class.Class(String,String,String,Visibility) 1 1 1
Class.addAssoSet(String) 1 1 1
Class.addEndIdList(String) 1 2 2
Class.addIdAtMap(UmlAttribute) 1 3 3
Class.addItfRlzList(String) 1 1 1
Class.addOpMap(Operation) 1 2 2
Class.checkEndName(String) 1 2 2
Class.checkUml002() 1 1 1
Class.getAssoSetSize() 1 1 1
Class.getAtByName(String) 1 1 1
Class.getAtSizeByName(String) 1 2 2
Class.getEndIdList() 1 1 1
Class.getGenClassId() 1 1 1
Class.getId() 1 1 1
Class.getIdAtMapSize() 1 1 1
Class.getItfRlzList() 1 1 1
Class.getName() 1 1 1
Class.getNotHiddenList() 1 1 1
Class.getOpSetByName(String) 2 2 3
Class.getOpSize(OperationQueryType) 1 10 14
Class.getOpSizeByName(String) 1 2 2
Class.getParentId() 1 1 1
Class.getVisibility() 1 1 1
Class.setGenClassId(String) 1 1 1
Class.setIdOpMap(UmlParameter) 1 2 2
Interaction.Interaction(String,String) 1 1 1
Interaction.addLifeLine(String,String) 1 3 3
Interaction.addMassage(String,String,String) 1 2 2
Interaction.getId() 1 1 1
Interaction.getLifeLineIdSetSize() 1 1 1
Interaction.getMessageIdSetSize() 1 1 1
Interaction.getName() 1 1 1
Interaction.getTargetMassageCnt(String) 1 1 1
Interaction.throwLifelineException(String) 3 1 3
Interface.Interface(String,String) 1 1 1
Interface.addGenItfIdList(String) 1 1 1
Interface.getGenItfIdList() 1 1 1
Interface.getId() 1 1 1
Interface.getName() 1 1 1
Main.main(String[]) 1 1 1
MyUmlGeneralInteraction.MyUmlGeneralInteraction(UmlElement[]) 1 18 18
MyUmlGeneralInteraction.checkForUml002() 2 2 3
MyUmlGeneralInteraction.checkForUml008() 2 15 16
MyUmlGeneralInteraction.checkForUml009() 11 14 15
MyUmlGeneralInteraction.getIncomingMessageCount(String,String) 1 1 1
MyUmlGeneralInteraction.getMessageCount(String) 1 1 1
MyUmlGeneralInteraction.getParticipantCount(String) 1 1 1
MyUmlGeneralInteraction.getStateCount(String) 1 1 1
MyUmlGeneralInteraction.getSubsequentStateCount(String,String) 1 1 1
MyUmlGeneralInteraction.getTransitionCount(String) 1 1 1
MyUmlGeneralInteraction.throwInteractionException(String) 3 1 3
MyUmlGeneralInteraction.throwStateMachineException(String) 3 1 3
MyUmlInteraction.MyUmlInteraction(UmlElement[]) 1 23 23
MyUmlInteraction.getClassAssociatedClassList(String) 2 9 9
MyUmlInteraction.getClassAssociationCount(String) 2 6 6
MyUmlInteraction.getClassAttributeCount(String,AttributeQueryType) 1 3 3
MyUmlInteraction.getClassAttributeVisibility(String,String) 5 2 7
MyUmlInteraction.getClassCount() 1 1 1
MyUmlInteraction.getClassOperationCount(String,OperationQueryType) 1 1 1
MyUmlInteraction.getClassOperationVisibility(String,String) 1 4 4
MyUmlInteraction.getEndIdNameMap() 1 1 1
MyUmlInteraction.getIdAssoMap() 1 1 1
MyUmlInteraction.getIdClassMap() 1 1 1
MyUmlInteraction.getIdItfMap() 1 1 1
MyUmlInteraction.getIdUmlClassMap() 1 1 1
MyUmlInteraction.getIdUmlItfMap() 1 1 1
MyUmlInteraction.getImplementInterfaceList(String) 2 12 12
MyUmlInteraction.getInformationNotHidden(String) 1 4 4
MyUmlInteraction.getTopParentClass(String) 1 2 2
MyUmlInteraction.throwClassException(String) 3 1 3
Operation.Operation(String,String,String,Visibility) 1 1 1
Operation.addInParameter(UmlParameter) 1 1 1
Operation.getId() 1 1 1
Operation.getName() 1 1 1
Operation.getParentId() 1 1 1
Operation.getVisibility() 1 1 1
Operation.noParameter() 1 1 1
Operation.noReturn() 1 1 1
Operation.setReParameter(NameableType) 1 1 1
State.State(String,String) 1 1 1
State.addTargetIdSet(String) 1 1 1
State.getId() 1 1 1
State.getName() 1 1 1
State.getTargetIdSet() 1 1 1
StateMachine.StateMachine(String,String) 1 1 1
StateMachine.addState(State) 1 2 2
StateMachine.addTransition(String,String,String) 1 2 2
StateMachine.getId() 1 1 1
StateMachine.getName() 1 1 1
StateMachine.getStateSize() 1 1 1
StateMachine.getSubStateCount(String) 1 6 6
StateMachine.getTransitionCnt() 1 1 1
StateMachine.throwStateException(String) 3 1 3
Tarjan.Tarjan(List<ArrayList<Integer>>,int) 1 1 1
Tarjan.run() 1 3 3
Tarjan.tarjan(int) 1 6 6
Class OCavg WMC
Class 1.92 48
Interaction 1.56 14
Interface 1 5
Main 1 1
MyUmlGeneralInteraction 5.25 63
MyUmlInteraction 4.33 78
Operation 1 9
State 1 5
StateMachine 2 18
Tarjan 3.33 10

分析

在这次作业中,我们需要扩展类图解析器,使得可以支持对UML状态图和顺序图的解析,并可以通过输入相应的指令来进行相关查询。并且,在所解析的UML模型基础上,按照规定的规则检查模型中是否存在违背规则的情况,并输出相应信息。

在这次作业中,由于加入了对于状态图和顺序图的处理,我在上一次作业的基础之上加入了StateMachine和Interaction两个大类。其中,StateMachine又由State构成。又因为需要处理对于模型的规则检查,我加入了Tarjan计算类,用于求出一个图的强连通分量。

相比原来的作业来说,我分离出了单独的计算类,使得主要操作的代码看起来更加清晰明了。

 

二. 架构设计及OO方法理解的演进 

1. 第一单元

第一单元算是对OO的一个初印象吧。

第一次作业

由于刚刚开始,我几乎不知道该怎么正确使用类来让代码结构更加清晰。因此,除了主要的计算Derivation类,我只用了一个多项式类,基本上所有的操作都在多项式类中完成,当时的思维还是面向过程的思维。

第二次作业

我对类有了更多的了解,我将第一次作业中的多项式类拆分成了项类和多项式类,在其中分别进行不同的操作,相比第一次作业来说,代码显得清晰了一些。

第三次作业

我了解了继承和实现,第一次用了Interface来规划我的模型。我建了一个Element接口,将所有操作类型Cos,Sin,X,Expression作为对于Element实现。之后,由这些Element又构成了Term类,Term又构成了整体结构。

整体

经过这三次作业,算是刚刚明白了一些面向对象的思维,改变了最开始觉得的Java不就是把C的代码全写到一个类里的思维,慢慢学习提取对象用类来规划自己的代码结构

2. 第二单元

这个单元是关于多线程的问题,之前我从来没有接触过这一类的问题,算是一个全新的体验。

第一次作业

第一次作业中,我直接采用的傻瓜调度。在架构设计上,我有两个仓库,分别是insideList(List中是电梯里面的请求),outsideList(List中是电梯外面,即还没有被电梯取走的请求)。Input线程向仓库outsideList里里面放东西,Elevator从仓库outsideList里面取东西。Elevator将从outsideList中取出来的指令放到自己的insideList里,指令执行完毕(即人从电梯中出去之后)将指令从insideList中取出。

第二次作业

在第二次作业中,我在代码结构上还是沿用了第一次作业的思路,设置了insideList和outsideList两个仓库。整体采用ALS的想法,并且在电梯运行中间加入了捎带人的操作。

第三次作业

第三次作业中我的电梯沿用了之前的思想,不过由于是多电梯,总体设置了一个outsideList作为总请求仓库,每个电梯都分别设置了insideList作为电梯内部的请求仓库。

我的电梯总体采用的是Look算法,根据具体情况加了一些改动。我的电梯采用的是自己抢人的模式,即电梯在运行途中发现可以捎带的人,就把请求从outsideList 中取出放入自己的insideList中。先对指令进行处理,限定人可以乘坐的一个或几个电梯,之后就是电梯自由抢,哪个电梯先到就让人上哪个电梯。

整体

这次我们主要是为了解决多线程的问题。我这三次都没有用到调度器,而是采用了由电梯自己从整体仓库中抢人的办法。这个办法和使用调度器管理的办法各有利弊。使用调度器更有利于之后对于捎带算法的扩展,而直接抢人的办法对于实时变化能有更优的处理。这些都是值得学习的思想。

3. 第三单元

第一次作业

第一次作业处理的情况比较简单,从架构设计上来说,这次并不需要从其中拆分出单独的对象,就按照题目所要求的架构来就可以和清楚的表达出题目的意思。

第二次作业

这次我的架构设计做的比较不好,我应该拆分出一个结点类,在节点类中储存每个节点对应的邻接表。并且在结点类中进行维护邻接表,查询每个点是否有临边,求出每个点到其他点最短距离的操作,而不应该把这些操作都放在MyGraph类之中,这样会导致MyGraph类显得很累赘,不清楚,在测试找Bug的时候也非常不方便。

第三次作业

由于在第二次中没有有效的分出结点类,在时间比较紧的情况之下,我没有重构我的代码,而是把之后的操作又写进了MyRailwaySystem类之中,使得结构更加累赘。我认为我应该使用一个结点类基本来满足这次的需求,求最短路径的算法可以写在结点类之中,四种不同的最短路径问题只需要一种Dij算法就够了,剩余的就是改变权重的问题。

整体

这一单元整体来说,在架构设计方面做的非常不好,过分依赖于所给结构,没有从需求提取相应的对象。而且我当时不知道怎么具体实现继承的构造继承,最终产生了很大的问题。不过这一单元也是给我敲响了警钟,让我在下一单元的学习中没有再重蹈覆辙。

4. 第四单元

第一次作业

这次作业中,我在UmlElement的基础上,通过简化原有元素以及加入新的元素,建立了自己的Class,Interface类,在Class类下又包括了Operation类,感觉结构还算是比较清晰。我的主要构造都在MyUmlInteraction的构造函数里面执行,MyUmlInteraction中执行的操作大多是调用了构成的类之中的函数。

第二次作业

在这次作业中,由于加入了对于状态图和顺序图的处理,我在上一次作业的基础之上加入了StateMachine和Interaction两个大类。其中,StateMachine又由State构成。又因为需要处理对于模型的规则检查,我加入了Tarjan计算类,用于求出一个图的强连通分量。

整体

这一单元在架构方面,我充分吸取了上一单元的教训,对于结构层次进行了细致的规划。这次我的架构设计相比之前来说有了很大的进步,也算是一次相对完美的收官吧。

 

三. 测试理解与实践的演进

1. 第一单元

在前两次作业中,我有许多互测用例的构造都基于对于输入输出结构的判断。比如在不同位置加入空格,多余的运算符号等。其余用例针对于功能的完善,测试程序能否根据输入的不同搭配得出正确的结果。

最后一次作业中,我的用例都是依然是针对上文中提到的这两个方面。但由于要求不考虑对于WRONG FORMAT的检查,我对于输入输出结构的判断主要集中于测试程序是否会对正确格式的样例输出WRONG FORMAT。其中,包括一些在格式判断中可能出现,比如括号的嵌套,表达式因子的嵌套相乘或相加,以及对于三角函数括号内部格式的判断等。由于这次作业的情况比较复杂,对于功能完善性的测试也非常重要。在测试时,主要关注对于边界情况的考虑,比如 sin(x)^+10000 ;以及输出结果正负号的正确性。

2. 第二单元

在前两次作业中,我有许多样例构造都基于对于特殊情况的处理。比如电梯需要改方向时能否正确处理,以及开门时可以多人上下的情况处理

最后一次作业中,除了用上一次的用例,我还进行了对于换乘情况的测试。另外,我也构造了一些随机数据,测试电梯对于多条多种指令的情况能否正常运行。

3. 第三单元

在当时自己测试的时候,认为模块测试是一件非常费时费力的事情,而且还不一定能把错误给测出来。但最后结果出来之后,发现自己确实还是栽在了对于模块测试不够重视之上。经过这次的教训,我认为整个工程来看,模块测试和整体测试确实都发挥着非常重要的作用。模块测试可以发现在整理测试中不易察觉的问题,而整体测试则可以测试各模块之间相互配合时的问题,两者都是测试时必不可少的部分,都应该被给予同样的重视。

4. 第四单元

在这一单元中,由于样例越来越难以覆盖所有的情况,我在这一单元中除了用样例对代码进行此时,还加入了阅读代码的过程。在阅读代码的过程中,我可以重新捋清自己当时在写代码时的思路,加入必要的注释。我发现,这样也能检查出自己在写代码时候的一些思维漏洞,也取得了不错的效果。

四. 课程收获

经过这一个学期对于OO的学习,我感觉我还是得到了很多的收获的。

架构设计方面,我知道了怎么从众多的需求中提取对象,怎么用类和接口来规划对象之间的关系,怎么正确使用类的继承关系。

同时,我也对于多线程UML图有了更加深入的理解。我也学到了模块测试的方法,并且明白了模块测试的重要性。

对于我这一学期的学习而言,确实可以说挺曲折的,在中间有两局出现了比较大的问题。不过我也从其中吸取了经验和教训,最终的句号也还算圆满。

可以说,这一学期没有周末的日子确实挺让人崩溃的,不过我也确实从这一学期OO的疯狂码代码中学到了很多,使用的时间也算是物有所值。

 

五. 建议

  1. 希望下一届可以调整一下实验课的时间,感觉刚学完就上机确实比较虚。

  2. 希望老师在讲课过程中可以多用一些例子,尤其有几章的内容,感觉比较抽象难以理解。

  3. 希望可以各班之间互相分享讨论课时的资料,更好的学习。

 

最后的最后,无论结果如何,收官快乐!

猜你喜欢

转载自www.cnblogs.com/ydch-001/p/11070989.html