OO第四单元总结
OO第四单元总结
程序结构分析
-
第一次作业
Method ev(G) iv(G) v(G) MainClass.main(String[]) 1 1 1 MyAssociation.MyAssociation(UmlAssociation) 1 1 1 MyAssociation.getOther(String) 2 1 2 MyAssociation.isFinish() 1 1 1 MyAssociation.setClasses(String) 1 1 1 MyClass.MyClass(UmlClass) 1 1 1 MyClass.addAsso(MyAssociation) 1 1 1 MyClass.addAttr(UmlAttribute) 1 1 1 MyClass.addGener(UmlGeneralization) 1 1 1 MyClass.addOp(MyOperation) 1 1 1 MyClass.addReal(UmlInterfaceRealization) 1 1 1 MyClass.getAssoCount() 1 1 1 MyClass.getAssoId() 1 2 2 MyClass.getAttrCount() 1 1 1 MyClass.getAttrVisi(String) 5 4 5 MyClass.getInterfaces() 1 2 2 MyClass.getName() 1 1 1 MyClass.getNoHidden() 1 3 3 MyClass.getOpVisi(String) 1 3 3 MyClass.getOperationCount(HashSet ) 2 8 12 MyClass.getParents() 1 2 2 MyInterface.MyInterface(UmlInterface) 1 1 1 MyInterface.addAsso(MyAssociation) 1 1 1 MyInterface.addGener(UmlGeneralization) 1 1 1 MyInterface.addOp(MyOperation) 1 1 1 MyInterface.getId() 1 1 1 MyInterface.getName() 1 1 1 MyInterface.getParents() 1 2 2 MyOperation.MyOperation(UmlOperation) 1 1 1 MyOperation.addParam(UmlParameter) 1 1 1 MyOperation.getClassId() 1 1 1 MyOperation.getName() 1 1 1 MyOperation.getVisibility() 1 1 1 MyOperation.hasParam() 3 2 3 MyOperation.hasReturn() 3 2 3 MyUmlInteraction.MyUmlInteraction(UmlElement[]) 7 14 31 MyUmlInteraction.getClass(String) 3 1 3 MyUmlInteraction.getClassAssociatedClassList(String) 3 4 5 MyUmlInteraction.getClassAssociationCount(String) 3 2 3 MyUmlInteraction.getClassAttributeCount(String,AttributeQueryType) 1 3 3 MyUmlInteraction.getClassAttributeVisibility(String,String) 6 3 6 MyUmlInteraction.getClassCount() 1 1 1 MyUmlInteraction.getClassOperationCount(String,OperationQueryType[]) 3 3 5 MyUmlInteraction.getClassOperationVisibility(String,String) 1 1 1 MyUmlInteraction.getImplementInterfaceList(String) 3 5 6 MyUmlInteraction.getInformationNotHidden(String) 3 2 3 MyUmlInteraction.getTopParentClass(String) 3 2 3 Class OCavg WMC MainClass 1 1 MyAssociation 1.25 5 MyClass 2.38 38 MyInterface 1.14 8 MyOperation 1.57 11 MyUmlInteraction 5.67 68 第一次作业只需要分析类图。我的思路比较简单,就是仿照Uml类图的层次关系建立我自己程序的层次关系,顶层的
MyUmlInteraction
管理类MyClass
和接口MyInterface
,类和接口再管理关联继承实现关系和属性以及操作,关联关系再管理两个端,操作管理对应的参数。在进行一些查询时,就通过层层调用来完成,每一层做好每一层的工作,不去干涉其他层的任务,整体框架比较清晰。因此在构建过程中也需要每一层每一层处理,这使得MyUmlInteraction
的构造方法复杂度很高。其他的查询方法则是比较简单的图的遍历等基本算法就能够完成。 -
第二次作业
Method ev(G) iv(G) v(G) MainClass.main(String[]) 1 1 1 MyUmlGeneralInteraction.MyUmlGeneralInteraction(UmlElement[]) 1 1 1 MyUmlGeneralInteraction.getClassAssociatedClassList(String) 1 1 1 MyUmlGeneralInteraction.getClassAssociationCount(String) 1 1 1 MyUmlGeneralInteraction.getClassAttributeCount(String,AttributeQueryType) 1 1 1 MyUmlGeneralInteraction.getClassAttributeVisibility(String,String) 1 1 1 MyUmlGeneralInteraction.getClassCount() 1 1 1 MyUmlGeneralInteraction.getClassOperationCount(String,OperationQueryType[]) 1 1 1 MyUmlGeneralInteraction.getClassOperationVisibility(String,String) 1 1 1 MyUmlGeneralInteraction.getImplementInterfaceList(String) 1 1 1 MyUmlGeneralInteraction.getIncomingMessageCount(String,String) 1 1 1 MyUmlGeneralInteraction.getInformationNotHidden(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.getTopParentClass(String) 1 1 1 MyUmlGeneralInteraction.getTransitionCount(String) 1 1 1 classmodel.MyAssociation.MyAssociation(UmlAssociation) 1 1 1 classmodel.MyAssociation.getOther(String) 2 1 2 classmodel.MyAssociation.isFinish() 1 1 1 classmodel.MyAssociation.setClasses(String) 1 1 1 classmodel.MyClass.MyClass(UmlClass) 1 1 1 classmodel.MyClass.addAsso(MyAssociation) 1 1 1 classmodel.MyClass.addAttr(UmlAttribute) 1 1 1 classmodel.MyClass.addGener(UmlGeneralization) 1 1 1 classmodel.MyClass.addOp(MyOperation) 1 1 1 classmodel.MyClass.addReal(UmlInterfaceRealization) 1 1 1 classmodel.MyClass.getAssoCount() 1 1 1 classmodel.MyClass.getAssoId() 1 2 2 classmodel.MyClass.getAttrCount() 1 1 1 classmodel.MyClass.getAttrVisi(String) 5 4 5 classmodel.MyClass.getInterfaces() 1 2 2 classmodel.MyClass.getName() 1 1 1 classmodel.MyClass.getNoHidden() 1 3 3 classmodel.MyClass.getOpVisi(String) 1 3 3 classmodel.MyClass.getOperationCount(HashSet ) 2 8 12 classmodel.MyClass.getParents() 1 2 2 classmodel.MyInterface.MyInterface(UmlInterface) 1 1 1 classmodel.MyInterface.addAsso(MyAssociation) 1 1 1 classmodel.MyInterface.addGener(UmlGeneralization) 1 1 1 classmodel.MyInterface.addOp(MyOperation) 1 1 1 classmodel.MyInterface.getId() 1 1 1 classmodel.MyInterface.getName() 1 1 1 classmodel.MyInterface.getParents() 1 2 2 classmodel.MyOperation.MyOperation(UmlOperation) 1 1 1 classmodel.MyOperation.addParam(UmlParameter) 1 1 1 classmodel.MyOperation.getClassId() 1 1 1 classmodel.MyOperation.getName() 1 1 1 classmodel.MyOperation.getVisibility() 1 1 1 classmodel.MyOperation.hasParam() 3 2 3 classmodel.MyOperation.hasReturn() 3 2 3 classmodel.MyUmlClassModelInteraction.MyUmlClassModelInteraction(UmlElement[]) 7 14 31 classmodel.MyUmlClassModelInteraction.getClass(String) 3 1 3 classmodel.MyUmlClassModelInteraction.getClassAssociatedClassList(String) 3 4 5 classmodel.MyUmlClassModelInteraction.getClassAssociationCount(String) 3 2 3 classmodel.MyUmlClassModelInteraction.getClassAttributeCount(String,AttributeQueryType) 1 3 3 classmodel.MyUmlClassModelInteraction.getClassAttributeVisibility(String,String) 6 3 6 classmodel.MyUmlClassModelInteraction.getClassCount() 1 1 1 classmodel.MyUmlClassModelInteraction.getClassOperationCount(String,OperationQueryType[]) 3 3 5 classmodel.MyUmlClassModelInteraction.getClassOperationVisibility(String,String) 1 1 1 classmodel.MyUmlClassModelInteraction.getImplementInterfaceList(String) 3 5 6 classmodel.MyUmlClassModelInteraction.getInformationNotHidden(String) 3 2 3 classmodel.MyUmlClassModelInteraction.getTopParentClass(String) 3 2 3 collaboration.MyInteraction.MyInteraction(UmlInteraction) 1 1 1 collaboration.MyInteraction.addAttr(UmlAttribute) 1 1 1 collaboration.MyInteraction.addEnd(UmlEndpoint) 1 1 1 collaboration.MyInteraction.addLife(MyLifeline) 1 2 2 collaboration.MyInteraction.addMessage(UmlMessage) 1 1 1 collaboration.MyInteraction.getEndsCount() 1 1 1 collaboration.MyInteraction.getInMessageCount(String,String) 3 1 3 collaboration.MyInteraction.getLifeCount() 1 1 1 collaboration.MyInteraction.getMessageCount() 1 1 1 collaboration.MyLifeline.MyLifeline(UmlLifeline) 1 1 1 collaboration.MyLifeline.addRecieve(UmlMessage) 1 1 1 collaboration.MyLifeline.addSend(UmlMessage) 1 1 1 collaboration.MyLifeline.getId() 1 1 1 collaboration.MyLifeline.getInMessageCount() 1 1 1 collaboration.MyLifeline.getName() 1 1 1 collaboration.MyLifeline.getParent() 1 1 1 collaboration.MyUmlCollaborationInteraction.MyUmlCollaborationInteraction(UmlElement[]) 2 11 18 collaboration.MyUmlCollaborationInteraction.getIncomingMessageCount(String,String) 1 1 1 collaboration.MyUmlCollaborationInteraction.getInteraction(String) 3 1 3 collaboration.MyUmlCollaborationInteraction.getMessageCount(String) 1 1 1 collaboration.MyUmlCollaborationInteraction.getParticipantCount(String) 1 1 1 state.MyRegion.MyRegion(UmlRegion) 1 1 1 state.MyRegion.addState(MyState) 1 2 2 state.MyRegion.addTrans(MyTransition) 1 1 1 state.MyRegion.getNextCount(String,String) 5 5 8 state.MyRegion.getParent() 1 1 1 state.MyRegion.getStateCount() 1 1 1 state.MyRegion.getTransCount() 1 1 1 state.MyState.MyState(UmlFinalState) 1 1 1 state.MyState.MyState(UmlPseudostate) 1 1 1 state.MyState.MyState(UmlState) 1 1 1 state.MyState.addTransition(MyTransition) 1 1 1 state.MyState.getId() 3 3 3 state.MyState.getName() 3 3 3 state.MyState.getParent() 3 3 3 state.MyState.getTransitions() 1 1 1 state.MyTransition.MyTransition(UmlTransition) 1 1 1 state.MyTransition.addBehavior(UmlOpaqueBehavior) 1 1 1 state.MyTransition.addEvent(UmlEvent) 1 1 1 state.MyTransition.getParent() 1 1 1 state.MyTransition.getSource() 1 1 1 state.MyTransition.getTarget() 1 1 1 state.MyUmlStateChart.MyUmlStateChart(UmlElement[]) 3 16 24 state.MyUmlStateChart.getStateCount(String) 1 1 1 state.MyUmlStateChart.getStateMachine(String) 3 1 3 state.MyUmlStateChart.getSubsequentStateCount(String,String) 1 1 1 state.MyUmlStateChart.getTransitionCount(String) 1 1 1 Class OCavg WMC MainClass 1 1 MyUmlGeneralInteraction 1 17 classmodel.MyAssociation 1.25 5 classmodel.MyClass 2.38 38 classmodel.MyInterface 1.14 8 classmodel.MyOperation 1.57 11 classmodel.MyUmlClassModelInteraction 5.67 68 collaboration.MyInteraction 1.33 12 collaboration.MyLifeline 1 7 collaboration.MyUmlCollaborationInteraction 4.8 24 state.MyRegion 2.14 15 state.MyState 1.75 14 state.MyTransition 1 6 state.MyUmlStateChart 6 30 Package v(G)avg v(G)tot 1 18 classmodel 2.87 132 collaboration 2.05 43 state 2.5 65 第二次作业在类图的基础上增加了顺序图和状态图,为了便于更好的管理,我将不同的图的处理放在不同的包中,保证了结构清晰。对于顺序图和状态图,我的思路和类图是一样的,模仿Uml的结构建立我自己的管理结构,每一层做好每一层的事,这使得整个设计结构非常的清楚,易于理解,扩展性也很好。从方法的复杂度来看,除开构造方法较为复杂,顺序图和状态图的查询方法比较简单,建立了这样清晰的框架后实现相应功能是很轻松的事情。
-
第三次作业
Method ev(G) iv(G) v(G) MainClass.main(String[]) 1 1 1 MyUmlGeneralInteraction.MyUmlGeneralInteraction(UmlElement[]) 1 1 1 MyUmlGeneralInteraction.checkForUml001() 1 1 1 MyUmlGeneralInteraction.checkForUml002() 1 1 1 MyUmlGeneralInteraction.checkForUml003() 1 1 1 MyUmlGeneralInteraction.checkForUml004() 1 1 1 MyUmlGeneralInteraction.checkForUml005() 1 1 1 MyUmlGeneralInteraction.checkForUml006() 1 1 1 MyUmlGeneralInteraction.checkForUml007() 1 1 1 MyUmlGeneralInteraction.checkForUml008() 1 1 1 MyUmlGeneralInteraction.getClassAssociatedClassList(String) 1 1 1 MyUmlGeneralInteraction.getClassAssociationCount(String) 1 1 1 MyUmlGeneralInteraction.getClassAttributeCount(String,AttributeQueryType) 1 1 1 MyUmlGeneralInteraction.getClassAttributeVisibility(String,String) 1 1 1 MyUmlGeneralInteraction.getClassCount() 1 1 1 MyUmlGeneralInteraction.getClassOperationCount(String,OperationQueryType[]) 1 1 1 MyUmlGeneralInteraction.getClassOperationVisibility(String,String) 1 1 1 MyUmlGeneralInteraction.getImplementInterfaceList(String) 1 1 1 MyUmlGeneralInteraction.getIncomingMessageCount(String,String) 1 1 1 MyUmlGeneralInteraction.getInformationNotHidden(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.getTopParentClass(String) 1 1 1 MyUmlGeneralInteraction.getTransitionCount(String) 1 1 1 classmodel.Check.Check(HashMap<String, MyClass>,HashMap<String, MyInterface>) 1 1 1 classmodel.Check.checkR001() 2 2 3 classmodel.Check.checkR002() 2 3 4 classmodel.Check.checkR003() 5 5 6 classmodel.Check.checkR004() 7 7 9 classmodel.Check.checkR005() 1 3 3 classmodel.Check.checkR006() 3 2 3 classmodel.Check.dfs1(HashSet ,MyInterface,MyClass,HashSet ,UmlClassOrInterface,UmlClassOrInterface) 2 6 7 classmodel.MyAssociation.MyAssociation(UmlAssociation) 1 1 1 classmodel.MyAssociation.getId() 1 1 1 classmodel.MyAssociation.getOther(String) 2 2 2 classmodel.MyAssociation.getOtherEnd(String) 2 3 3 classmodel.MyAssociation.isFinish() 1 1 1 classmodel.MyAssociation.setEnds(UmlAssociationEnd) 1 1 1 classmodel.MyClass.MyClass(UmlClass) 1 1 1 classmodel.MyClass.addAsso(MyAssociation) 1 1 1 classmodel.MyClass.addAttr(UmlAttribute) 1 1 1 classmodel.MyClass.addGener(UmlGeneralization) 1 1 1 classmodel.MyClass.addOp(MyOperation) 1 1 1 classmodel.MyClass.addReal(UmlInterfaceRealization) 1 1 1 classmodel.MyClass.checkR001() 1 7 7 classmodel.MyClass.checkR005() 6 3 6 classmodel.MyClass.getAssoCount() 1 1 1 classmodel.MyClass.getAssoId() 1 2 2 classmodel.MyClass.getAttrCount() 1 1 1 classmodel.MyClass.getAttrVisi(String) 5 4 5 classmodel.MyClass.getId() 1 1 1 classmodel.MyClass.getInterfaces() 1 2 2 classmodel.MyClass.getName() 1 1 1 classmodel.MyClass.getNoHidden() 1 3 3 classmodel.MyClass.getOpVisi(String) 1 3 3 classmodel.MyClass.getOperationCount(HashSet ) 2 8 12 classmodel.MyClass.getParents() 1 2 2 classmodel.MyClass.getUclass() 1 1 1 classmodel.MyInterface.MyInterface(UmlInterface) 1 1 1 classmodel.MyInterface.addAsso(MyAssociation) 1 1 1 classmodel.MyInterface.addAttr(UmlAttribute) 1 1 1 classmodel.MyInterface.addGener(UmlGeneralization) 1 1 1 classmodel.MyInterface.addOp(MyOperation) 1 1 1 classmodel.MyInterface.checkR005() 6 3 6 classmodel.MyInterface.checkR006() 3 2 3 classmodel.MyInterface.getId() 1 1 1 classmodel.MyInterface.getName() 1 1 1 classmodel.MyInterface.getParents() 1 2 2 classmodel.MyInterface.getUinterface() 1 1 1 classmodel.MyOperation.MyOperation(UmlOperation) 1 1 1 classmodel.MyOperation.addParam(UmlParameter) 1 1 1 classmodel.MyOperation.getClassId() 1 1 1 classmodel.MyOperation.getName() 1 1 1 classmodel.MyOperation.getVisibility() 1 1 1 classmodel.MyOperation.hasName() 4 3 5 classmodel.MyOperation.hasParam() 3 2 3 classmodel.MyOperation.hasReturn() 3 2 3 classmodel.MyUmlClassModelInteraction.MyUmlClassModelInteraction(UmlElement[]) 7 15 32 classmodel.MyUmlClassModelInteraction.checkR001() 1 1 1 classmodel.MyUmlClassModelInteraction.checkR002() 1 1 1 classmodel.MyUmlClassModelInteraction.checkR003() 1 1 1 classmodel.MyUmlClassModelInteraction.checkR004() 1 1 1 classmodel.MyUmlClassModelInteraction.checkR005() 1 1 1 classmodel.MyUmlClassModelInteraction.checkR006() 1 1 1 classmodel.MyUmlClassModelInteraction.getClass(String) 3 1 3 classmodel.MyUmlClassModelInteraction.getClassAssociatedClassList(String) 3 4 5 classmodel.MyUmlClassModelInteraction.getClassAssociationCount(String) 3 2 3 classmodel.MyUmlClassModelInteraction.getClassAttributeCount(String,AttributeQueryType) 1 3 3 classmodel.MyUmlClassModelInteraction.getClassAttributeVisibility(String,String) 6 3 6 classmodel.MyUmlClassModelInteraction.getClassCount() 1 1 1 classmodel.MyUmlClassModelInteraction.getClassOperationCount(String,OperationQueryType[]) 3 3 5 classmodel.MyUmlClassModelInteraction.getClassOperationVisibility(String,String) 1 1 1 classmodel.MyUmlClassModelInteraction.getImplementInterfaceList(String) 3 5 6 classmodel.MyUmlClassModelInteraction.getInformationNotHidden(String) 3 2 3 classmodel.MyUmlClassModelInteraction.getTopParentClass(String) 3 2 3 collaboration.MyInteraction.MyInteraction(UmlInteraction) 1 1 1 collaboration.MyInteraction.addAttr(UmlAttribute) 1 1 1 collaboration.MyInteraction.addEnd(UmlEndpoint) 1 1 1 collaboration.MyInteraction.addLife(MyLifeline) 1 2 2 collaboration.MyInteraction.addMessage(UmlMessage) 1 1 1 collaboration.MyInteraction.getEndsCount() 1 1 1 collaboration.MyInteraction.getInMessageCount(String,String) 3 1 3 collaboration.MyInteraction.getLifeCount() 1 1 1 collaboration.MyInteraction.getMessageCount() 1 1 1 collaboration.MyLifeline.MyLifeline(UmlLifeline) 1 1 1 collaboration.MyLifeline.addRecieve(UmlMessage) 1 1 1 collaboration.MyLifeline.addSend(UmlMessage) 1 1 1 collaboration.MyLifeline.getId() 1 1 1 collaboration.MyLifeline.getInMessageCount() 1 1 1 collaboration.MyLifeline.getName() 1 1 1 collaboration.MyLifeline.getParent() 1 1 1 collaboration.MyUmlCollaborationInteraction.MyUmlCollaborationInteraction(UmlElement[]) 2 11 18 collaboration.MyUmlCollaborationInteraction.getIncomingMessageCount(String,String) 1 1 1 collaboration.MyUmlCollaborationInteraction.getInteraction(String) 3 1 3 collaboration.MyUmlCollaborationInteraction.getMessageCount(String) 1 1 1 collaboration.MyUmlCollaborationInteraction.getParticipantCount(String) 1 1 1 state.MyRegion.MyRegion(UmlRegion) 1 1 1 state.MyRegion.addState(MyState) 1 2 2 state.MyRegion.addTrans(MyTransition) 1 1 1 state.MyRegion.checkR007() 3 2 3 state.MyRegion.checkR008() 3 2 3 state.MyRegion.getNextCount(String,String) 5 5 8 state.MyRegion.getParent() 1 1 1 state.MyRegion.getStateCount() 1 1 1 state.MyRegion.getTransCount() 1 1 1 state.MyState.MyState(UmlFinalState) 1 1 1 state.MyState.MyState(UmlPseudostate) 1 1 1 state.MyState.MyState(UmlState) 1 1 1 state.MyState.addTransition(MyTransition) 1 1 1 state.MyState.checkR007() 1 2 2 state.MyState.checkR008() 1 2 2 state.MyState.getId() 3 3 3 state.MyState.getName() 3 3 3 state.MyState.getParent() 3 3 3 state.MyState.getTransitions() 1 1 1 state.MyTransition.MyTransition(UmlTransition) 1 1 1 state.MyTransition.addBehavior(UmlOpaqueBehavior) 1 1 1 state.MyTransition.addEvent(UmlEvent) 1 1 1 state.MyTransition.getParent() 1 1 1 state.MyTransition.getSource() 1 1 1 state.MyTransition.getTarget() 1 1 1 state.MyUmlStateChart.MyUmlStateChart(UmlElement[]) 3 16 24 state.MyUmlStateChart.checkR007() 1 3 3 state.MyUmlStateChart.checkR008() 1 3 3 state.MyUmlStateChart.getStateCount(String) 1 1 1 state.MyUmlStateChart.getStateMachine(String) 3 1 3 state.MyUmlStateChart.getSubsequentStateCount(String,String) 1 1 1 state.MyUmlStateChart.getTransitionCount(String) 1 1 1 Class OCavg WMC MainClass 1 1 MyUmlGeneralInteraction 1 25 classmodel.Check 4.38 35 classmodel.MyAssociation 1.33 8 classmodel.MyClass 2.65 53 classmodel.MyInterface 1.73 19 classmodel.MyOperation 1.88 15 classmodel.MyUmlClassModelInteraction 4.17 75 collaboration.MyInteraction 1.33 12 collaboration.MyLifeline 1 7 collaboration.MyUmlCollaborationInteraction 4.8 24 state.MyRegion 2.33 21 state.MyState 1.6 16 state.MyTransition 1 6 state.MyUmlStateChart 5.14 36 Package v(G)avg v(G)tot 1 26 classmodel 2.96 210 collaboration 2.05 43 state 2.53 81 第三次作业需要完成对Uml图进行检查的功能,而主要的检查是针对类图进行的,因此我建立了
Check
类,专门用来处理检查的问题。具体到检查问题,核心还是基本的图的遍历。不过在检查继承环的时候,常规的dfs由于记录了已访问的节点,会导致继承环不能完全检测,我的程序为了保证继承环完全检测,修改了dfs算法,结果导致ctle,实际上这个方法只需要检测每个点是否在继承环上即可。
架构设计与对OO的理解
-
第一单元
第一单元整体设计是比较糟糕的,三次作业每次重构且强测爆炸足以说明这一点。第一次作业的架构的核心是描述幂函数通项,这个设计仅仅能够处理基本的幂函数多项式求导,没有层次可言。第二次作业增加了三角函数后重构的设计依然很差劲,核心是与前一次作业没有区别,设计了四元组来描述表达式通项,结果也仅能够满足这一次作业的需求,扩展性很差。第三次作业增加括号和嵌套,这一次不得不采用树形结构,将表达式拆分后递归地进行求导,这样进行设计才算是真正地提取出了求导运算的本质,设计自然的有了层次,扩展性也大为提高。
总的来说,第一单元的设计关键在于能否提取出这样的求导计算最核心最普适的本质,前两次的设计失败关键就在于没有提取出求导计算中最本质的逻辑,而是采用了表面的描述通项的做法,扩展性层次感自然是不行的。 -
第二单元
第二单元是整个课程中写得比较好的一个单元,在掌握了多线程设计的基本理论知识和一些设计模式后,最终完成作业的架构是比较清晰和安全的。第一次作业采用了简单的生产者消费者模型,电梯采用look调度算法,整个电梯调度系统的逻辑是比较清楚的,因此处理线程安全是一件比较容易的事,不容易出bug。第二次作业在增加了电梯数量后,我设计了调度器用来分配请求,这样每个电梯就能够继续采用第一次作业的生产者消费者模型,不需要做太大的改动,整个结构也是很简单的。第三次作业增加换乘需求,相应的调度器就增加了拆分请求的功能,基本设计依然延续第二次的框架。
三次作业下来,没有出bug,强测分数也很好看,主要还是得益于采用了良好的设计模式。从现实生活中来说,其实这些设计模式不过是现实中处理一些问题的缩影和抽象,与其说是采用了良好的设计模式,不如说是对现实状况的还原比较到位,使得程序线程安全,效率高。 -
第三单元
第三单元学习的是规格化设计,虽然架构也很重要,不过在完成这单元的作业时,主要精力还是放在了具体的算法上。
这单元在架构上有两点我认为不太妥当的地方,一个是第二次作业中缓存的设计,缓存确实极大地提高了性能,但是这样的设计增加了类之间的耦合,使得出bug的可能提高了,比如在第三次作业中我忘记了在其它类中更新缓存,导致出了bug,即便强测没有检查出来侥幸存活。第二个是连通块的设计,我在前两次作业中没有采用这样的设计,主要是考虑到未来可能出现的删除人的需求,直到第三次作业中没有相关的需求,我才设计了连通块类。在这个单元的作业中,连通块没有遇上问题主要是没有删除人的需求,但我认为这样的需求是存在的,倘若有第五次第六次作业,出现了更多更复杂的需求,这样的设计架构未必能够满足这些需求。 -
第四单元
第四单元架构已经在前文中详细分析过,核心思想还是按照Uml的结构去尽可能地还原。
从这四个单元来看,除了第三单元对于架构的感受不深,两外三个单元对架构的要求是比较高的。虽然这三个单元内容主题完全不同,但设计架构的目标是一样的,就是尽可能地把现实中的逻辑细致地还原表达出来。
所以OO是什么?J同学在一次研讨课上表示OO在他看来就是将数据和方法集中起来封装,我认为这个表述没有触及到OO的本质,虽然看上去每次作业设计的各种类的形式确实是这样,有成员变量和方法,但这么做的核心目的是更好地描述现实逻辑。比如说电梯单元中设计电梯类,有一些成员变量比如运行方向、载客量、乘客,这些成员变量都是为了能够更加精确地描述电梯这个现实中的事物,电梯的一些方法比如开门、关门、上客、下客,这些方法也是为了更加准确地描述现实中电梯的行为,数据加方法,对应着现实事物的属性和行为。而对于继承、接口这样的性质,也是为了更方便更简洁地描述现实事物,比如第一单元中让幂函数、三角函数去继承一个项item
类,从代码来看是减少了不必要的重复描述,提高代码复用性,而现实中我们也会认为幂函数和三角函数属于项的一种,这是一个很自然地认识,是符合常识符合数学逻辑的认识。而在第一单元架构设计中,正如之前所说,好的架构能够精确地还原现实行为的逻辑本质,第一单元中前两次采用的描述通项的架构显然没有精确地表现出求导这个行为的本质,而第三次作业的表达式树的设计将表达式和求导的逻辑描述地更加精确,自然成为了一种比较好的架构。综上所述,我认为OO是描述现实逻辑的一种手段。
测试
这个课程除了完成作业,另外一大任务是对程序进行测试。实践表明,所有强测互测爆炸的作业都是没有认真测试的恶果。
第一单元前两次作业使用python生成随机测试样例,构建了一个简易的评测机,但这个评测机仅仅做到了随机,而忽视了特殊数据边界数据,没有完全覆盖所有的情况,导致互测爆炸。之后借鉴了dalao的思想,通过控制生成表达式的长度来生成一些特殊数据,评测机有所提升,不过对于wrong format依然无能为力,强测还是出错。第三次作业忙于重构和冯如杯二审,没有搭建评测机,结果强测爆炸,算是还了之前糟糕的架构设计欠下的债。
第二单元没有搭建评测机,所幸没有出问题。这里提供一位dalao的第二单元评测机构建思路,我从中学到了很多,获益匪浅。
第三单元没有搭建评测机,采用的是junit单元测试,主要是对一些容易出问题的方法如最短路、强连通分量等方法进行了测试,保证了功能的正确,强测过关。
第四单元没有搭建评测机也没有进行单元测试,强测果然出问题。这个单元搭建评测机有一些困难,主要是数据不太容易生成。最后采用的是在StarUml中画图然后进行测试这样的原始方法,也注定了有一些情况考虑不到,强测出问题情理之中。
总的来说测试这块做的确实不如人意,是需要进行加强的地方。无论是搭建评测机还是自己手动构建边界数据都还有很多需要提升的地方,而不能依赖所谓的形式验证,形式验证对于比较简易的架构或许可以,但遇到大工程时就无能为力了。
课程收获
- 学会使用一些工具比如git,VisualVM
- 学会了java的一些基本语法和继承、抽象类、接口等性质
- 学习了基本的多线程设计
- 学习了一些不错的设计模式
- 认识了规格化设计
- 学习了图中常使用的一些算法如最短路、tarjan、并查集等
- 学习了UML类图、顺序图、状态图
- 认识到了架构设计的重要性。好的架构bug少,可扩展性强,性能也不会太差
- 尝试搭建了评测机
课程改进
- 希望实验能够公布结果,不然实验做完也不知道有没有掌握相应的知识点。说实话,我在实验中的收获不是很大。
- 希望第三单元不要涉及JML的一些工具链如openjml,这些工具不成熟不强大,使用这些工具纯属费力不讨好。
- 第四单元的作业指导书对于要求的描述不够清楚,从讨论区就能够看出来,这一单元讨论区提问是相当多。希望指导书能够写地更明确更清晰。
线上学习的体会
总的来说效果还是不错的,作业和实验没有因为线上的问题而遇到什么困难,平时的课程讲授也比较生动有趣,而且对于不清楚的地方可以回看,总的来说课程体验相比线下课没有差多少。不过因为线上的原因,同学的讨论没有线下那么方便,交流上确实受到了影响。
OO是一门很有价值的课程,让我收获颇丰,培养了我的工程能力的同时也磨练了我的心态。希望未来的OO课能够越办越好。