OO第四单元总结

1.第四单元作业架构设计

本单元的任务是编写一个用于分析UML图的程序。

在本单元中,主体的逻辑框架都已经实现,只需要围绕MyImplement实现类图分析的功能。对于一些已有的UmlElement需要重新封装,以建立起不同种类UmlElement之间的关联,比如UmlClass与UmlAttribute,通过以他们为基础建立自己的MyClass与MyAttribute就能实现各个不同类之间的关联。对于需要查询的类图属性,总的来说也分为两种方法,即统一计算与读时维护两种,对于同的指令要按照需求选择合适的方法。同时还有两点需要注意,其一,本单元的作业中有几个指令是需要使用递归来得到结果的,对于这样的方法,要特别关注递归陷入死循环的可能,特别是那些采用维护法的指令,输入时陷入死循环会使得输入终止,无论后续指令是否与该递归有关都会算错。其二,是应该注意,对于代码风格而言,一个类不能超过500行,如果你把三次作业的任务都写到MyImplement里面的话会远超500行,所以实现时要把MyImplement的功能拆违几个,以减小每个的类的大小。

以下是本单元的类图架构:

 

 

这是本单元第二次作业类图的构造,第三次作业相较第二次作业只是增加了验证错误这个环节,大致布局相同,其中Until是由于MyImplement过大,引入来分当他处理输入数据的功能来减小MyImplement的大小。值得一提的是,如果MyImplement仍然过大,可以写三个类分别处理类图、流程图与顺寻图,分担相应的功能来减小MyImplement的大小。在每次作业中,都有一些注意事项。

在第一次作业中,对于指令getClassAttributeCouplingDegree,注意会出现错误类型,不能将其算入耦合度中。

在第二次作业中,对于指令getStateIsCriticalPoint,需要注意状态图中可能出现循环,要注意不要陷入死循环。

在第三次作业中,需要注意R003中可能会出现循环继承,如果对于指令getClassImplementInterfaceList,如果采用的是维护的方式来实现的话,需要保障不会陷入死循环,在在实现上需要保障每次遍历只遍历每个MyClass一次。

总的来看,我的架构是以MyImplement作为中枢,各个自我封装的类中,类之间的关系按照类图中的关系进行相应的连接,并且在每个类中还封装了为实现各个指令而对类中属性进行查询与处理的方法。在总的MyImplement中有几个map表项是为了方便查询而存在的,通过HashMap可以在查询时将时间复杂度将至O(1),可以使得查询特定名称的属性变得无比轻松,但这样的方法也增加了耦合度。提的一体的是,我并没有单独封装自己的MyInterface与MyParameter。而实将他们合并到了结构相似的MyClass,MyAttribute中,通过不同的构造方法来区别属于哪一个具体的UmlElement。代码结构分析如下

 

2.架构设计思维及OO方法理解的演进

经过了四个单元的学习,OO课程教会了我许多思考的方式,更正了许多我以前的错误思想。

第一单元中,我学会了面向对象的思考方式,相较于面向过程的思想,我们不再把事件过程本身作为编程的依据,而是将一个个对象看作主体,再由主体发起动作来完成一个个过程。同时也教会了我一定要先构建出合适的架构再开始写代码,而不是一上来就直接开始,同时,构建的架构还需要思路清晰,架构完整,而且有利于后续的拓展,易于添加可猜想的功能。

第二单元中,我学会了多线程设计的相关模式,同时也学习了多线程并发的安全保障与加锁机制。在本单元的第一次作业中我就设计了足以拓展至后两次作业的框架,但是由于框架实在第一作业中设计的,其性能并不是十分优秀。本单元中我着重学习了保障访问共享区时的安全,此外还要在安全的情况下尽量的提高程序运行的效率。

第三单元中,我学习了JML规格相关的问题,我充分了解了JML规格在编写程序是的好处,特别实在多人协作时,可以统一实现接口,JML语言不需要考虑方法的复杂度与描述方法的实际可行性,只需要描述时保障正确性即可,具体实现方法交给实现的人去做,能够统一规范。

第四单元中,我们学习了UML图的分析,在分析UML类图的过程中,我们也了解到,UML图是一种描述事件与代码时表意完善的功能图,有利于在代码的顶层架构设计,从为完成后续的具体实现提供了清晰的方向指引。

3.测试理解与实践的演进

在这四个单元的学习中,测试也是必不可少的一部分。一开始测试时我一般都是手写构造一些自己写代码时认为容易出现错误的点,或则自行构造一些极端的数据最后将结果与自己的预估结果相比较。在后几个单元的测试中,我尽量使用评测机与同学对拍,以防止出现未曾设想的错误,在具体测试时也分普通数据与极端数据进行多次测试,并且显示每次测试的运行时间来防止互测时被卡爆。总的来看,通过评测机验证无错的代码一般就不会在强测与弱测中被找出问题。

4.自己的课程收获

经过了一学期OO的学习,我对以面向对象为角度进行编程有了初步的了解,除此之外我也学到了许多写代码的经验。首先是,写代码前一定要预先构造自己的代码框架,在合理的框架下,会使得写代码时更加得心应手,同时,完整的框架也可以验证自己思路的可行性,不会导致半途而废。第二是,写代码时一定要主动考虑自己代码的复杂程度,复杂度低的代码更加符合自己写代码时的高质量要求,而且往往高质量的代码维护起来更加容易。第三是,以面向对象的角度看待问题,在写代码时,要选择合适的目标作为对象,将各个对象行为的集合作为过程。第四是,代码写完后一定编写自己的测试程序来验证他的正确性,要确保代码能够覆盖所有自己想要覆盖的点。

5.给课程提三个具体的改进建议

1.我觉得课程组可以要求学生们详细的注释自己代码的功能,这样不仅易于别人看懂代码,同时也易于自己对代码的回顾。

2.个人感觉OO的上级有一点水,或许上机的时候可以更加严格一点(反正也轮不到我了)。

3.个人感觉研讨课收获有限,课上的那点时间想讨论出什么有意义的东西还是很难得,而且紧迫感有限,可以在每次研讨课后都然大家提交一份学习收获(不小于200字什么的)。



posted on 2022-06-22 22:51  计组战力单位  阅读(27)  评论(1编辑  收藏  举报