其他分享
首页 > 其他分享> > OO unit4 summary

OO unit4 summary

作者:互联网

Unit4

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

第四单元个人认为主要是考察对于层次结构的理解,即如何理解并处理好UML图的树状结构组织,在理好层次之间以及层次内部的相互关系之后,就只剩下代码实现的问题了。但是不得不说,刚开始接触UML特别是对starUML不熟悉的时候,如果指导书说的不是太清楚,真的很难动手实现,比如说在第一次作业的时候,我就完全理解错了,导致难度飞升,一度怀疑老师所说的“简单”。虽然说相比JML是真的不太简单

由于主要架构课程组都已经做好了,所以我们基本不用构思什么架构,只需要做好层次化的组织就行了

第13次作业

这次作业只要求实现类图相关的存储与查询。

在数据的存储方面,考虑到不同层次的元素之间是有很强的关系的,常常需要进行特定的操作,比如对于class这个元素,查询指令中有查询与class相关联的需求以及查询他所实现的接口的需求,很自然的想到被关联的class实例和被实现的interface实例最好作为属性放进此class实例中,当然还需要提供一系列的查询操作。

因为查询操作众多,显然需要使用hashmap进行存储,刚好hashmap是一对一的查询使用起来非常舒服,这里如果出现有多个键相同但是值不同的话,说明存在异常(同名),再建一个name2Validhashmap,对每次查询时输入的键进行检查是否有效就好了,速度也非常快。

但是课程组提供的接口给出的是课程组写的类对应的实例,此时如果采用继承来做就不太好实例化自己写的类,因此我干脆把课程组给的实例封进了自己写的类中,虽然结构上有亿点丑陋,有一点不OO,但是因为到了烤漆,也就将就着用了,最终形成以下结构:(其他的元素也大都如此,把课程组给的实例封进自己写的类中,然后就能很方便地使用

public class MyClass {
    private UmlClass umlClass;
    
    private MyClass father = null;
    private MyClass topFather = null;
    private boolean updatedTopFather = false;
 	...
    private HashSet<MyInterface> interfaces = new HashSet<>();
    private String name;
    private ArrayList<MyClass> associations = new ArrayList<>();
    
    public MyClass(UmlClass umlClass) {
        this.umlClass = umlClass;
        name = umlClass.getName();
    }
    ...
    public void setTopFather(MyClass topFather) {
        this.topFather = topFather;
    }
    
    public MyClass getTopFather() {
        return topFather;
    }
    
    public void setUpdatedTopFather(boolean updatedTopFather) {
        this.updatedTopFather = updatedTopFather;
    }
    
    public boolean hasUpdatedTopFather() {
        return updatedTopFather;
    }
    ...
    
    public void addOperation(MyOperation operation) {
        operations.add(operation);
    }
    
    public HashSet<MyInterface> getInterfaces() {
        return interfaces;
    }
    ...
}

此外,由于第一次作业CPU使用时间限制为2s,其中有几个非常耗时的查询操作,查实现的接口,(这里还需要查接口的继承情况),查关联的类等。

考虑到实现的难度,我选择用递归来解决问题,同时采用记忆化加速。即将相关的操作提供一个flag,如果flag有效则直接返回对应的查询元素,若无效,则进行对应的递归查找,并更新相应的信息的存储。

异常处理方面,要特别注意异常抛出的顺序,大体按照从顶层向底层的顺序抛异常就好了。

最后,考虑到输入元素的顺序可能不确定,因此我选择把所有输入的元素先分类存储,然后按照合理的顺序一个一个地存进相应的类中,为了方便管理,我写了一个MyinfoLoader的类来专门处理读入信息的问题。

第14次作业

第二次作业相比第一次多了时序图和状态图的处理,处理过程完全一样,有了第一次的经验,这次作业做起来显得比较简单。同时CPU使用时间放宽到10s,再加上多的两个UML图的查询基本上没有什么耗时的查询操作,完全不需要什么算法,直接用暴力做法硬莽就是了。

由于新增了两种UML图,我新增加了两个模块进行管理:

第15次作业

这次作业需要增加Rule的check操作,一共八条,可能是因为在烤漆,整体实现难度不太高

Rule3Rule4要求接口不能重复继承接口,类不能重复继承类,类不能重复实现接口。

由于在我的架构中,MyinfoLoader在读取信息的时候需要将实现的类或者继承的类(接口)存进属性,只需要对于第一次作业信息读取存储的部分加一个判断,并提供一个flag,如果存储信息的过程中出现了不合法的行为,那就直接把对应的flag置为有效,检查的时候查对应的flag就行了

比如在Rule4的检查中:

如果没有update并且父类不为空,这时候更新他的继承的接口首先需要递归地更新他父类的接口,然后检查一下父类是否合法(如果父类标志位有效,子类置标志位)

再对父类实现的接口做一遍更新,同时如果接口标志位有效(不合法)那子类肯定不合法,置标志位。

最后把所有的接口合在一起去重,看是否有重复的,如果有表明需要置标志位,无效。

check模块中只需要对每个类更新一下,然后查一下标志位就好了:

public void checkForUml003() throws UmlRule003Exception {
        HashMap<String,MyInterface> id2Interface = myUmlClassModelInteraction.getId2Interface();
        Iterator iterator = id2Interface.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String,MyInterface> entry = (Map.Entry)iterator.next();
            MyInterface myInterface = entry.getValue();
            myUmlClassModelInteraction.updateFatherInterface(myInterface);
        }
        iterator = id2Interface.entrySet().iterator();
        HashSet<UmlInterface> ans = new HashSet<>();
        while (iterator.hasNext()) {
            Map.Entry<String,MyInterface> entry = (Map.Entry)iterator.next();
            MyInterface myInterface = entry.getValue();
            if (myInterface.getDup() == true) {
                ans.add(myInterface.getUmlInterface());
            }
        }
        if (!ans.isEmpty()) {
            throw new UmlRule003Exception(ans);
        }
    }

Rule2 有里面关于类和接口是否成环的问题,因为CPU时间十分充裕,直接用暴力做法就好,需要注意的是,对于已经遍历过的点需要打上标记,否则将导致TLE

关于类的成环问题,由于只存在单继承,最简单的做法就是一直查父类,看是否能回到开始的类,如果能,说明类的继承会成环

需要注意的是,当所查的类在一个环之外的时候,会出现死循环,所以还得记录查找路径,当再次出现记录的路径里的类的时候应该结束查找。

接口成环我采用了bfs如果会回到最初的接口表示成环,注意为查过的点打上flag

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

三、四个单元中测试理解

四、课程收获

一学期的OO课终于结束啦!总结了一下,大概有一下收获:

五、具体改进建议

标签:OO,iterator,作业,接口,summary,查询,public,单元,unit4
来源: https://www.cnblogs.com/ito-/p/OO_unit4_Summary.html