程序笔记   发布时间:2022-07-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了OO 第四单元总结大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

OO 第四单元总结

一、总结本单元的架构设计

本单元我的程序的构建思想是先将输入的所有element建立HashMap,HashSet保存,根据需求进行适当的提前处理,然后根据不同指令的需求查询HashMap并输出。

OO 第四单元总结

以下是我的MyUmlClassModelInteraction类的成员变量:

    private HashMap<ElementType,HashMap<String,UmlElement>> list = new HashMap<>();
    private HashMap<String,String> classList = new HashMap<>();
    private HashMap<String, HashSet<String>> interfaceList = new HashMap<>();
    private HashMap<String,HashMap<String,String>> parentTree = new HashMap<>();
    private HashMap<String,HashSet<String>> interfaCETree = new HashMap<>();
    private HashMap<String,HashSet<UmlElement>> attributeList = new HashMap<>();
    private HashMap<String,HashSet<UmlElement>> endList = new HashMap<>();
    private checker checker;

list:根据ElementType分别存储了类图中所有的element。

classList:存放类的直接继承关系。

interfaceList:存放接口的直接继承关系。

parentTree:存放类的所有直接或间接父类。

interfaCETree:存放接口的所有直接或间接父接口。

attributeList:存放类包含的元素。

endList:存放类或接口的关联对端。

checker:执行部分合法性检查。

以下是MyUmlStateCharTinteraction的成员变量:

private HashMap<ElementType, HashMap<String, UmlElement>> list = new HashMap<>();
private HashMap<String,HashSet<String>> nextList = new HashMap<>();
private HashMap<String,HashSet<String>> treeList = new HashMap<>();
private UmlFinalState finalState;
private UmlPseudostate pseudoState;

list:根据ElementType分别存储了状态图中所有的element。

nextList:存放状态的前后继关系。

treeList:存放状态的所有后继状态。

finalState:存放唯一的UmlFinalState。

pseudostate:存放唯一的UmlPseudoState。

以下是MyUmlCollaborationInteraction的成员变量:

private HashMap<ElementType,HashMap<String, UmlElement>> list = new HashMap<>();
private HashMap<String,HashMap<String,UmlElement>> lifelineList = new HashMap<>();
private HashMap<String,Integer> numList = new HashMap<>();
private HashMap<String,UmlElement> attribute = new HashMap<>();

list:根据ElementType分别存储了时序图中所有的element。

lifelineList:存放interaction对应的lifeline。

numList:存放lifeline对应的incomingmessageCount。

attribute:存放attribute的id和对应的element。

以下是MyUmlGeneralInteraction的成员变量:

    private MyUmlStateCharTinteraction state;
    private MyUmlCollaborationInteraction collabortion;
    private MyUmlClassModelInteraction classModel;
    private MyUmlStandardPrecheck check;

state:用于调用状态图对应的接口。

collabortion:同于调用时序图对应的接口。

classModel:用于调用类图对应的接口。

check:进行合法性检查。

以下是MyUmlStandardPrecheck的成员变量:

    private MyUmlStateCharTinteraction state;
    private MyUmlCollaborationInteraction collabortion;
    private MyUmlClassModelInteraction classModel;

state:用于调用状态图中检查合法性的接口。

collabortion:同于调用时序图中检查合法性的接口。

classModel:用于调用类图中检查合法性的接口。

第一次作业中查找接口的所有父接口的部分代码实现:

public HashSet<String> searchParenTinterface(String id) {
    if (interfaCETree.containsKey(id)) {
        return interfaCETree.get(id);
    }
    if (!interfaceList.containsKey(id)) {
        return null;
    }
    HashSet<String> parent = interfaceList.get(id);
    HashSet<String> ans = new HashSet<>(parent);
    for (String parentId : parent) {
        if (interfaceList.containsKey(parentId)) {
            ans.addAll(searchParenTinterface(parentId));
        }
    }
    interfaCETree.put(id,ans);
    return ans;
}

第三次作业中关于R002检查是否有循环继承时的部分代码实现:

public void searchLoop(String id) {
    if (!interfaceList.containsKey(id)) {
        return;
    }
    loop.add(list.get(ElementType.UML_INTERFACE).get(id).getId());
    loops.add(list.get(ElementType.UML_INTERFACE).get(id).getId());
    for (String nextId : interfaceList.get(id)) {
        UmlInterface element = (UmlInterfacE) list.get(ElementType.UML_INTERFACE).get(nextId);
        if (loops.contains(element.getId())) {
            for (int i = loop.size() - 1; i >= 0; i--) {
                invalidU002.add(element.getId());
                if (loop.get(i).equals(element.getId())) {
                    break;
                }
            }
        } else {
            searchLoop(element.getId());
        }
    }
    loops.remove(loop.get(loop.size() - 1));
    loop.remove(loop.size() - 1);
}

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

