2022-OO-Unit4暨课程总结

2022-OO-Unit4暨课程总结

一、第四单元架构设计

1.元素封装

本次作业中,各类UmlElement元素类均已由官方包给出,但奈何数据密度较低,仅靠官方包给出的类是很难完成相应功能的查询的。

于是我将每个UmlElement元素均进行了封装,建立MyElement类,例如MyClass、MyInterface、MyRegion等,并且为每个类均设置一个成员变量self,其类型为官方给出的UmlElement类。例如:Myclass类中有一个成员变量为Umlclass类的对象self,MyState中有一个成员变量为UmlState类的对象self。所有的self都从MyImplementation类构造函数的参数UmlElemet[] elements中获取。这样保证原始输入数据可以很好的保存在我自己的数据结构中,使得原始数据不丢失

在原始数据不丢失的情况下,我就可以肆无忌惮的扩充我的数据类,使得每个类中保存的内容变得更加丰富,例如MyClass类中除了保存原始数据外,还可以保存类中的所有UmlAttribute、所有子类、所有父类、所有操作、甚至所有操作的名字频数表等等,怎样扩充都可以。

通过以上封装,极大地优化了数据类型,从而我们可以更好地构建数据结构。


MyClass中的Attribute

2.树形结构

这个单元中的各元素均有parent属性,那么用树形结构来表示则是再合适不过了。

以MyClass为例,MyClass可包含MyAttribute、MyOperation、MyInterface(表示实现的接口)、MyClass(其父类)等等,那么这样就可以将其封装为树形结构,在使用时通过ClassId可以查询该Class下所有属性。

3.等级分明

这个其实是面向对象的基本原则,即隐藏实现过程。对某个类的属性查询,我只需要其结果,我不去关心他是怎么实现的。

例如再R005的判断中,我只需要在MyImplementation中对所有接口调用相应方法,查询其是否出现了R005Exception,其他的细节均在MyInterface类中实现。而在MyInterface类中,对每个Attribute进行Visible查询时,只需对所有MyAttribute对象调用相应函数即可,而具体的判断实现过程则在MyAttribute类中实现

这样三级调用,虽然略显麻烦,但是却很好的符合了面向对象的原则,并且层级分明便于维护。MyImplementation中并不掌握各个MyInterface的内部情况,而MyInterface也不知道各个MyAttribute的内部情况,只能通过逐级调用来实现。


MyImplementation中的调用


MyInterfacec中的调用


MyAttribute中的实现过程

4.工具类

本次作业的输入是一个很有技术含量的环节,由于各个输入的顺序不一定,所以一次输入时肯定不行的。在第二次作业中,我已经进行了4次遍历才将全部输入封装为数据结构。所以这个ReadInput的代码量是很庞大的,于是就有必要将其单独封装为一个Read类,以此减小MyImplementation类中的代码压力。

二、四个单元中架构设计思维及OO方法理解的演进

第一单元

由于冬残奥会的志愿工作,第一单元的作业我是在3月末4月初完成的,当时真的是在赶ddl了。当时虽然经过了pre2、pre3的历练,但我对面向对象思想的理解还是停留在一个较低的水平,写出的很多代码只是徒有其表没有面向对象的魂。现在回头看,还是有很多面向过程的影子

其表现有以下几点:

  • Expr、trim、Factor的层级之间划分不明显,对输入进行解析时也很乱,一会儿在这个地方解析一下,一会儿又去那个地方解析一下,最后导致小bug很多
  • 同时数据屏蔽做的也不够到位,各个类之间的成员变量只是简单的添加了private关键字,该拿出来的时候还是一把拿出来
  • 各个类功能分类不明确,解析、计算、化简交织,现在回头真的是没眼看。

第二单元

第二单元的多线程是全学期的重头戏,我也拿到了强测二百分的成绩。。。但是现在回顾一下,这个单元才是习得知识最多的单元。对多线程从无到有的学习、synchronized关键字的使用、ReentrantLock以及ReentrantReadWriteLock的使用,收获颇丰。

