BUAA OO 第四单元总结

BUAA OO 第四单元总结

1. 本单元架构设计

第一次作业

架构设计

第一次作业要求实现UML类图的分析。

此次作业中我采用了以节点为设计中心的构图方法,将类图中涉及的元素分成了三个层次。

第一层(节点)第二层(节点的属性与关系)第三层(节点属性的相关内容)
UmlClass, Umlnterface UmlAssociation, UmlAttribute, UmlOperation, UmlGeneration, UmlInterfaceRealization UmlParameter

根据实现上面节点的需要,实现了MyClass与MyInterface作为节点,MyOperation作为具有一定内容的节点属性,其他内容直接存储到相应的类中,如第二层的UmlAttribute直接存储到第一层中定义的MyClass或MyInterface中。

由于查询时可能会采用name或者id,所以存储时分别按照name与id构造了两个HashMap容器,另外,为了方便查询,构造了name重复的HashSet,避免调用以name为关键词的HashMap导致错误。

查询相关内容,如实现的接口等时,通过设置一个HashSet进行存储,从而达到不重不漏的效果,特别注意在前面定义的HashMap中,存储的对象需为同一个对象,避免哈希值不同而导致重复。

UML类图

第二次作业

架构分析

第二次作业在第一次作业的基础上新增了时序图和状态图的分析,同样以节点为设计中心,将其他内容均作为节点的属性放置在节点上。时序图中,将UmlInteraction作为一个图的集合,而把UmlLifeline作为节点。状态图中,UmlStateMachine作为图的集合,UmlState作为节点。

时序图
第一层(集合)第二层(节点)第三层(节点的属性和关系)
UmlInteraction UmlLifeline UmlMessage
状态图
第一层(集合)第二层(节点)第三层(节点的属性和关系)
UmlStateMachine, UmlRegion UmlState UmlTransition, UmlEvent

UML类图

第三次作业

第三次作业在第二次作业的基础上新增了UML图有效性的检查,基本架构与第二次作业相同。

进行有效性检查时,通过自己定义的MyClass, MyInterface进行递归检查,在R005,R006的检查中,可以在初始化图的过程中设置标志位进行预处理。

本次UML类图与第二次作业相同。

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

第一单元

