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

架构设计

笔者认为本次作业很重要的一部分就是UML类图中各个元素的整理与分类。@H_607_7@

笔者将传入的umlElements中的所有元素进行分类,在构造函数中对各个类图进行了初始化。以第三次作业为例,笔者将所有类型的元素分为了四批来处理,第一批处理UmlClass,UmlInterface,UmlInteraction,UmlStateMachine;第二批处理UmlAttribute,UmlOperation,UmlAssociation,UmlGeneralization,UmlInterfaceRealization,Umlmessage,UmlLifeline,UmlRegion;第三批处理UmlParameter,UmlState,UmlPseudostate,UmlFinalState,UmlTransition;第四批处理UmlEvent。之所以要分批处理,是因为umlElements中的元素并不保证顺序,有可能类的属性比类先传进来,为了避免空指针现象,我们需要将更宏观的元素优先处理。当然,这并不是性能最好的方法,如果直接对umlElements中的元素进行顺序处理,先把找不到归属的元素都存起来,留到第一轮之后再处理,循环次数将会减少,性能会变好。@H_607_7@

Uml类图

BUAA_OO_2021_第四单元总结:UML@H_607_7@@H_607_7@

 @H_607_7@

对OO方法理解的演进

第一单元

如今回首第一单元,它仍然是一场噩梦。笔者认为第一单元是OO难度的巅峰,尤其是当时对架构一片空白,脑子里还没建立起面向对象的概念,而且自身编程能力也很拉跨的时候,面临一个需要用递归下降逐层拆解嵌套关系并求导的大工程时,我的生活简直一团乱麻。@H_607_7@

笔者的架构大概是先建立了一个Factor抽象类,然后让Constant,Sin,Cos,Power,Monomial,Polynomial都继承Factor类,在每个类中覆写自己的geTindex()derivation()方法,然后按照求导法则求导。由于多项式和单项式是互相嵌套的,拆解过程还是比较繁琐的,很容易产生bug。@H_607_7@

Uml类图

BUAA_OO_2021_第四单元总结:UML@H_607_7@@H_607_7@

 @H_607_7@

第二单元

多线程电梯调度可以说是OO课程最有特色的一单元。笔者感觉对于本单元,只要开头架构做得好,后面的困难就少。笔者采用的是分布式调度策略,每部电梯都有它自己的等待队列,由总调度器按照一定规则为每部电梯分配乘客。本单元第二次、第三次作业增加的代码量不大,只需适当改变调度策略和换乘策略即可。@H_607_7@

在电梯调度的debug过程中,我们也学会了很多线程安全问题,如死锁、线程饥饿等,这些对于未来的编程都意义深远。@H_607_7@

Uml类图

BUAA_OO_2021_第四单元总结:UML@H_607_7@@H_607_7@

 @H_607_7@

第三单元

JML是难度最小最容易上手的一单元,但也是坑很多的一单元。关键是要根据JML提炼出每个方法的功能是什么,不能对着JML无脑写。这一单元的主题是社交网络,涉及到了一些图论算法,如dijkstra算法求最短路径(用PriorityQueue可以实现该算法的堆优化)、并查集求解连通块个数等。@H_607_7@

堆优化dijkstra算法
    public int dijkstra(Person fromPerson, Person toPerson) {
        Map<Person, Boolean> tag = new HashMap<>(5000);    //是否被访问过,Key是Person
        Map<Person, Integer> dist = new HashMap<>(5000);   //从源点start到各个顶点的最短距离,Key是Person
        Queue<Vertex> pq = new PriorityQueue<>(5000, new Comparator<Vertex>() {
            @Override
            public int compare(Vertex o1, Vertex o2) {
                return o1.getDistance() - o2.getDistance();
            }
        });//优先级队列,最小堆,边权值越小优先级越高

        for (Person person : people.values()) {
            tag.put(person, false);
            dist.put(person, INFINITY);
        }
        pq.add(new Vertex(fromPerson, 0));
        dist.put(fromPerson, 0);

        while (!pq.isEmpty()) {
            Vertex v = pq.poll();
            MyPerson topPerson = (MyPerson) v.getPerson();
            if (tag.get(topPerson)) {
                conTinue;
            }
            tag.put(topPerson, true);

            for (Map.Entry<Person, Integer> entry : topperson.getLinks().entrySet()) {
                int min = dist.get(entry.getKey());
                int temp = dist.get(topPerson) + entry.getValue();
                if (min > temp) {
                    dist.put(entry.getKey(), temp);
                    pq.add(new Vertex(entry.getKey(), temp));
                }
            }
        }
        return dist.get(toPerson);
    }
