OO第四单元作业总结
第四单元架构设计
本单元主要内容是对UML图的理解,编写UML解析器,并检查有效性。
第一次作业
第一次作业是实现UML类图的解析。由于元素众多,本次作业我主要讲时间花在了梳理元素之间的关系上。
首先我将类图的基本单位——UmlClass作为我写的图中的节点,同时在这个节点中加入其私有的属性或者方法(如UmlAttribute),以便我下次调用该方法或属性。接口也做相同的处理。
为了方便查询,我对所有有ID和Name的元素进行了处理,存储其ID和Name与HashMap中,保证当知晓Name或ID时,可以快速查找到相应的对象。
我将所有类(或接口)之间的关系用HashMap(key和value分别是对象的ID)的形式存在了一个文件中,当每次查询类的关系时,只要知晓其Name(Name转换成ID)或者ID,即可方便地查询关系。
第二次作业
第二次作业是实现UML协作图和时序图的解析。这次作业与第一次作业建立图的方法类似,不在赘述。
第三次作业
第三次作业是实现模型的有效性检查。这一次作业主要是对已有关系,属性方法等的合理存在性的检查。在前两次作业设计中是允许错误情况存在的,所以在存储的已有的关系和类中已包括了所需检查的错误,只需要进行查询即可检查有效性。本次作业所设计的方法比较多,但由于只是一些查询操作,还是非常好写的。
四个单元的架构设计和OO方法理解的演进
第一单元
第一单元是表达式求导,从幂函数,三角函数和括号嵌套。写第一次作业的时候,对于OO方法并不熟悉,导致我在类的继承和要实现的方法写在哪个类里十分迷茫和混乱(比如我当初竟然让三角函数继承幂函数???)。写第一单元的时候,整体上还是十分面向过程的,根据给的表达式进行元素的抽取和存储,实现的代码也没有满足开闭原则等。当时OO助教分享了自己写的C语言的有关四则运算的代码,在看了助教的代码并结合自己的代码后,有一点点开始理解如何实现面向对象。
第二单元
第二单元是多线程电梯。当时多线程的阻塞和唤醒带来的顺序和锁的问题一直困扰着我,由于不可复现性debug一直都十分困难。在第一次作业的艰苦战斗后,第二次作业时我总算是理清了一些门路。第二次作业时我开始努力让自己理解面向对象的含义,将电梯,调度器都分开书写,并仔细思索了他们之间的关系。总的来说,有了一点面向对象的影子,但每个类还是不够简单,实现的功能还是过于复杂(比如:我将调度器的不同策略都写在调度器这个类中,当不同模式时调用不同的方法,但是将策略单独封装成一个类是更好的选择)。
第三单元
第三单元是JML语言的规格化设计。这个单元是最和谐的单元,至少理解上和实现上都比第一第二单元简单。这个单元对我来说除了根据JML语言写代码之外,还有就是好好欣赏了一下优秀的清晰的面向对象的代码。第三单元官方包提供的类的封装及其功能的实现十分值得学习,在第四单元的代码时,我努力向第三单元官方包所给的代码靠齐(显然靠齐失败)。
第四单元
这一单元我意图书写相似与第三单元的代码,尽可能的面向对象,虽然在一次次迭代中代码逐渐变得丑陋,但总体来说,还是比第一单元进步了很多,值得肯定。虽然自己没什么感觉,但从代码看,我还是学会了一点面向对象的思想的。
四个单元中测试理解与实践的演进
非常遗憾地说我几乎没有参与过互测(躺平……),在测试代码的时候基本也是手动构造。一方面是不会写测评机,另一方面是实在是没有时间(也可能是没有心情)在我痛苦地写完代码后还要写测评机。每一次作业都试图写写测评机,但也只是试图而已……
非常遗憾,如果有下次OO,可以认真考虑下
自己的课程收获
这学期下来我在OO课程中收获颇丰,主要有以下几点:
1、较为熟练地掌握了java语言
2、初步了解了面向对象的意义以及如何写面向对象的代码
3、初步了解了JML,UML语言
4、学会了多线程的简单写法
5、学会使用并查集、迪杰斯特拉算法、递归下降等方法。
课程改进建议
1、由于课程比较简单,对于基础薄弱的同学没办法在一周(准确说是半周)内既写完代码和写测评机。同时对如何写测评机也比较迷茫,希望能单独开一周写测评机并给出一定指导。
2、第三单元第二次和第三次作业,第四单元第一第二次作业知识点上有一点重复,进行合并简化可能会更好,将多出的几周学习一下新内容(如怎么写测评机T^T)
3、互测和测评环节对基础薄弱的同学不太友好(因为没有大佬的大腿可以抱,自己也不会),想自立更生的话可能半周都不用睡了,所以还是重复了一下第一点建议。

浙公网安备 33010602011771号