OO第四单元总结

本文对OO课程第四单元和整个学期进行总结。第四单元围绕UML类图解析,两次作业重点在代码架构设计。学期总结涵盖多项式求导、电梯调度、JML、UML四个单元,阐述架构设计和OO方法理解的演进,还总结课程收获并提出实验课和博客方面的改进建议。

OO第四单元也已经结束了,这意味着OO课程也已经进入了尾声。在这里首先先对本单元的内容进行总结,然后总结一下整个OO课程学习的感想。

第四单元总结

本单元的任务是对UML类图的结构进行解析,从mdj文件中获得的Json格式数据中提取出元素间的层次化结构。在构造好这一结构的基础上完成课程设置的一些查询指令。具体而言,第一次作业只需要保证查询的正确性,而不需要对UML图的正确性进行检验。而第二次作业是在第一次作业的基础上添加了顺序图、状态图,并且还要求根据设定的规则对类图进行规则检查。总体而言,两次作业在算法实现上都没有什么难度,主要的问题在于如何有效的的设计好代码架构。由于每次作业也都留了比较充足的时间,所以本单元的难度系数并不是特别的高。下面对两次作业如何实现进行大致的阐述。

第一次作业

本次作业中,由于课程组已经提供了对mdj文件的解析工具,并且将每个元素都封装在了UmlElement类中,所以我们无需再对mdj进行直接解析。再对UmlElement进行归类时,我设计了针对于不同元素的几个类: MyClass、MyOperation、MyParameter。由于接口和类在表示上比较相近,所以就都用MyClass类来进行表示了(实际上更好的方法还是应该分开进行表示,并且由于之前学术不精,导致忽略了一个很致命的问题,这在之后的错误分析会进行介绍)。
在UmlInteraction类的构造函数中,进行三遍遍历,第一遍是扫描出所有的类和接口,第二遍是扫描出所有类和接口之间的继承和连接关系,并扫描出所有类的方法和属性。最后一次遍历是对方法中的参数进行填充。至此就完成了UML类图中的所有元素的关系构建。之后cache存储所有需要的查询信息。

度量信息截图

1230767-20190624144350746-1786085414.png
1230767-20190624143429469-760550409.png
1230767-20190624143435233-91446278.png
1230767-20190624143457496-1351249806.png
1230767-20190624143505596-1151530902.png

BUG

本次作业并没有满分,惊讶的发现原来java的接口可以多继承。。。竟然学到最后了才知道这个事情。。

第二次作业

第二次作业又新增加了顺序图和状态图,以及延续了第一次作业的类图查询相关的指令。顺序图和状态图的查询策略和第一次作业非常类似,也是cache住了所有的查询结果。除此之外,第二次作业比较不一样的是需要对类图进行正确性检验。需要满足Rule002、Rule008、Rule009三条规则才可以。
对于Rule002,我的方法是在MyClass类中记录所有的Attribute和Association的对端连接名字,并对名字的出现次数进行统计。
Rule008,实际上使用了tarjan算法来检测有向图中是否存在一个环
Rule009,使用DFS算法,并让父类回溯给子类自身的继承关系。

度量信息截图

1230767-20190624143413131-804040388.png
1230767-20190624144403969-111744737.png
1230767-20190624144413188-1829039508.png
1230767-20190624144422707-309342449.png
1230767-20190624144434896-1986218539.png
1230767-20190624144444242-1542286791.png
1230767-20190624144452063-999700378.png

学期总结

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

多项式求导

这一单元是OO课程的第一单元,在这之前甚至从来都没有使用java写过程序,也没有系统的学习过OO的编程思想。所以开始的架构设计过程几乎为零,完全就是面向过程的盲写。在第三次作业的时候,在吸收了一些大佬的宝贵经验之后,对OO的设计模式有了一定的感觉。总的来说,这一单元是从完全不会使用规范的设计模式,到逐渐能理清类之间的层次关系的过程。

电梯调度

这一单元主要是学习多线程的使用。但实际上前两次作业的多线程和单线程的区别并不是很大,主要就是在数据的读取上,因为都是一个电梯。但第三次采用多部电梯之后,多线程的威力才真正的展现出来。在完成作业的过程中,我逐渐掌握了如何使用wait、notifyall等线程指令来防止CPU暴力轮询,以及如何防止死锁。在这一单元中,我更加感受到了OO设计思想的高延展性。

JML

这个单元的内容是通过JML的形式化语言描述来完成各个方法的代码。在测试的时候这个单元的主要困难在于运行时间上有较高的限制,所以并不能使用较高的时间复杂度的算法。但实际上感觉在这个单元的学习,并没有再增加更多的关于OO的设计思想,或许最主要的可能就是封装的思想了吧,但实际上更多的还是聚焦在数据结构上面。

UML

学习了UML语言,可以通过类图、顺序图、状态图来描述任务的求解方法。通过编写java程序分析UML模型,使得我们更好的了解了UML模型中各个元素之间的关联以及模型的有效性。

总结自己的课程收获

总的来说,学完OO这门课的收获还是很多的。最直接的就是学会了java语言的基本应用,以及多线程的编写。还有就是知道了还有像JML这种规格语言用来帮助程序员在编写工程中更加方便严谨的对方法进行描述。还学会了使用Junit对程序进行批量测试。等等
当然,最重要的还是学会了面向对象的编程思想。这让我在以后的编程过程中会先去分析问题的设计思路,和设计构架,而不再是简单的面向过程式编程方式。

课程改进建议

我认为最需要改进的就是实验课。首先是实验课的实验结果一点也没有反馈,完全不知道实验课做的情况怎样。并且实验课的时间安排也并不好,很多时候都是课上的东西都没有消化,实验课就开始了,只能在实验课上边学边做。
其次就是博客的存在意义有待商榷,感觉课程组也不怎么看,同学也都是在应付。

转载于:https://www.cnblogs.com/zhangfuyang/p/11076917.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值