第四单元

第四单元实现了一个 UML 类图解析器,重点在于建立自己的 MyXXX 类来封装相关的元素,组成模型。有了第三单元 JML 的铺垫,第四单元的 UML 不难上手,但UML第三次作业判断异常的时候情况比较复杂,需要认真体会重复继承、循环继承到底指的是什么,怎样不重不漏地实现这些功能。@H_607_7@

经历了四个单元十二次迭代作业的磨练,我对面向对象的思想也有了更深刻的认识。原本OO于我而言是“雾里看花花非花,水中望月月非月”一般朦胧的存在,但通过不断的钻研与提炼,OO 慢慢地展现出了它的真实样貌,也不再那么令人可望而不可及了。@H_607_7@

对测试的理解与实践

写到这里,笔者不得不很惭愧地承认,这一学期的 OO 之旅最欠缺的就是测试模块。@H_607_7@

第一单元,笔者只是手捏了一些具有复杂形式的表达式,如空格、前导零、连加连减、括号嵌套等。由于第一单元的bug比较容易复现,用一些简单的数据就能复现出一些bug,而解决了这些简单的问题,基本上复杂表达式也就没什么坑点了。对于表达式的化简,笔者也并未做出过多的探索。@H_607_7@

第二单元,多线程调度实在不好手捏数据,于是就把指导书上的样例删删改改,在不同时间投放给系统,简单测试了一下调度和换乘,觉得没有大问题就走人了。@H_607_7@

第三单元是笔者咸鱼觉醒的时刻。笔者决定使用 Junit 更加全面、模块化地测试自己的程序,不遗漏任何一个方法。然还是有很多bug没检查出来,但我最起码了解了 Junit 是怎么用的,应该如何构造数据覆盖率才高。@H_607_7@

然后,通过聆听 dalao 们的分享,我看到了测试一个程序的方法其实有很多,比如搭建评测机、根据不同的侧重点自动生成数据、对拍等等。然这学期没有尝试这些方法,但以后一定会慢慢探索的!!!@H_607_7@

我的收获

首先最明显的收获就是代码能力显著提升了!OO 课程教会了我面向对象的编程思想,教会了我如何设计程序的架构,让我的代码从最开始的大规模重构发展到了只需要迭代、增加功能,让我面对程序时也没有了曾经那种无力感,这让我对日后的专业学习有了积极的心理暗示,让我相信一切都会越来越好的。@H_607_7@

然后就是我通过这门课程学会了 java 语言,以及IDEA 真的太好用了!我感觉 java 现在成为了我最得心应手的语言,当然,学无止境,学习一门语言是快乐的,我很希望日后能掌握更多的语言,逐渐成为高阶码农。@H_607_7@

还有一点点对功能测试的收获,比如说 junit,比如说自动化测试,比如说对拍。@H_607_7@

在此,还要特别感谢为课程付出了心血的老师们和猪脚哥哥姐姐们,以及帮助过我的每一个人!如果没有你们的启发,笔者将会在泥潭里摸爬滚打很久很久,你们对于我具有不可替代的作用!@H_607_7@

一些建议

从自己的体验出发,笔者认为第四单元指导书中对 UML 解析器各个方法的描述可以更清晰一些,像第四单元第三次作业中的异常情况可以多给几个示例,感觉现在的状态有点难懂。@H_607_7@

第一单元指导书的形式化表述有点让人头大,但好像也没有更好的描述方式了。。。@H_607_7@

最后,希望每次实验过后能公布答案,这样课下能思课上没做出来的问题,收获会更多!@H_607_7@

写到这里,笔者本学期的OO之旅算是告一段落了,不管结果怎么样,求知的过程总是令人充盈的。那就祝OO完结撒花啦!我们有缘再会~@H_607_7@

大佬总结

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

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

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