面向对象设计与构造第四单元总结博客

面向对象设计与构造第四单元总结博客

一、第四单元作业架构设计

本单元作业的内容主要是对UML类图、状态图和顺序图进行解析并实现指令查询,同时进行一些规范性验证。对于官方包给定的每一个类,我都将其复写为了My×××的新类,这样做虽然有些繁琐,但可以较好地避免在编写代码时出现混乱。

在构建图时,由于elements 的 顺序是不固定的,因此对其进行了5轮遍历,每轮读入的元素如下表所示:

轮次 元素
1 UmlClass, UmlInterface, UmlStateMachine, UmlInteraction, UmlAssociationEnd, UmlCollaboration
2 UmlOperation, UmlAttribute, UmlInterfaceRealization, UmlRegion, UmlLifeLine, UmlEndPoint, UmlAssociation, UmlGeneralization
3 UmlParameter, UmlState, UmlFinalState, UmlPesudostate, UmlMessage
4 UmlTransition
5 UmlEvent, UmlOpaqueBehavior

本次作业中各元素之间有着非常明确的从属关系,因此在架构时主要的方法是通过成员变量进行映射。为了便于实现指令查询,我在存储元素时大量使用了HashMap,key为id,value为具体的对象。对于需要进行重名检查的部分类,还额外采用了以名字为key、存放具体对象的ArrayList为value的HashMap来进行存储,便于检查。

对于第三次作业中接口的循环继承,由于接口是可以进行多继承的,因此我额外对所有的接口构建了一个有向图,其中节点表示接口,边表示接口的继承关系,并用拓扑排序来进行循环继承的判断。

最后,给出本次作业的Uml图:

二、架构设计思维及OO方法理解的演进

一句话来说,本课程让我的架构设计思维以及对OO方法的理解经历了从无到有,再逐渐加深的过程,这也是我认为本课程带给我的最大收获。第一单元让我初步建立了对架构设计和面向对象的理解,并深刻意识到了其重要性;第二单元让我了解了多线程的知识并通过作业进行了实践,掌握基本的多线程编程方法的同时建立了对线程安全的意识;第三单元让我学习并理解了JML,体会到了规格的作用并接触了单元测试;第四单元加深了我对UML的理解。

在之前的学习与实践过程中,我一直以来都习惯于直接上手编写代码,而不进行充分的架构设计。这样的作法虽然也能够完成任务,但经常会由于写代码时考虑不够充分,导致需要进行比较多的修改,从而使得代码变得非常臃肿和丑陋,并且也比较容易出现Bug。在完成本课程的第一次作业时,我依然采用了这样的方法,最终的结果却是连中测都无法通过,尝试修改时却发现要改的地方越来越多,最终只能重构。从此我便开始格外重视架构的设计,每次动手写代码前都要花一定时间进行比较充分的架构设计。这样的转变给我带来了很多肉眼可见的好处:架构设计明显让编写代码的过程更加顺畅,编写完成后的正确性也大大提高,即使有Bug也很容易修复。此外,对架构的设计也让我在每次作业的迭代开发中能够比较容易地实现新功能,之后也再也没有经历过折磨人的重构。本课程一整个学期的锻炼,也让我在架构设计上从生疏逐渐变得娴熟,架构设计的能力在不断的积累中得到了提升。还有一个有趣的心态上的转变,在最初进行架构设计时,我其实是不太能静下心来的,总是想着赶紧设计完然后开始写代码。但随着越来越能体会到架构设计的好处,我开始逐渐愿意主动进行架构设计并对其更加专注,在这上面花的心思也越来越多。

在OO方法方面,我通过本课程完成了从面向过程编程到面向对象编程的转变,并通过课程的作业逐步加深了对OO方法的掌握。最开始接触面向对象编程时,总是会出现类定义不合理、实现一些功能时不自觉地把代码写得非常“面向过程”等等问题,经过一学期的训练,这些问题都得到了很好的解决,我也认为自己掌握了基本的OO方法。

总之,本课程让我接触并最终对架构设计和OO方法都有了不错的掌握,它们让我写出的代码更加规范,可扩展性与正确性更好,同时也提高了我的开发效率。我认为这些收获在今后的学习甚至工作中都将带给我很大的帮助。

三、对测试的理解与实践的演进