这一个单元应该说是初识OO,充分体会了被OO整到自闭的恐惧……同时也是四个单元里面最具有面向对象特点的一个单元。在这个单元里,我从刚开始(第一次作业)对面向对象方法的一点也不理解,到后面历经几次重构之后对面向对象有了初步的认识,这时候我对面向对象的认识可以说就是继承与多态。第一单元不用继承真的重构到原地起飞(

在这个阶段问我什么是OO方法的话,我的回答应该是把一个工程的各个块按照一定的共同点分成各个部分,之后设计一个相当于概括性描述的类(就是父类),之后剩下的东西都从这个父类进行延伸(也就是继承),使用的时候就用父类,新增功能就在父类的基础上继承一个新的子类,之后覆写方法。

在这个阶段只能说略微有了一点OO的感觉,知道这么一回事但是不太清楚怎么使用。(通常重构几次才能提取出来一个概括性的父类)

第二单元

第二单元难度达到了本学期的顶峰,每次进电梯都在思索自己写了一个什么垃圾,在这个单元主要是对于多线程的相关内容理解的比较多,同时也学习了诸如观察者模式、单例模式等面向对象设计的思路。这个时期认识的最多的应该是对象之间的交互吧,第一个单元里感觉自己有了面向对象的概念,这个单元就告诉你你还是太年轻了,第二单元里理解了对象之间的交互的重要性。

这个阶段我对面向对象的理解倾向于流水线作业的感觉,一个对象只负责自己的那一部分,其他的部分不属于自己负责,对象之间的交互的感觉类似于任务交接的意思。比如A类和B类之间的交互,可以认为是A把自己的工作做完了,把信息整理成任务提交要求的模式交给人物管理员,之后B从任务管理员那里领取自己的任务和信息(通常就是A提交的那个模式)。

在这个阶段感觉自己对OO的理解略微深入了那么一点,至少对一个基本的问题能够有自己设计的想法和思路。

第三单元

第三单元应该是本学期最简单的一单元,但是这个单元的意义不在于完成那些代码,感觉写代码并不是这门课想教的东西,而是认识JML规格以及设计一些设计的思想,也是在这个单元里,我认识到了自顶向下的设计方法。

这个阶段开始对面向对象的方法有了实践的思路。不局限于某个细节的实现,而是对这个工程进行分析,设计出相关的对象和对象之间交互的方法,先把工程分成几个大块,之后完成大块之间的交互之后再设计大块内部的功能(类似于黑箱的感觉),之后剩下的内容就是填充这些内容。本单元的重点在于前面设计的部分,虽然主要任务是完成代码的填充……从设计的过程中理解自顶向下的设计方式。

这个阶段里自己具有了基本的OO设计的能力,虽然不是很熟练,但是确实具有了这样的一些思维。

第四单元

第四单元感觉类似于这门课的一个总结单元,总结一下这门课希望我们完成的工程是一个怎样的形式。

在这一个单元里我感觉OO的设计与UML图类似,实际上也是设计一个图的感觉,节点就是自己设计的类,之后各种交互作为节点之间的连线,同时对是否符合OO有了一个感觉还算比较有效的方法——看UML类图是否好看。虽然感觉有点荒诞,但是不可否认,一个比较好的OO设计,是不太可能让类之间的关系杂乱无比的。

这个阶段主要还是对OO课程一个小的总结,对是否符合OO有了一个比较基础的判断方法。

3. 四个单元中测试理解与实践的演进

在这几个单元里我的测试方法基本相同。用啥测试方法不重要,能找到bug才是王道!

  1. 手动构造极限数据测试。

  2. 大量数据黑箱测试。

  3. Junit单元测试。

三种方法里面,第1种和第2种方法应用的比较多,因为简单快捷有效,时间不够是大问题……但是这三种方法各有各特点和意义。

  1. 极限数据通常是发现bug最有效的方法,按照老师说的,50%以上的时间都是在处理各种各样的异常情况,极限数据一般是处于正常情况和异常情况的边界数据,这类数据往往会因为思维惯性等问题导致错误,所以极限数据定点爆破异常有效。

  2. 大量数据黑箱测试常常会发现自己忽略掉的bug,手动构造数据虽然高效,但是无法保证自己的数据一定涵盖了所有情况,大量数据虽然也无法保证完备性,但是至少可以保证绝大部分情况自己的程序可以正常运行。

  3. Junit单元测试应该是最完备的测试方法,但是需要对于各个方法进行分析,因此对于资源的消耗会比较多,实施起来比较复杂。

4. 课程收获

个人感觉OO课程是我大二下学期学到东西最多的一门课程,真心感谢授课老师和助教们的辛勤付出!

  1. 首先最重要的肯定是对面向对象方法的认识。通过这门课,我建立了面向对象的基本思维,而且第一次明白面向过程是啥意思,具有了一定的面向对象设计的能力,对一个问题处理时可以采用面向对象的设计方法并进行迭代设计。

  2. 第二点那必然是Java语言的学习。当初得知这门课认为Java是必备技能的时候自己是头皮发麻的……在经历了头秃痛苦的假期预习任务之后,从零学习了Java语言的语法和使用,在后面的课程中逐渐熟悉了Java各种高效的操作。在OS课程上仍不忘对Java高级编程语言精简高效的眷恋。

  3. 一个强大的心态。本以为上学期CO的历练已经让我的内心无比强大,这学期OO和OS课程的轮番轰炸让我明白我还需要继续锻炼……我愿称之为三氧化硫中毒……在经历了每天做梦都是求导,每次坐电梯都要灵魂拷问,感觉到窗外的太阳是多么美好坚持下来就是成功,虽然过程很痛苦,但是最终的结果是让人欣喜的。自己的能力得到了极大的锻炼,抗压能力也有了极大的提高。

  4. 其他的技能比如markdown、git、jar打包等功能的使用。说实话感觉这些东西虽然很基础,但是用起来真的非常方便。

5. 改进建议

emmmmmmmmmm其实我感觉这门课现在已经比较完善了,这门课虽然过程比较辛苦,但是是我这学期体验最好的一门课,如果必须要给建议的话,那……

  1. 预习任务能否友好一点(哭)。在预习任务的时候,我甚至重构了n多次,因为完全不知道面向对象是什么意思,在被我哥diss了好几次之后(没错,重构是我哥的意见,很感谢他制止了我用Java写C语言代码的行为),才完成了预习任务。希望在后续安排的时候预习任务可以给出一个例子,可以是其他一个简单的程序,至少让学生预习的时候知道自己应该往哪个方向努力,避免Java写C的行为。

  2. 实验课能否给个反馈。每次实验过后感觉就过去了,也不知道自己的答案是不是正确的,建议实验课也设计一个debug环节,放在课后完成就好,让学生知道自己错在哪里,该怎么修改会比较好。

  3. 每个单元的第一次作业给个大致的设计方向吧,就给出大致需要完成的功能。感觉每个单元的第一次作业与第二次作业的跨度都略微有点大,有种第一次作业给个枣,第二次作业打一巴掌的即视感……实际上这个建议是因为我想不出来第三条建议……

posted @ 2021-06-25 00:19  cloudstar  阅读(70)  评论(0)    收藏  举报