BUAA_OO_第四单元总结_UML暨课程总结

BUAA_OO_第四单元总结_UML暨课程总结

一、第四单元作业架构设计

1、第一次作业

本单元要求实现UML类图查询,因此考虑分为两个部分:进行类图解析建立数据结构,再基于该数据结构填写操作方法。

第一次作业在类图解析的时候采用了逐层解析从上到下的方法进行类图架构的建立,大致分为三个层次:

  • 第一层:UmlClass 、UmlInterface
  • 第二层:UmlAttribute 、UmlOperation 、UmlGeneralization 、UmlInterfaceRealization 、UmlAssociation
  • 第三层:UmlParameter(UmlAssociationEnd 在本次作业中没有用到)

在初始化类图时,新建MyClass类、MyInteraction类和MyOperation类,将其他的类图元素根据所属关系作为属性保存在这三个类中,建立图的邻接表:

##  MyInterface:
	private UmlInterface umlInterface;
    private HashMap<String, MyInterface> parents;
    private HashMap<String, MyOperation> operations;
    private HashMap<String, HashSet<MyOperation>> nameToOperations;
##  MyClass:
	private UmlClass umlClass;
    private MyClass parent;
    private HashMap<String, MyOperation> operations;
    private HashMap<String, UmlAttribute> attributes;
    private HashMap<String, MyInterface> interfaces;
    private HashMap<String, UmlElement> associations;
    private HashMap<String, HashSet<UmlAttribute>> nameToattributes;
    private HashMap<String, HashSet<MyOperation>> nameToOperations;
##  MyOperation:
    private UmlOperation umlOperation;
    private ArrayList<UmlParameter> parameters;

存储使用了HashMap<String, Element>存储从ID到元素的映射关系,便于根据parentId和Id进行查找,并且由于查询方法大多使用名字进行查询,并且可能一个名字对应多个元素,因此再添加数据结构HashMap<String, HashSet<>>进行存储,实现从名字到元素的一对多映射关系。

然后新建MyUmlInteraction类,在该类中同样使用上述数据结构存储新建类的映射关系,并在该类中实现查询方法,而方法中的函数调用多使用到新实现的类新建立的关系。

2、第二次作业

第二次作业架构基本与第一次作业基本类似,增加了三个层次中解析的元素个数,补充如下:

状态图

  • 第一层:UmlStateMachine、UmlRegion
  • 第二层:UmlState、UmlPseudoState、UmlFinalState
  • 第三层:UmlTransition、UmlEvent、UmlOpaqueBehavior

顺序图

  • 第一层:UmlInteraction
  • 第二层:UmlLifeline
  • 第三层:UmlMessage、UmlEndpoint

存储方式方面:

顺序图通过新建MyInteraction类,MyLifeline类进行存储,类中属性如下:

##  MyInteraction:
    private UmlInteraction umlInteraction;
    private HashMap<String, MyLifeline> lifelines;
    private HashMap<String, HashSet<MyLifeline>> nameTolifelines;
    private HashMap<String, UmlEndpoint> endpoints;
##  MyLifeline:
    private UmlLifeline umlLifeline;
    private ArrayList<UmlMessage> incomingMessages;
    private ArrayList<UmlMessage> outMessages;

状态图按层次进行存储,第一层新建MyStatemachine类进行存储,类中属性如下:

##  MyStateMachine:
    private UmlStateMachine stateMachine;
    private MyRegion region;

第二层新建MyRegion类存储,类中属性:

##  MyRegion:
    private UmlRegion region;
    private MyState startstate;
    private MyState finalstate;
    private HashMap<String, UmlTransition> transitions;
    private HashMap<String, MyState> states;
    private HashMap<String, HashSet<MyState>> nameTostates;

第三层新建MyState类存储,该层稍有不同,因为官方包中,顺序图中的UmlPseudoState、UmlFinalState没有继承UMLState类,但是要将这两个状态统一用MyState类进行存储,从而有助于查询操作进行,因此将每个State里面的有效属性从官方包中的Umlxxx中拆出来,存储在新建的类中,在构造方法将属性拷贝过来,从而实现了UmlState、UmlPseudoState、UmlFinalState的统一:

##  MyState:
    private String id;
    private ElementType type;
    private String parent;
    private String name;
    private HashMap<String, MyState> nextStates = new HashMap<>();
    private HashMap<String, MyState> transitionTostate = new HashMap<>();

3、第三次作业

