wzy2001wzy

导航

BUAA面向对象2022第四单元总结

BUAA面向对象2022第四单元总结

第四次作业

总览

作业内容

本单元的主要作业内容为实现UML类图/顺序图/状态图的解析,需要提出UML中的一些信息,并判断图的合法性。实际上就是对图的一些操作。共有3次作业,为迭代开发。

第一次作业为类图解析。

第二次作业增加了顺序图/状态图的解析。

第三次作业增加了合法性检验。

完成情况

第一次作业强测挂了一个点,因为hashmap判相等搞错了,后来发现用equal就行。

第二次作业没有错误。

第三次作业强测挂了一个点,因为R002的Class和Attribute弄反了。

实现过程

总体思路

我比较懒,甚至几乎没有对传进来的UMLelement进行进一步的分类,需要什么就整个for一遍就行。

除了MyImplementation以外还有一个Fuck和Checker类,完全是因为500行写不下。Fuck类主要是一些询问exception的判断,Checker是对图的合法性检验。

难点

其实本质上还是对图的操作。有几个比较麻烦的操作。

CLASS_OPERATION_COUPLING_DEGREE:这个主要是判断重复操作,把两个method的Attribute扔到HashMap最后看是不是相同。

CLASS_ATTR_COUPLING_DEGREE:用UmlGeneralization跳父类之后统计就行。

CLASS_DEPTH_OF_INHERITANCE:同上,统计跳了几次。

CLASS_IMPLEMENT_INTERFACE_LIST:bfs就行,遇到的接口扔HashMap里。

STATE_IS_CRITICAL_POINT:两遍bfs,删去节点相当于直接vis标1,所以一个方法就能搞定。

TRANSITION_TRIGGER:遍历UmlTransition类型的边即可。

R002:每个Class有一个HashSet存所有相关的Attribute的名字。

R003:判循环继承,直接每个点bfs一遍就行,能搜到自己的就是不合法。

R004:从每个点开始bfs,能访问任意一个点超过一次就是不合法。

R009:两重循环遍历event,如果名字,src都相同且guard相同或为空就不合法。

总结与反思

HashMap判相等直接用equals就行。

这个单元让我们对UML有更深刻的理解,虽然题目细节过多有点烦。

课程总结

总结自己在四个单元中架构设计思维及OO方法理解的演进

在第一单元,我初步体会到了架构设计的重要性。第一次任务刚发下来的时候,我对于如何解析表达式还是感觉很困难,觉得细节太多难以实现。直到我看到了训练中提到的递归下降法,这是一种可扩展性很好的算法,在我理解之后我也就顺利的完成了三次作业。回想当时如果我用一大堆if,那我几乎不可能完成作业。

在第二单元,我几乎通过独立思考实现了整个多线程的架构。多线程和单线程最大的不同就是线程安全问题,在我了解了生产者消费者算法之后,我发现这很适合单元的作业。在二三次作业中加入了电梯的换乘等问题,我从中意识到了调度器的重要性。因为一个电梯并不能看到其他电梯的情况,那么就需要一个调度器去管理所有的电梯。换乘的时候只需要把中转层的乘客扔回调度器的分配队列中就行,实现起来非常方便,且不容易出现bug。

在第三单元,我学习了JML规格,虽然作业任务很简单,但是我对代码及架构的严谨性有了更深的理解。

在第四单元,我学习了UML图,这是对整个代码的一个更加抽象的概括。

总结自己在四个单元中测试理解与实践的演进

刚开始,我只能手造一些样例进行测试,但是这样效率很低。

后来我选择跟同学的程序进行对拍,但是它很依赖于数据生成器。

这两种方法各有利弊,应该综合使用。

总结自己的课程收获

1.学会了java语言。

2.学到了递归下降/多线程/JML/UML相关知识。

3.学到了面向对象的思想。

4.增强了架构设计的能力,写的代码可维护性增加。

5.代码能力提升了,代码风格也变好了。

立足于自己的体会给课程提三个具体的改进建议

1.强测真的太弱了,如果构造数据很难的话,可以考虑把hack成功的部分数据追加进强测。

2.研讨课比较鸡肋,大家的发言都大同小异,可以增加一些更加开放性的问题,例如给出一个需求让大家说说思路。

3.如果能做到的话,可以考虑换一下作业的内容,这几年的作业还是过于相似了(尤其是1/4单元)。

 

posted on 2022-06-28 10:22  我没有名称  阅读(17)  评论(0编辑  收藏  举报