一、第四单元作业架构设计
我们第四单元围绕UML图展开,在第四单元开始之前,本来以为我们的工作是学习如何使用UML工具,开始后才意识到我们要做的是解析UML类图、顺序图和状态图。当然,让我们解析的只是冰山一角,但我必须说解析UML图真的是太面向对象了。
1.第一次作业
第一次作业中我们要完成的是
从上图可以看出我只用了两个类,Main类和MyUmlInteraction类,而我们主要实现的为后者,我在构造方法中实现了诸多的HashMap,用来保存各个UML属性的对应关系以保证在需要时我们可以直接使用,在所需实现的各个方法中,我多采用了直接返回值(如:getClassCount)或者BFS(如:getImplementInterfaceList),因此在编码上不是很费力。但我后来还是发现了空指针异常等诸多问题,还需进一步提升自己的码力。
2.第二次作业
这次的作业在第一次作业的基础上,我们需要进一步拓展,使得我们的程序支持对UML顺序图和UML状态图的简单验证,以及对类图的几个基本规则的验证。这一次的代码面向对象的特征更为鲜明,以一个类MyUmlGeneralInterface为载体,承载了MyUmlClassModelInteraction、MyUmlStandardPreCheck、MyUmlCollaborationInteraction、MyUmlStateChartInteraction几个类,各个类实现了各个类相应的功能,配合的比较好。
可以看出几个类之间有较为密切的联系。这次的作业中对于UML顺序图相关的内容非常的简单,只需要建立HashMap在查询时之间返回相应结果即可;对于UML状态图前两个也只是需要直接查询,第三个找后继状态的时候我用了BFS算法来寻找后继;这次作业比较难的部分是规则的检查,规则R001相对简单,只需要找到每个类所有的Attribute和关联对端并检查有无重名,规则R002我采用了DFS的方式来判断每个顶点是否处于一个圈中,规则R003则相对复杂,因为类实现接口也会导致类的多继承问题,但只要考虑到这一点就依旧可以通过BFS算法来判断每一个顶点有无违反多继承的规则。
总之,我在这个单元的两次作业的架构不是很复杂,完成的效果也比较理想,至少在强测中没有暴露出问题。
二、四个单元作业架构设计及OO方法理解的演进
1.第一单元
第一单元围绕多项式求导展开,当时的我不仅是对面向对象一无所知,甚至对我们学习面向对象的载体——JAVA也是一知半解,第一单元作业的完成自然会花费大量的时间,在完成了整个OO课程的学习后来回顾第一单元的内容,我觉得这一单元应该是想要让我们掌握继承、接口以及多态这些面向对象中最为基本的内容有一个大致的掌握,但是在我完成作业的过程中并没有很好的做到这一点,三次作业中甚至一次继承都没有用,可以说是虽然完成了作业,但是没有很好的完成这一单元要学习的目标,通过这一单元我基本了解了如何实现类与类之间的配合。
2.第二单元
第二单元围绕多线程展开,这一单元可以说是最难理解的一个单元,而且不仅要求正确性,对性能也有要求,这对我是一个非常大的挑战。在这个单元我也初步接触到了设计模式,虽然我在完成作业时并没有用到老师所讲的单例模式,但是对其有了一定的了解,在后面的作业中也是用到了观察者模式,收获不小。但这个单元是我表现最差的一个单元,不仅在课上实验的时候无从下手,在第三次作业不仅设计的时候出现了很多的问题,更是因为一个非常naive的问题强测爆炸,可以说这个非常重要的单元我掌握的不是很好,但也从中学到了很多东西。
3.第三单元
第三单元围绕JML展开,这一单元是我写得最顺畅的一个单元,可能是因为其难度本身就比上个单元的多线程简单地多,而且给出的描述相当严谨,让人一看就知道想得到什么东西,似乎在这个单元我比较好地完成了设想的教学目标,就是拿到一个任务,先想需要那些类,类中的方法需要返回什么,再去想如何实现。这个单元我也比较好地运用了最开始学习的面向对象知识,代码的拓展性也有所提高,使得在复用时方便了不少(感觉人生到达了巅峰)。
4.第四单元
第四单元围绕UML展开,这一单元难度不是很大,只要理解element之间的关系就可以轻松完成,但我反而在这个单元架构设计地不是很好,第一次作业只用一个类就完成了所有任务,第二次作业还相当好看一点。这并不能说明我之前学的知识都忘掉了,在写码的过程中,我还是很好地运用了学到的各种知识,类与类之间的交互变得流畅了许多,对继承、多态等也有了更加深刻的体会。
三、四个单元作业测试理解与实践的推进
在四个单元的学习过程中,我对测试的认识有了更多的理解,在最开始的时候,我对测试的理解是简单的构造测试数据,而且那时的我认为评测用的数据也仅仅是人为构造的比较复杂的数据,所以一开始我都是构造边缘测试用例来验证自己程序的正确性。之后我的认识可以说是脱胎换骨,从第一单元开始,就看各路大佬构造数据生成器进行随机的覆盖性测试,我就感觉到非常神奇,后来又接触了形式化验证和junit,在使用的过程中我发现junit这种单元测试实际上就是对一个方法的全面检测。
在经历了四个单元的学习,我似乎有了一定的灵敏性,对容易产生bug的地方多了一份直觉,这应该是随着代码量的积累相伴随的现象吧。
四、课程收获
OO这门课是我在经历过计组之后感觉非常实在的另一门课,其虐的程度不亚于计组,正如老师说的,“我们很难用一门课完全让你们学会面向对象的全部知识,只能是师傅领进门,修行看个人”,我十分地赞同这句话,我也始终相信付出越多收获就越多,硬核的专业能让你学到更多的知识。那么OO这门课让我学到了哪些呢?
- 面向对象的基本知识和基础应用
- 写1000+行工程化代码的能力
- 运用Java语言编程的能力
- 简单了解了设计模式
- 简单了解了测试模式
- 了解了JML这个程序规范工具
- 了解了UML类图、顺序图、状态图相关的知识
五、课程建议
- 实验课有较大改进空间,首先是和理论课的配合不太合适,往往是上午刚学完下午就要马上运用,学期中有些许改进,在实验课之前有课程预告,建议在每次实验课之前说明考察内容,避免课上现学无法掌握的情况发生。
- 个人认为第一单元的多项式求解很大程度上实现不了教学要实现的目标,比如我就完全没有用到继承、多态的内容...建议加以改进使其面向对象的特性更加明显。
- 多线程在面向对象中应该占有较大的比重,所以是否可以适当增加第二单元的学时,压缩第三单元的学时,来让学生们更好掌握面向对象相关的内容。