BUAA_OO 第四单元UML作业总结
一、 第四单元架构设计
这三次作业是关于面向对象UML方面的练习。这三次作业主要是关于一个UML解析器的构建,作业主要任务就是将由UML导出的信息来进行解析并完成对应的一些查询操作。以下是针对三次UML作业架构设计的一些总结。
1.UML架构分析:
UML是一个面向对象设计的建模工具,可以从starUML看出其树状架构。
类图:
从树状结构可以看出类图最顶层的就是类Class和接口Interface。下一层则有属性Attribute、方法Operation、继承Generalization和关联Association。而最后一层则是方法参数Parameter和关联对端AssociationEnd。
状态图:
而状态图的最顶层是画布Region。下一层则是起始状态pseudostate、中间状态State和结束状态FinalState。再下一层则是状态迁移Transition。而最后一层则是迁移的事件Event和结果OpaqueBehavior。
顺序图:
而顺序图则是参与对象Lifeline和终结点endpoint在顶层,而下一层则是交互消息message。
2.作业架构分析
第一次作业是只有类图的相关部分,所以我就新建了一个MyUmlClass类来储存类,一个MyUmlInterface类来储存接口,以及一个MyUmlOperation类来储存方法。其中较为关键的类就是MyUmlClass类,在这个类中,储存了类名、id、其下的方法集合、关联集合、父类和实现的接口等属性。而其下也设计了一系列的查询方法来对其相关信息的查询。下图是我第一次作业的类图。
而在第二次作业中增加了对顺序图和状态图的相应的查询。沿用第一次作业的思路,我在第一次作业的基础上进行了迭代,保留了第一次作业的相关部分后我新增了MyUmlInteraction类和MyUmlStateMachine类来分别储存顺序图和状态图。另外新建了一个MyUmlState类来储存状态图中的状态。下面是我第二次作业的类图。
二、架构设计与OO方法
1.第一单元
个人认为第一单元是写起来最为费劲的一个单元。这个单元是第一次进行oo的单元设计,虽然有pre的一些铺垫,但是我在进行第一次作业时还是不能做到彻底的面向对象,而是选择用一些面向过程的方法。这就导致在后续进行的第二三次作业迭代上很是困难。不过正是这个单元让我明白了面向对象的优势所在。在选取了一个合适的对象之后对其进行分析,通过一个面向对象的方式来完成一个对复杂多项式求导的过程。当然,这个单元所用到的正则表达式也是有一定难度的,这里涉及到的许多细节都会影响到bug的检测和修复。
2.第二单元
第二个单元是多线程的一个电梯调度模型。首先这个单元要熟悉一些多线程的知识,在这个单元我采用的都是消费者生产者模式来处理这个问题。基于这个考量我就设计了一个调度器类Scheduler以及电梯线程Elevator和输入线程Input这两个线程。在理解了多线程的相关模型之后这个电梯调度问题就只剩算法的问题了。在这个单元的作业之中我采用的都是look算法来处理这些电梯的问题。在后续的多个电梯问题上采用多个电梯线程,而不同电梯的调度则采用最为简单的均分策略。
3.第三单元
第三单元是关于JML的。JML是用来对代码规格进行描述的,在实验课有根据代码写过JML,而这个单元的三次作业则是针对JML来补充代码。其实只要能够读懂JML代码,这个单元的作业就只剩下对于算法的考量和取舍了。因为大体的作业架构课程组已经提供好了,所以架构设计上也没有什么好说的。这次作业主要还是要了解图相关的一些算法,合理地利用缓存机制来避免一些没有必要且复杂度较高的循环。
4.第四单元
第四单元是关于UML的。这个单元的作业都是构建一个UML解析器。在熟悉UML的过程之中可以通过starUML来了解UML类图、顺序图和状态图的一些层次结构,这样在处理这个解析器时就能根据这个结构来建立对应的类来保存各个信息。在第三次作业之中加入了一些模型有效性的检查,这些检查可以在主类中在完成这个类图的构建时就进行检查,也可以在整个图构建完成之后再来循环遍历来处理这个问题。
三、测试与实践
不同于其他我们之前所学的计算机语言课程,oo这门课有一个代码互测的环节。在原来的学习过程之中,我基本上很少来看同学的代码,来寻找这些代码之中的bug。通过这个学习的oo学习,我明白了如何来对代码进行测试。除了以前通过对一些边界条件来手搓一个测试数据,我还学会了用Junit来对代码的各个部分进行单元测试,对其进行正确性判断。而在其他同学的帮助之下我还使用了一些python脚本来对自己的代码进行一些输出对比等测试,这在一定程度上也减少了bug的出现。
四、课程收获
总的来说,这学期的oo课程我还是收获挺多的。首先时对于Java这门语言,我对其有了较为深入的了解。对于其面向对象的思维,让我在之前一直使用面向过程编程后有了耳目一新的感觉。其中的层次化设计、工厂模式、生产者消费者模式、JML、UML等许多新的知识也让我收获很多。而oo课程这个设计也让我学到了很多,一个个单元作业之间的可迭代性让我在每次写一次作业时往往会考虑之后的作业可能还要实现哪些功能,这样在作业的架构设计上就会考虑到其能否在后续的作业进行迭代,这样能够有效的避免一些完全没有必要的重构。在最后我还想提一下对于bug测试与风格检查上的收获。在bug测试中,我学会了Junit等方法来对自己所写的代码进行检查,完成了多次的自测与互测。而代码风格上,由于有checkstyle的帮助,我在oo的学习中对于代码的风格也提升很多。虽然有时候代码的行数和每行的长度令我很是头大,但是正是这一次次的风格检查,让我明白了如何书写一个明了易懂的代码。
五、改进建议
我对于oo这门课程还是很满意的,如果一定要说有什么可以改进的地方,我觉得可以从下面几个方面考虑一下。
一是对于研讨课这个方面的。因为听了这么多同学的研讨课,感觉其更像是科普课。除了一些同学是对作业的构架上进行研讨外,许多研讨课都是介绍一些我们很少涉及的知识,其可讨论度并不高,再听完后感觉也没能收获到什么 。
再者就是从pre到第一单元的跨度还是有点大。个人认为pre中可以适度的增加关于正则表达式的部分。
六、线上OO学习体会
这个学期的学习经历也可谓是新鲜。之前基本上没怎么接触过网课,而这次线上学习也让我增长的更多的学习经验。相较于线下课,线上课程有着它独特的优势,那就是其便利性。我们可以充分利用自己的时间来学习,由于老师所讲述的内容都会有录播,针对不懂的地方也可以重复多看几遍,可以自己掌握住自己的节奏。但是线上学习oo相较于线下课程就可能在讨论交流上有一定的限制,虽然有腾讯会议等软件,但是有时候还是不够有时效性,可能会有一定的延迟。总体来说线上学习还是一个别样的体验叭。