类设计如下图所示
本次作业主要涉及六个类,其中包括主类 Main ,通用Map类 UmlElementIdMap 类,实现官方接口类 MyUmlInteraction 类,以及自定义interface类 MyInterface 类,自定义class类 ClassContainer 类,自定义Operation列表 MethodList 类
UmlElemeIdMap类
该类设计初衷是为了存储所有的UMLElement从Id到元素的映射,从而方便后续操作中对UMLElement的提取。因此为了实现该类的通用性,将该类实现为单例化模式,并且所有方法声明为静态方法,从而不用在其他每个类中存储该类的属性分量
属性:
方法:
MethodList类
该类设计初衷是为了存储一个类中的所有方法,包括对应方法的相关信息,比如可见性,参数等等。即将所有parentId相同的UMLOperation存储在同一个 MethodList 中,从而方便后续Class信息的存储。
属性:
方法:
ClassContainer类
该类设计初衷是为了存储对应Class的所有信息,包括所有注册的方法,父类,顶级父类,实现接口等待
属性:
方法:
MyInterface类
该类实现初衷是设计一个可以存储接口以及相关继承信息的自定义类,进而方便查询函数的书写
属性:
方法:
MyUMLInteraction类
该类为实现官方接口类,主要属性为上述定义的自定义存储类,主要方法为查询方法,其中包括调用已经在属性中实现的方法以及间接实现的方法
属性:
方法:
对于每一个UmlElement类型,存在对应的add方法,分别对每一个Element进行分类添加到对应数据结构里。例如对于 addUmlClass 方法将UmlClass新建一个ClassContainer对象并且注册到classMap中
官方接口查询方法:
各个包的类图如下,其中umlclass包完成UMLModel图的解析以及查询,umlsequence包完成UMLSequence的解析和查询,umlstate完成UMLStateMachine图的解析和查询,utils是完成本次作业的通用工具包
对于包结构图如下:
MyUmlGeneralInteraction类
该类实现官方接口,完成本次作业所有任务
属性:
方法:
umlclass包
RelationshipTree类
该类设计为泛型类,为了存储class和interface的继承关系,方便类图的合法性检查
属性:
方法:
umlsequence包
MyUmlInteraction类
该类完成对于一个UMLInteraction的信息的存储以及查询,包括所有的LifeLine和Message
属性:
方法:
MyUmlSequenceModelInteraction类
该类实现官方接口UmlCollaborationInteraction,完成对顺序图的构建以及查询
属性:
方法:
umlstate包
MyUmlState类
该类实现对State的封装,主要记录对应State的后继状态
属性:
方法:
MyUmlStateMachine类
该类实现对UMLStateMachine的封装,主要存储对应StateMachine的相关信息
属性:
方法:
MyUmlStateModelInteraction类
该类实现了官方接口UmlStateChartInteraction,完成对状态图的注册和查询
属性:
方法:
对于本次作业框架设计,三种模型分别实例化对应的数据结构来存储信息,其中检查方法内嵌到类图模型中完成
本次作业的算法难点主要在于状态图后继状态查询和类图模型检查
对于状态图后继状态个数查询,使用dfs算法完成
对于类图模型的合法性检查,调用对应 RelationshipTree 的方法进行检查:
对于规则R002,若对应的类或接口的所有父亲中存在自己,则该类或接口处于某个圈中
对于规则R003主要分成三个部分:
第一单元——从面向过程到面向对象
第二单元——结合实物设计考虑面向对象
第三单元——规格设计框架
第四单元——模型理解框架
从算法为重到框架为重
认识并且运用规格
为了更好的完成第一种方式的测试,并且为了能够在编写程序过程中对程序进行测试,即针对方法进行独立的测试,就需要使用到单元测试。这一学期面向对象课程中第一次接触到单元测试的是第三单元规格设计。对于每一个方法需要使用具有一定针对性的数据测试方法和基础功能和合法性。但由于程序总体没有完成,因此需要使用单元测试来检验方法的基础功能。在第三单元我是用Junit来对方法的基础功能进行测试。
单元测试仅仅只能够测试方法的基础功能,对于整个程序总体的正确性以及稳定性,需要综合测试来检验。但是综合测试必须要有足量的测试集合才能达到效果。因此为了进行测试,四个单元都设计了全自动的对拍器来进行测试。对于第二单元的对拍器测试主要测试电梯是否能够正确的送客,对于剩下三个单元的对拍器重点主要在于数据的生成。尤其在第三单元数据的结构会影响到测试的全面性。因此对拍器设计过程中数据生成要重点考虑,需要设计多种数据生成模式才能达到完整的测试。
这一学期的面向对象课程,总的来说收获了很多。
首先最重要的一点是学会了Java编程,并且在普通编程的基础上学会了面向对象编程思想,学会了继承,封装,多态的编程模式。
其次在第二单元学会了多线程编程,理解了多线程中处理线程安全性的一些通用做法
认识并理解了规格设计,同时结合面向对象思想,对于面向对象编程有了更深一步的认识
认识并理解了模型设计,了解了UML建模,认识了先建模后编程的思想
此外,还进一步学会了新的测试模式和测试方式。认识并学会了单元测试,清楚的知道如何在没有完全完成程序的情况下对方法的正确性进行测试。此外也额外实践了如何编写具有针对性的对拍器,完成自动化测试。
经过一个学期的面向对象课程学习,觉得课程有以下几点可改进之处:
建议在评测网页新添一个提交数据评测功能,即能够提交自己出的测试数据对自己提交的代码进行评测(防止滥用可以设置前后提交数据等待时间),以便我们能够清楚题目需求
建议能够改进实验课时间安排,最好能错开不要同一天,不然早上刚讲的知识中午还没消化完下午就考试显得有些仓促
手机扫一扫
移动阅读更方便
你可能感兴趣的文章