第三次作业的重点在于UML检查,架构基本与前一次作业一致,只需要添加检查方法即可,不再赘述。

二、四个单元中架构设计及OO方法理解的演进

第一单元

第一单元架构设计能够很好地体现对OO方法的理解变化,比如在第一次作业几乎没有面向对象的设计,几乎就是拿来一个表达式,只是从表达式角度进行整体考虑如何进行求导,完全面向过程;但是这种架构设计在面对第二次作业增加的需求完全无法处理,因此重新考虑OO方法进行架构设计,将表达式从上到下进行拆分,提取出表达式类,项类,各种因子等对象类,在每个对应类中定义属于具体对象的求导方法,然后,根据各个类之间的关系,建立对应的函数调用关系,这样每一个类只需要处理自己的需求,然后将处理好的东西抛给另一个对象继续处理,从而实现了面向对象的架构设计。因此这一单元也是作为初学者的我最艰难度过的一个单元,但也是OO思想的一个转折单元,彻底破除了过去的一个main到底的程序架构设计思想。

第二单元

第二单元考察的主要是多线程的理解和应用,这一单元作业从面向对象的角度来说收获的关于OO方法的理解是如何在多线程的场景下,进行面向对象的架构设计,使得对象间的交互更加高效安全,是一种对于整体的把控,如何协调好各个对象的交互。本单元的架构设计参考了上机实验的架构设计设计一个总的调度器,根据调度算法和各个单独电梯的等待队列将人依次分配给每一个电梯;给每一个电梯分配对应的分调度器,用来根据look或其他的调度算法实现这一个单电梯的调度。;

第三单元

第三单元对于面向对象思想的方法倒考察的不是很多,主要是让我学习到了在工程中的具体规格等的作用。架构设计不需要过多考虑只需要根据指导书的规格进行实现即可,更多是加深对于规格的理解。

第四单元

第四单元更像是对前面的面向对象的一个检测,看看一学期下来对于面向对象掌握如何。第四单元的架构设计已经在上文叙述详尽,在此不再赘述。

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

四个单元的测试理解的演进:

  • 起初第一次作业测试,基本只是手造样例,根据指导书要求随机进行根据心情的测试
  • 随着要求的增多,随机手动构造样例已经不能满足测试功能,于是学习搭建自动测试机进行对拍:
    • 设计自动生成数据部分
    • 设计对拍器部分,与其他的jar包进行对拍
    • 但对于一些特殊数据仍需要设计对拍器生成数据的模式,比如一些爆栈数据(第一单元括号识别拆解有关的一些数据),递归遍历较耗时的部分(第三单元使用的dfs或bfs可能导致超时等)都需要特殊构造
  • 第三单元的Junit测试,进行了学习但是测试效率较对拍相对低,因此最终以失败告终。

四、课程收获

  • java语言的学习
    • 开学的第一周以及Pre部分都在自学Java,并且随着四个单元的练习实践,增强了对Java的熟练度、一些内部机制(比如虚拟机等)、以及一些容器(HashMap真好用)的理解。
  • 代码能力的提高
    • 经过了四个单元的作业和上机训练,大概进行了上万行代码的阅读和编写,程序能力得到了大幅的提高
  • OO思想的建立
    • 这也是这门课的设计初衷,也是本学期最大的收获,初步掌握了面向对象的架构设计思想,埋下了一颗架构设计思想的种子,相比于以往拿到题目直接进行写代码,现在能基本先进行设计架构,然后将要实现的函数及其功能框架列出来,再逐步添加内容。
  • 测试方面的收获
    • 体验到了对拍器的基本实现及原理,测试也是一门学问。
  • 其他
    • git的使用
    • idea的熟悉使用
    • jar包理解

五、课程改进建议

  • 希望能有上机实验的反馈,因为课后没有答案做完也不知道具体哪里有问题。
  • 对于java入门到学习OO过度希望能增加一些环节,因为java零基础做完Pre直接做第一单元还是有一定难度,不仅仅需要要消耗精力再学习架构设计思想上面,还要不断查java的语法,容器使用等,是不是可以假期除了给git的学习资料外,再增加有关java学习的资源和建议内容。
  • 感觉第四单元的一些题面的描述实在过于笼统,理解起来很容易造成歧义,建议可以改进一下

OO未完待续.........

posted @ 2021-06-26 15:29  做个废柴呐  阅读(46)  评论(0编辑  收藏  举报