大佬教程收集整理的这篇文章主要介绍了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@
@H_607_7@
如今回首第一单元,它仍然是一场噩梦。笔者认为第一单元是OO难度的巅峰,尤其是当时对架构一片空白,脑子里还没建立起面向对象的概念,而且自身编程能力也很拉跨的时候,面临一个需要用递归下降逐层拆解嵌套关系并求导的大工程时,我的生活简直一团乱麻。@H_607_7@
笔者的架构大概是先建立了一个Factor抽象类,然后让Constant,Sin,Cos,Power,Monomial,Polynomial都继承Factor类,在每个类中覆写自己的geTindex()
和derivation()
方法,然后按照求导法则求导。由于多项式和单项式是互相嵌套的,拆解过程还是比较繁琐的,很容易产生bug。@H_607_7@
@H_607_7@
多线程电梯调度可以说是OO课程最有特色的一单元。笔者感觉对于本单元,只要开头架构做得好,后面的困难就少。笔者采用的是分布式调度策略,每部电梯都有它自己的等待队列,由总调度器按照一定规则为每部电梯分配乘客。本单元第二次、第三次作业增加的代码量不大,只需适当改变调度策略和换乘策略即可。@H_607_7@
在电梯调度的debug过程中,我们也学会了很多线程安全问题,如死锁、线程饥饿等,这些对于未来的编程都意义深远。@H_607_7@
@H_607_7@
JML是难度最小最容易上手的一单元,但也是坑很多的一单元。关键是要根据JML提炼出每个方法的功能是什么,不能对着JML无脑写。这一单元的主题是社交网络,涉及到了一些图论算法,如dijkstra算法求最短路径(用PriorityQueue可以实现该算法的堆优化)、并查集求解连通块个数等。@H_607_7@
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,请注明来意。