在本课程之前的学习过程中,绝大多数的课程都提供了较为完整的测试,这也是得我对给出的测试样例产生了比较强的依赖,往往只自己进行一些非常基础的测试,而很少构造有一定强度的测试数据。而本课程的强测以及互测制度,让我不得不开始在测试上下功夫,也逐渐意识到了测试的重要性。还记得在第一次作业中进行测试时,我只会手动构造一些边界数据以及较为复杂的数据,自己手算出结果,再对其他同学的代码进行测试,一切都非常”原始“。后来,我学会了使用python构造数据、验证结果正确性,并用在了第二次作业的测试中。第三次作业,则是我第一次进行自动化测试。此后的作业中,我越来越能够熟练地手动构造极端数据,进行自动化的测试数据构造以及测试。在第三单元的学习中,我还学习了使用JUnit来进行单元测试,并继续运用在了第四单元作业的测试上。同时,我也会针对个人认为指导书中比较容易出错的部分,构造一些测试数据。

总之,本课程让我意识到了测试对于保证软件质量的重要性,也让我在测试数据的构造以及自动化测试等方面有了一定的实践,让我初步掌握了进行软件测试的思想与技能。

四、课程收获

总的来说,OO课程带给我的收获是非常大的,我认为我的代码能力得到了全方面的提升。通过本课程,我学习了面向对象编程、实现了从”面向过程“到”面向对象“的转变;意识到了进行架构设计的重要性、初步掌握了进行架构设计的方法与能力;认识到了测试的重要性、掌握了进行测试的基本方法与思想;学习了一些设计模式,提高了自己代码的规范性与可用性;接触了多线程编程并掌握了其基本方法;形成了从可扩展性、规范性、架构等等多个角度衡量自己程序的思维,而不再仅仅关注代码的正确性......我认为这些收获中的绝大部分都是具有长远意义的。

五、个人建议

1.针对作业给出方向性的指导

课程作业重点考察的程序的正确性,而对实现方法没有要求。诚然”条条大路通罗马“,但我相信课程组精心设计的每次作业一定都是有希望我们掌握的具体内容的,我也认为掌握思想与方法比写出正确的程序更具有长远意义。目前,课程组给出的指导主要是指导书中的设计建议以及老师在理论课上的一些提及,但这些都有些简略和粗糙,对此希望课程组能够针对每次作业在指导书中给出较为系统的讲解,这样更加有利于同学们找到正确的方向。

2.关于实验课

实验课是我认为本课程中综合体验不太好的部分。部分实验的设计是基于一些比较陌生的知识的(例如JVM垃圾回收),这需要我们在非常短的时间内理解这些知识并完成实验,这使得时间本就非常紧张的实验课难度大大提升。部分实验的官方代码中出现过一些个人认为不太好懂但显得很“高级”的代码,对理解官方包造成了一定的困扰,希望助教们在编写时尽量克制自己炫技的欲望。官方代码中还出现过没有用的变量,同样对理解代码造成了困扰。此外,个人认为实验课15分钟的提交时间限制有些长了,5分钟或许比较合适。

3.明确课程群的功能

在我看来,课程微信群的作用应当是及时发布课程通知,而不应该成为课程组进行官方答疑的场地。尽管课程组强调过答疑要在讨论区进行,也常在群里建议同学们将疑问发在讨论区,但事实上老师或助教仍然在群里回复了大量提问。为了避免漏掉有价值的信息,我每次编写作业的代码前都要翻看对应时间段的全部聊天记录,这个过程还是挺折磨人的。同时,我个人认为在微信群中进行答疑也不利于同学们在提问前查看自己的问题是否已有解答,很可能导致一个问题被重复提问,对课程组以及同学们双方来说都是一种不必要的消耗。对此,希望课程组能够进一步向同学们强调课程群的功能,将官方的答疑严格约束在讨论区。

4.研讨课的少数分享质量不高

首先要承认的是,研讨课上进行分享的绝大部分同学都进行了非常精心的准备,他们的分享也让我受益颇深。但在我印象中,有极少数同学的分享只是围绕主题进行了一些介绍,而没有自身的思考,也出现过内容照搬网络资源的现象,甚至在讲解时出现非常明显的断句错误(大概是因为对自己所讲的内容都并不真正了解)。因此希望课程组能更加严格地把控分向的质量,宁缺毋滥。

5.关于理论课

上这门课之前就一直听说理论课与实验关系较小,实际上课的过程中,我认为老师讲解的很多内容都是非常有用的,也能感受到老师在尽力将内容与作业相结合,但我认为目前理论课依然难以对完成作业起到非常明显的帮助,完成作业所需的知识基本还是要靠网络和讨论区来进行学习。

posted @ 2022-06-29 12:19  h_bh  阅读(37)  评论(2编辑  收藏  举报