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