一、总结本单元两次作业的架构设计
-
第一次作业
-
要求简述:本次作业最终需要实现一个UML类图解析器,可以通过输入各种指令来进行类图有关信息的查询。以uml模型中的类查询为主,我们在课程组提供的结构中实现以下查询功能的细化:模型中一共有多少个类、类中的操作有多少个、类有几个关联、类的关联的对端是哪些类、类的操作可见性、类的属性可见性、类的顶级父类、类实现的全部接口、类是否违背信息隐藏原则
-
实现思路:由于已有的架构比较完善,我实现的过程是自顶向下的实现:
-
首先定义查询类包含所有查询功能
-
对于每个查询功能的具体实现,先调用一个未实现的方法或结构;逐层往下逐步实现,实现过程中只考虑功能性,不考虑完备性。
-
所有的功能需求满足后,在实现每一层的构造函数来填充各层所需的数据。
-
- 结构示意图:
查询时以ClassList为主,一步步进入到其包含的类中去,或是某个ClassFile,或是更里层的Interface等。
![]()
- 类图:
类图较大,附于文末。
-
-
第二次作业
-
要求简述:本次作业,在上次作业基础上,扩展解析器,使得能够支持对UML顺序图和UML状态图的解析,并能够支持几个基本规则的验证。主要任务除了实现第一次作业要求的功能,还需要实现三个规则检查功能、关于顺序图的三个查询功能、关于状态图的三个查询功能。
-
实现思路:与第一次作业相关的要求没有变,所以直接继承了第一次作业的类,当然同时做了适当的修改,因为三个规则检查功能是以类图为基础的。另外还实现了顺序图的类,实现了状态图的类;关于这两个类的实现也仍使用第一次作业的思路,自顶向下。
-
结构示意图:
由于新实现的两个类所要完成的功能比较少,故而没有很多的额外结构;另一方面,课程组的原有基本类型中所包含的数据完全可以满足查询的需求,故而没有过多的自己定义类;此外,对于规则的实现,是对第一次作业进行了一定的添加和修改,整体的架构变化不大。![]()
![]()
-
-
- 类图:
类图较大,附于文末。
- 类图:
二、总结自己在四个单元中架构设计及OO方法理解的演进
-
-
第一单元:多项式求导
第一单元是面向对象编程入门的一个单元,从一个过程式选手转变为一个面向对象练习生。
第一作业完全用过程式编程方法写,完成需求只用了俩个类,更多的纠结于如何在过程式思维里避免bug
第二次作业(跌了一跤,发现自己写得什么垃圾还要重构),开始认真的学习用面向对象的思维去写,更多的是考虑如何从题目中抽象出一个一个类,思考的时间远大于码代码的时间。
第三次作业(尝到了一点甜头),因为第二次作业的架构不错,虽然没有达到大佬们的水准,终于可以在第二次作业的基础上进行第二次的开发了,相比于第二次有些事半功倍的感觉。 -
第二单元:多线程电梯调度
第二单元是面向对象抽象方法的一次实践,此实践中发现自己对于面向对象编程的认知有一定的局限性;另一方面也粗浅的学习了多线程程序的编写方法。此单元遇到的主要问题是关于对象之间的交互方式有些云里雾里。
第一次作业作为第二单元的第一道关卡,鉴于第一次作业的相关经验。一方面花了大量时间在考虑如何优雅地将问题抽象出类,另一方面也在考虑尽量为下一次作业扫清障碍(说白了就是希望下次作业可以少花点时间)。应该是历次作业里编程体验很良好的一次作业。而多线程的理解当然有其局限性,对于对象之间的交互方式有些疑惑。
第二次作业(尝到了巨大的甜头),因为第一次作业写的时候考虑了很多,完成第二次作业基本没有花费什么时间,当然这也与第二次作业要求与第一次作业要求相比变化不大的缘故。
第三次作业与前两次作业相比,在多线程编程方面似乎可以是一次较大的跨步,写作业时对于架构曾一度想着重来吧重来吧,但是鉴于第一单元作业的幸苦历程,还是决定咬牙改一改看起来是什么垃圾啊的代码。也深刻体会到了自己对于架构方面的理解很粗浅。 -
第三单元:JML规格化设计
第三单元以规格化设计为主,一方面需要学习JML语言如何表示规格以及相关的测试;另一方面在实现功能方面涉及图论需要很大程度上的考虑性能。收获大概除了规格化设计外,就是对java一些数据类型的理解了。
第一次作业比较友好,根据JML规格描述很容易实现要求,不需要费很多的功夫。
第二次作业(又踩了个坑),由于对HashMap这一数据类型的理解不深,导致强测错了一大片。明白了java里尽管各种数据类型应有尽有,但是使用起来可不能一知半解。从架构方面上,自我感觉也有很大不足。
第三次作业(摔得挺疼的,上一次写的什么垃圾),因为架构上设计的比较差,改一个数据类型就要对整个结构动刀子。改到最后越改越烦,干脆直接重构……结果就没来得及搞完。深刻地体会到了结构的重要性以及某些数据类型的特点,认真想起来会发现两次作业其实跨度不大,主要还是由于第二次作业的一些问题导致第三次作业做起来很累且没有结果。但是还能怪谁呢,还是自己学艺不精…… -
第四单元:UML类图解析
作为OO的最后一个单元,给我的感觉是编程似乎是为了理解UML语言的结构,以及脱离具体语言从整体上把握面向对象编程方法。对前三次的学习有一个巩固的作用。
就两次作业编程而言,相比于之前的作业,我尝试自顶向下的完成任务(不知道是取巧了,还是说理解更好了《)。编程的体验极好,感觉写出来的结构也不错(或许再来个第三次作业我就又要说什么垃圾了吧〈)。就UML语言来说,自我感觉止步于了解,因为自己动手画的图不多,或许因此理解有限吧,更多的学习反而是在编程中学习。
-
三、总结自己在四个单元中测试理解与实践的演进
-
第一单元:多项式求导
热衷于暴力脚本测试,这与刚开始操作系统有些关系。测试数据有自己根据规则列出来的,也有与同学共享的,没有考虑完备性、有效性之类的(反正是自动的,莽就行了)。自己写了一个自动测试的脚本,但是数据还是自己手动构造,自动构造的数据爆零效率毕竟没有手动构造的高。 -
第二单元:多线程电梯调度
多线程程序的测试,没有掌握脚本测试的方法,只能单纯的从线程安全方面考虑,手动一个个码,效率极其低下。刀人的乐趣大大减少,同时自己的程序交上去也不那么有底气,因为自我构造的用例不多,也没有什么完备性可言。 -
第三单元:JML规格化设计
规格化设计一方面对于编程基本实现了无二义性,另一方面也对我们的测试提供了很大的帮助,构造测试用例可以从JML语言出发,github上甚至有现成的一些工具。JUnit也很方便与我们测试模块化。就测试而言,第三单元的测试体验是最良好的。 -
第四单元:UML解析
UML解析的要求里文字描述很多,在自测的时候其实更多的是做阅读理解而不是想着完备性测试,这一单元的bug基本上都是源于理解出了偏差。
四、总结自己的课程收获
与其在这里罗列出这一学期课程教了啥,我更愿意谈论我在OO课程中的感受。
1.抗压
一学期的OO下来,有一些起落的感觉,从一开始接触的好奇与兴致勃勃,到中期的不堪重负,再到后期的劫后余生¯\_(ツ)_/¯。收获最大的恐怕就是抗压能力了吧,每周周末都被占用的感觉真心不咋地。中测强测互测的体验也有中过山车般的感觉,好歹是过来了,但是确实有中劫后余生的感觉。
2.面向对象新大门
本课程之前,对于面向对象一直是只闻其声不见其人。在一学期的学习下来,对于结构与思想而言,从好似懂了,到懂个p,又到我又懂了,再到我好像才刚开始???发现真正的学习都是要从实践中来(深刻地认识到了马克思主义中实践与认识的关系)。学习编程就不可能离开代码,这一学期的代码量给人压力同时也给人收获满满的可能。
3.规则、规格与测试
在本课程的后俩单元,更像是一种讲诉如何编写有质量代码的课程,深入浅出,不能说完全掌握,但对于我而言可以说是受益匪浅。特别是最后的uml类图解析,在训练的同时又可以加深对架构的理解,很有收获。
五、立足于自己的体会给课程提三个具体改进建
- 希望最后一次作业是一次完整的自己建构模型的一次大综合。如此一来我想与课程第一次作业对比起来更可以看到自己究竟收获了什么。
- 希望能多做些每周编码难度的平衡。不知道是不是水平在变化的错觉。感觉有时候难有时候简单,没有循序渐进的感觉。
- 课程教学内容相比于作业似乎有些延后,希望能考虑这个问题。
六、附:
第一次作业类图

第二次作业类图




posted on
浙公网安备 33010602011771号