第一单元

第一单元是表达式求导,从最开始只有简单的幂函数加减到后面加入表达式因子,嵌套因子的三角函数,难度逐渐增大。

当时我的架构设计还是十分面向过程的。从表达式到项再到因子的一个层次关系也很混乱。然分出了不同的类但是感觉只是把方法分开,建立了几个类。然最后也完成了要求的任务,但是代码十分的丑陋和难以理解。

除此之外第一次作业时也不懂为后续的作业留下迭代的空间,导致第二次作业基本等同于重新写了一遍。

第二单元

第二单元是关于多线程同步的电梯问题,现在想来还是挺有意思的。

在第一次作业的时候我还不能运用synchronized块,不太理解哪些部分需要锁,哪些不用锁,只好学着上机实验时的代码不断尝试,最后就很简单粗暴的把整个运行部分都锁了起来。不过因为是单部电梯所以没什么影响。后来我才弄懂了什么时候需要锁什么时候不用锁,也开始思如何利用wait和notifyAll让多部电梯能够同时运行。

从这一单元开始我渐渐能够掌握面向对象的设计思想了,也能够建立多个对象类(如Elevator类,Floor类,WaitQueue类等),各司其职了。但是在完成代码时,依然会出现一个方法中进行了多部操作,最后方法的复杂度过高的问题,没有让方法的功能更加专一化。

第三单元

第三单元是根据给出的JML语言实现程序架构。

本单元的难度并不高,只要严格按照JML语言进行“翻译”就不会WA。(然而会TLE,而优化之后就有可能WA了)这一部分主要的难点在于复杂度的控制。程序中总有那么几个指令需要对图进行遍历。而如果只是“翻译”JML语言中的描述,就会导致RTLE,CTLE的问题。所以我们要根据自己的理解,选用恰当的方法降低程序的复杂度。

这一单元主要教会我的是对于复杂,大量的数据,可以建立相应的HashMap,HashSet将可能需要用到的数据储存起来,并在需要的时候直接调用,可以有效地降低程序的复杂度。

第四单元

第四单元是实现查询UML类图、时序图、状态图的指令接口,和合法性检查。

本单元的难度依旧不高,只需将element用HashMap存好,查询时调用既可。主要难度依然在于几处需要递归查找的地方。另外还有可能出现某些特殊输入没有虑到导致合法性检查出现问题。

三、四个单元的测试理解与实践推进

到了一学期的结尾,我依然没有学会怎么写测评机TT,所以这四单元的测试基本都是靠的手动构造数据或者试试dalao们提供的样例。

手动构造数据主要是针对一些在临界点的数据,具有特殊性的数据。(主要在一二单元)第四单元中可以用StarUML绘制一些类图等进行测试。对于程序复杂度的问题,我基本都是靠直接检查程序代码,思有无可能出现死循环,有无可能进行优化...

四、总结自己的课程收获

这学期下来感觉在OO课程中收获颇丰。

1、逐步掌握了面向对象的编程思想。

2、学会了如何实现多线程同步。

3、学会了处理复杂需求时,将需求逐步分解,转化为多个简单需求的方法。

4、学会阅读理解JML、UML语言。

5、学会使用并查集、迪杰斯特拉算法等方法降低程序复杂度。

6、对于java语言的运用更加熟练了。

五、课程改进建议

1、希望能加强第三单元JML语言部分的弱测、中测测试点。(因为这一单元我两次出现中测全过,强测大面积WA,甚至还有很基础的问题。然是我自己后续没好好测试的锅,但还是希望弱测和中测至少把基本的东西测一测吧)

2、希望实验课能够在课后公布结果和正确答案,不然我觉得这个实验课就挺没有意义的,我做完也不知道自己有没有做对。

3、如果能够能专门提供一个教程指导同学们如何自己写测评机就好了,否则对于一部分不会写评测机的同学(比如我)而言,平时debug很痛苦,互测环节只能躺平……

大佬总结

以上是大佬教程为你收集整理的OO 第四单元总结全部内容,希望文章能够帮你解决OO 第四单元总结所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。