OO第四单元总结暨课程总结

一、第四单元架构设计

1、第十三次作业

这次作业的重点更偏重于层次结构的设计,很明显每个UmlElement差不多都包含id、name、parentId、visibility四个属性,所以将他们抽象出来设计了MyUml类,又考虑到关联关系只会涉及到类和接口,所以设计了AssociationElement类,其继承了MyUml类,实现了统一管理关联对象的功能,最后顾及到类与方法和属性、方法与对应参数的包含关系,类的继承与接口实现和接口的继承,设计了MyUmlClass类,MyUmlInterface类和MyUmlOperation类,前两者继承AssociationElement类,最后一个继承MyUml类。完成了这样的整体架构后,就只需要通过MyUmlInteraction类的构造方法完成这些设计的类的初始化,之后的查询方法便很容易实现,而且考虑到一旦初始化后,就不会对整个类图做任何修改,所以本人也做了相应的缓存以提高查询效率。

2、第十四次作业

相比于前一次作业,新增的部分是对于顺序图和状态图的查询,所以之前对于类图的架构设计可以完全保留。对于顺序图,需要考虑的就只有UmlInteraction对所包含的各个UmlLifeline的管理以及UmlLifeline对所有相关消息的管理,所以本人设计了继承自MyUml类的MyUmlInteraction类和MyUmlLifeline类完成上述功能;对于状态图,由于这次作业中没有必要考虑不同种类状态的区别,所以为了统一管理各个状态设计了继承自MyUml类的StateNode类,其内部管理了所有的后继StateNode对象,由于每个UmlStateMachine只包含一个UmlRegion,所以可以忽略UmlStateMachine的层次。最后仿照类图的设计,设计两个类分别管理整个顺序图和整个状态图,并实现所有的查询方法,MyUmlGeneralInteraction便可以通过构造函数初始化三个图后调用他们的查询方法完成最后的交互功能。顺带提一句,在这种架构中进行Umlxxx到MyUmlxxx的转换是必不可少的,前一次作业中由于类比较少所以我在MyUmlInteraction中实现了这个转换方法,但是随着类越来越多,最终决定采用工厂模式,设计UmlFactory类,利用其中的静态方法createMyUml进行转换。

3、第十五次作业

相较于前一次作业,在层次结构的设计上并没有什么大的变动,主要是添加了一些新的属性和方法来支持八个check,而主要的难点就在R002-R004,对于R002,我采用了朴素的算法,即对每个接口或类进行DFS,查看他们能不能回到自身;对于R003,既然保证了R002的正确,就只用考虑接口的重复继承,对于重复直接继承,我在MyUmlInterface类中设计了hasDuplicatedParentInterface属性来记录是否进行了对同一个接口的重复直接继承,对于更一般的重复继承,则是采用DFS查看是否能两次访问同一接口;对于R004,考虑到会有对一个接口的直接多次实现,所以用MyUmlClass类中的hasDuplicatedInterface属性来记录是否有这种情况,对于一般的情况,和R003类似,采用DFS从一个类出发查看能否两次访问同一接口。由于这次作业需要将不同种类的状态区别对待,所以又实现了继承自StateNode类的MyUmlState类、MyUmlPseudoState类和MyUmlFinalState类,并且考虑到两个状态之间可能会有多个UmlTransition,所以添加了StateNode类对其的管理。作业最终的UML类图如下:

OO第四单元总结暨课程总结_第1张图片

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

1、第一单元

本人在此单元架构设计的核心就是接口实现和容器的使用,前两次作业使用HashMap就能很好的解决问题,然而第三次涉及到嵌套,就要针对不同因子的特点来设计相应的类来单独管理,比如sin类,幂函数类等,并通过实现求导接口来统一管理,这样就能将难点从求导转移到结果的输出和结果的化简。但毕竟是第一单元的作业,刚从pre中出来难免会设计出一些结构上不够合理的类,低内聚高耦合常常出现,而且三次作业没有一次是迭代发开,彻底体验了一下次次重构的快乐,这个单元结束后才感到OO学习的不仅仅是一门新的语言,更是一种全新的编程思想,除了满足必要的功能,还要为以后的扩展留下空间。

2、第二单元

第二单元的架构核心是多线程中各个线程的互斥与同步处理和生产者-消费者模式的使用,虽然建议设计一个控制器来为电梯分配请求,但是本人三次作业都采用了比较朴素的自由竞争的方式,这样一方面简化了线程之间的竞争,更方便进行互斥同步处理,另一方面经过优化还能有不错的性能。OO课程中介绍了两种加锁的方法,一是采用synchronized关键字,二是运用Lock类,前者使用起来更为简单,这也是本人在作业中使用的方法,但是这样往往不好把控加锁的范围,使得范围过大会降低性能,过小又难以保证正确性,而后者使用起来就更为灵活,容易控制加锁范围,但不容易使用。现在想来,虽然是入门级的多线程,但还是有很多细节需要注意,就比如用while不用if,notify和notifyAll的区别等等。

3、第三单元