此时我对面向对象的了解也更多了一些:

  • 架构划分上更加合理,层级明显,在楼层楼座方面,新建HorizontalBuildings类和VerticalBuildings类;在电梯方面,新建HorizontalElevator类和VerticalElevator类。HorizontalElevator内置与HorizontalBuildings类中,不进入HorizontalBuildings类便不能越级访问HorizontalElevator,垂直电梯与楼座同理。
  • 类与类之间协作更加合理。 InputThread读取输入后将输入传送给Schedule,之后Schedule根据请求特点,决定将该请求传送到相应HorizontalBuilding或VerticalBuilding中。之后在各自楼层或楼座内,进行二级调度,最终将请求送入对应电梯中。

第三单元

第三单元的作业由于JML的限制,大家的架构其实都差不多。

在本单元作业中,我第一次使用了工具类,用来存储特定数据结构和算法,一个算法一个类,一种数据一个类。引用时类似于python的包。对其进行调用,使得架构进一步清晰,更加高内聚低耦合。

第四单元

第四单元的作业我认为是面向对象原则使用的最好的一次。

数据屏蔽方法封装层级分明等特点均已在第一部分介绍过,这里便不再赘述了。

三、四个单元中测试理解与实践的演进

第一单元

第一单元中的测试数据的构造还处于一个较低的水平,由于当时时间有限,自己很多数据是手动构造得到的,最后在提交评测之前也是借助了同学的评测机,最终才完成了相关的bug修复。

第二单元

第二单元中的数据构造是比较简单的,可以随机生成ID、起始楼层、目标楼层。但其重点是正确性的检验,需要自己再写一遍程序进行正确性检验,之后进行正确性检验。并进行性能检测,判断是否超时。

第三单元

第三单元由于输出全部一样,正确性检验基本可以通过多人对拍来实现,如果对拍结果一致,基本可以判断输出结果正确。

对于数据的构造,可以建立相应类,通过随机数的产生建立相应的对象,将不同的对象之间建立联系,如addRelation、sendMessage等,并进行相应查询,例如queryLeastConnection等。

第四单元

第四单元由于输出全部一样,正确性检验基本也可以通过多人对拍来实现。

但是第四单元UML数据的构造难度较大,大量的数据通过阅读指导书,构造边界情况来手动构造数据,再通过官方提供的jar包导出输入,所以这个单元的作业还是很考验细心的。

四、课程收获

面向对象的设计思维

这学期学习的内容是面向对象的设计思想,如何在面向对象的设计思想下设计出更合理的架构,是这门课的最重要的内容。经过四个单元的历练,我对面向对象的思想有了更深的认识。也充分认识到了面向过程与面向对象思想的不同,认识到了面向对象相较于面向过程的优势,极大地丰富了我的知识体系。

编程能力的大幅提高

一学期上万行的代码量对自身的编程能力有了很大的提高,经过这个学期的锻炼,我在架构设计、算法实现等方面均有了很大的提高,较上学期有了一个很大的进步。这个巨大的训练是较之前从没有接触过的。经过一学期的oo学习,我对自己的编程实现能力也有了更大的自信。

五、三个具体的改进建议

丰富实验流程

建议在每周实验结束之后公布实验答案或思路。按照目前的流程,很多实验完成之后,并不知道自己的成绩如何,个人感觉实验的效果没能最大化地体现出来。

精华博客分享

个人认为,每个月的博客总结中有很多优秀的内容,这些内容如果可以被推广被分享,会发挥其更大的价值。

数据构造经验分享

不论是在学习还是工作中,对代码的评测始终都是一个重要环节。可否在讲授设计原则的基础上,分享更多的数据构造流程和技巧呢?我认为这对学生的发展是有很大帮助的。

posted @ 2022-06-27 15:11  yjzhao  阅读(19)  评论(1编辑  收藏  举报