OO第四单元总结&&课程感想

OO第四单元总结&&课程感想

​ OO四个单元已经结束,感觉自己的编程能力长进了很多,对面向对象思想的理解也深刻了很多。第四单元目标是实现一个UML分析器,包括分析UML类图,UML时序图,UML状态图。整体代码量很大,大部算法采用BFS实现。

UML分析器架构

第一次作业

​ 第一次作业主要实现类图分析器,我自己实现了MyParseElement类,这是一个抽象类,里面实例化一个UmlElement。

public abstract class MyParseUmlElement {
    private UmlElement umlElement;

    public MyParseUmlElement(UmlElement umlElement) {
        this.umlElement = umlElement;
    }

    public UmlElement getUmlElement() {
        return umlElement;
    }

    public String getId() {
        return umlElement.getId();
    }

    public String getParentId() {
        return umlElement.getParentId();
    }

    public String getName() {
        return umlElement.getName();
    }

    public ElementType getElementType() {
        return umlElement.getElementType();
    }
}

将对应的models包里面所有的element解析一遍,所有其他的element继承这个抽象类。在实现的过程中,要注意ID之间的关系,比如

UmlAttribute的ParentId有可能是UmlInterface或者UmlClass。那么在MyParseUmlInterface中和MyParseUmlClass中要实例一个MyParseUmlAttribute容器。并在建图的时候加入进去。

对于顶层MyUml类,我们进行“建图”,即遍历所有的UmlElement[ ],创建相应的MyParseElement的子类(多态)。并将各自存储在对应的ParentID对应的MyParseElement里面。

UML类图

第二次作业

第二次作业的架构跟第一次作业思路类似,也是通过继承UmlElement抽象类来实现。

UML类图

  • 顺序图解析器

  • 状态图解析器

第三次作业

跟前面作业架构类似。主要增加了一些异常判断的方法。

BFS

主要采用队列来实现,将初始对象加入到队列当中,再用一个HashSet存储已经遍历过的节点的ID。每次遍历从队列里面poll出要遍历的节点。如getClassAssociatedClassList()方法的实现。

public List<String> getClassAssociatedClassList() {
        ArrayList<String> result = new ArrayList<>();
        HashSet<String> visited = new HashSet<>();
        Queue<MyParseUmlClass> queue = new LinkedList<>();
        queue.add(this);
        while (!queue.isEmpty()) {
            MyParseUmlClass myParseUmlClass = queue.poll();
            for (MyParseUmlElement item : myParseUmlClass.getAssociations()) {
                if (!visited.contains(item.getId()) &&
                        item.getElementType() == ElementType.UML_CLASS) {
                    visited.add(item.getId());
                    result.add(item.getName());
                }
            }
            if (myParseUmlClass.getFather() != null) {
                queue.add(myParseUmlClass.getFather());
            }
        }
        return result;
    }

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

第一单元

​ 第一单元的多项式求导,我刚刚接触Java,对OO的理解比较浅薄,关注的比较多的是算法。我第一次运用多态实现了一个二叉树。

对于接口,性能考虑得比较少。所以重构了两次。第一单元的作业我觉得还是应该多加尝试尝试各种实现方法,接口,抽象类啥的。

第二单元

​ 第二单元主要是多线程,对于Java语法要求不高。但对于设计模式有很强的要求。整体采用生产者消费者模式。这单元要把电梯运行抽象成为实际的问题。

第三单元

​ 第三单元主要是照着JML规格写代码,要注重数据结构的使用,这一单元的重点是性能,要懂得用空间去优化时间。

第四单元

​ 第四单元的架构主要是多态,要充分运用多态。这单元代码庞大,类很多,要学会使用Package。到了第四单元,面向对象的基本思想我已经掌握的差不多了,对于接口,抽象类的使用也比较熟练了。

测试

数据分为随即构造和手动构造。

手动构造的数据前几次作业还行,后面根本不可能了。对于随机制造,我没有掌握数据的构造方法。(希望以后有精力的话好好研究研究)

测试的正确性判定:对拍(与python第三方库对拍,与别人代码对拍),状态机(电梯)

测试工具:Junit,Jprofile,手动构造评测机。

测试是一个很重要的东西,基本的通过Python调用Jar包我还是会的,但是对于构造有强度且合法的数据,我觉得有点难度,有时间我一定好好摸索摸索。

课程感想

​ 这门课可以说是非常的practical,学到了很多的东西,包括Java基本的语法,设计模式,Git,以及Typora。我发现OO其实是一个哲学思想,其实很多事情我们都可以看成是对象和对象的交互。比如我这学期拼了一个拼图,它其实可以分成山,水,山人等对象,把小的拼图块分类之后会好拼许多。这门课不仅提高了我的代码能力,更给我了一个全新的视角看待世界。

建议

1.感觉课堂老师讲的跟作业有点脱节,希望老师每节课能先讲一下作业的架构。

2.感觉实验课可以改进一下,变成闯关制度,增添课上评测功能

3.希望UML单元的指导书写的详细一点,第四单元编程难度不大,但是指导书有时候迷惑性真的很大。

posted @ 2021-06-25 19:57  幽默的Sawyer  阅读(53)  评论(0编辑  收藏  举报