这单元本人似乎将更多的精力放在了JML的理解和各类算法上了,也可能是隔了一个第二单元,导致又忽略了层次化设计,使得三次作业虽然实现了迭代开发,但是严重的平面化,所以在架构上实在没有什么好说的,但是总结过后也有了一些架构上的改进思路,就比如专门设计一个图类管理加入的所有节点(Person)和边(Relation),并做好相应的缓存,这样就能将很多复杂的操作从MyNetWork类中抽离出来,使得代码不那么冗余。不过从这单元的学习中还是看到了JML的严谨的特点,采用形式化的语言,避免了自然语言描述带来的二义性,但是JML的描述和对应的代码实现并不能直接对应,否则就很有可能造成性能低下。不得不说的是,虽然JML有配套的工具链,但是体验效果并不是很好,可能还是发展得不够成熟。

4、第四单元

第四单元的架构设计核心就是实现各个UmlElement在UML图中对应的结构层次,具体的内容在前面已经提及,就不再赘述。UML模型作为整个设计的抽象,其实在第一单元就有所接触,但是直到最后一个单元才开始亲手画UML图,毕竟抽象层次比JML更高,就使得整个UML体系感觉更为友好,在starUML里只用操作图形化界面,后台生成的树形结构也比较容易看懂,估计有点混的就是关联、组合、聚合、依赖之间的区别和三类图之间的对应了。但是说到头来UML也只是表达架构设计的一种方式,具体的设计还是要通过更多的学习和练习来摸索理解。

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

第一单元主要是手动构造数据,进行一些极限测试,但在第二次作业后也尝试写了一个自动评测机,但一方面数据生成覆盖面感觉不够,另一方面因为输出化简程度不固定,对拍时没有设计出较好的比对方法,只能结合人工检查,效果并不是很好。

第二单元由于输出格式固定,前两次作业很容易直接针对开门,关门,电梯运行的连续性等方面检查乘客是否顺利到达目的地,而且利用python中的subprocess包和time包也很好实现定点投入数据,所以采用了自动评测的方式,但第三次作业过程比较复杂,只能自动生成数据,然后针对运行的结果进行人工检查,并手动构造了一些极限样例。

第三单元尝试了一下单元测试,虽然功能很全面,甚至能检查覆盖的代码段,但是感觉效率不是很高,所以还是更多地采用了对拍的方法,毕竟这种可以保持一致的输出就很好处理,但是自己在最后一次作业中还是偷了懒,没有做足测试,导致了WA。

第四单元就不好自动生成数据了,所以我是以课程组给出的样例数据为基础进行手动改造,使其变为我希望的比较极限的图,但是这样测试力度还是不够,使得第一次作业又WA了。

四、课程收获

OO一路走来也经过了十几次的锤炼,要说最大的收获还是这种层次化设计给我带来的愉悦,每次能有一个比较好的层次结构,一方面看起来很舒服,另一方面其中不知不觉的融合了SOLID设计原则,所以不管是迭代开发还是发现问题后的修改,都能发现不需要进行大的改动,有时候自以为的一个很大的疏忽却能通过一两行代码解决,不得不说,这是在面向过程的开发中不敢想象的,我甚至觉得一个高鲁棒性的易于维护的代码系统没有面向对象的思想些许是行不通的。

当然,抛离OO本身,本课程的设置也让我收获颇丰,每周一次的作业(虽然还穿插着博客)保证了写代码的手感,每单元两次迭代又使得我们在每次作业的设计中还要考虑之后的扩展,这就使得我们的代码架构能逐渐步入正轨,设置性能分或是容易CTLE的测试点,让我们有动力去优化性能,使得每次的作业更为完善,同时强测和中测数据梯度较大,鞭策我们做足测试,并从实践中摸索测试技巧,而互测环节又使得我们一方面能进一步提高测试能力,另一方面有机会读到更多不同风格的代码,见贤思齐。正是这一系列完备的流程让我感到自己的代码能力和编程思想有了进一步的提升。

五、改进建议

1、我觉得可以适当将每个单元三次作业的梯度平均化(尤其是前两次作业),虽然课程组是想让我们自己思考哪里还有扩展的空间,我也认同这是一个开发人员应该有的素质,但是这样在前两次作业的设计上总感觉有点犹豫,大片的保留扩展空间感觉有点不值得,过少的保留的话有可能面临重构,甚至保留的方向和需要扩展的方向不一致,总的来说这个度不好把握。扩展梯度平缓一些至少能从第二次作业中嗅到一些方向,或者要是可能的话可以在作业发布的同时暗示一下之后的扩展。

2、实验课的结果可以更透明一些,可以在每次实验结束后公布上一次实验的结果,这样让学生心里也有个底,不像现在这样也不知道实验成绩到底是个什么水平。

3、我觉得教学的顺序可以做一下调整,将多线程放到最后,第三、四单元顺次前移,因为我感觉第一、三、四单元是按照抽象程度越来越来高而逐步展开的,中间放一个对于多线程的训练有点打乱节奏。

六、线上学习体会

感觉线上学习OO的效果也差不到哪里去,一方面,腾讯课堂的视频可以反复观看,也可以根据自己的理解情况调整进度,有点因材施教的感觉,另一方面,在师生的交流上我觉得除了研讨课可能会由于没有现场的氛围使得效果降低,平时的话,就算在学校也不会有太多的直接交流,主要还是在微信群和讨论区,这点倒是没差的。不过话说回来,可能还是少了寝室里几个人的激烈探讨了,这点还是比较遗憾。

总之,还是祝愿OO课程越办越好。

 

你可能感兴趣的:(OO第四单元总结暨课程总结)