面向对象第四单元总结

 

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

  第一次作业

  第一次作业是实现一个UML类图解析器UmlInteraction,学习目标为UML入门级的理解、UML类图的构成要素及其解析方法。官方开源的包已经对UML文件进行了简化和元素分析,我们需要做的就是分析各个element类,合理的分析元素存储数据,实现各类指令功能。以下是此次作业的分析:

  度量分析

  

  

  

  

  

  第一次作业感觉重点是在理解源代码,源代码里已经封装了很多实用的函数和结构,读懂了才能准确使用(此处应该感谢讨论区各位同学的分享,很大程度上帮助了我理解源代码)。

  考虑到Umlclass类的基础性,基本上每个element都与class有关,所以封装了class类来管理与该class有关的数据,比如操作,属性,接口等;然后再考虑到UmlInterface的特殊性,封装了Interface类来管理类之间的继承关系。在MyUmlInteraction中,先对每个元素建立id2element的map,再在所有元素输入完成后,实现attribute,association,operation,generalization等元素与类关系的对应。接下来的指令功能实现,基本上就基于classList进行查询。

  第二次作业

  第二次作业是是第一次作业的升级,使得程序能够支持对UML顺序图和UML状态图的解析,并能够支持几个基本规则的验证。

  度量分析

  

  第二次作业在第一次设计的基础上增加了对顺序图和状态图的处理。第二次作业中发现了第一次作业对class类封装的不足,所以重新构造了Myclass类,以便进行R001规则的检查。

  在第二次作业的实现过程中,(为了避免类的行数超过500)主体类是MyUmlGeneralInteraction,在其中实例化MyUmlInteraction,MyUmlStandardPreCheck,MyUmlStateChartInteraction三个类,MyUmlInteraction实现类图的查询功能,MyUmlStandardPreCheck进行三条规则的验证,MyUmlStateChartInteraction实现对顺序图和状态图的查询功能。

public MyUmlGeneralInteraction(UmlElement[] elements) {
        forinter = new MyUmlInteraction(elements);
        forstate = new MyUmlStateChartInteraction(elements);
        forcheck = new MyUmlStandardPreCheck(elements);
    }

  对于三个实现功能的类,我采取的方式是将所有的elements传入各个类,三个类各司其职,可以有选择性的分析存储自己需要的element,由于几个类比较独立,所以比较方便实现和debug,但是也会有重复的功能,空间复杂度和时间复杂度都比较高,这个是在设计的时候考虑欠缺的,还有很大的不足。

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

  1.第一单元

  第一单元是多项式求导,大约是面向对象初体验,万事开头难,从面向过程的思想转化成面向对象,感觉还是需要一段适应期的。前面两次作业努力苟苟还是感觉能拿下,第三次作业难度陡增,可以说是很磨人了。现在都还记得对魔鬼WF的判断还有为了满足checkstyle,对所有的方法能分则分,没有什么逻辑性,现在倒回去看第一单元的代码,自己都“不忍卒读”。

  总体上这一单元还是面向过程的思想体现的比较明显,也没有什么架构和设计可言,只是单纯的为了实现功能,但是这一单元收获也不小,让我对java语言有了更深入的理解,比如继承,封装,正则表达式等,也为之后几个单元的作业打下了一点基础。

  2.第二单元

  第二单元是多线程电梯,之前就听学长学姐无数次的提到OO魔鬼电梯,现在倒回去看,还是有一丢丢成就感的。多线程的理论知识感觉还是比较难理解,在正式开始写代码之前也在网上看了很多资料,可能这一单元主要难点是在设计和debug,尤其是第三次作业,把哪个请求分配给哪个电梯,各个电梯之间要怎么协调运作,特别磨人的是每次的输出是不确定的,不能按照以往debug的方式来debug,只能从自己的设计源头上找bug。

  比较巧合的是在oo进行多线程的同时,os理论课也讲到了同步互斥的问题,很多知识点是互通的,比如生产者消费者,各种调度方式。学科之间的交互性也常常让人感到惊喜。在这一单元里,多线程对我来说不再是纸上谈兵,虽然我现在了解到的关于多线程的应用还很浅薄,但是进一步有一步的欢喜;同时在电梯设计的同时,我也对面向对象思想有了更多的体会,谁该在什么时候做什么,都是在设计的时候需要好好考虑的问题。

  3.第三单元

  第三单元是JML规格的理解。(这个单元可能是四个单元里最温柔的单元)

  JML应该是我对契约化设计的初感受,当时第一反映是照着注释写代码,想来不会很难,然后就是大型打脸现场。这一单元教会我的除了JML语言的理解,还有算法的分析和设计。java的容器类有很多,如何从时间复杂度、空间复杂度的角度选择最优的数据存储方式,是在这一单元的三次作业里都需要好好思考的。

  这一单元的作业相较前两个单元,几乎没有重构(感谢JML的引导),这或许就是规格化设计的好处,我能明显的感受到代码在往严谨规范可读可交流的方向发展,模块化的思想也体现的越来越明显,从底层往上的设计思想是我所欠缺的,在以后的学习中还要好好锻炼自己这方面的能力。

  4.第四单元

  这一单元的主要任务是分析UML图。UML感觉是代码的直观反映方式,在这一单元里关键是对elements的分析,首先是各个元素本身的特点,然后是元素之间层次化关系的处理和查询。这个单元让我对层次化的设计,对象的数据存储,各个类之间的交互有了更进一步的体会。虽然现在我依然感觉UML用起来不顺手(或许是不够熟练的缘故),但是这的确是一个展现架构设计的好工具。

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

  第一单元里我主要是读代码找bug,并且第一单元的重心是放在WF,很功利的去看其他同学的bug而忽略了对设计的理解;在第二次和第三次作业中,主要采取的方式是和同学对拍,事实证明这个方法确实有效,很容易就发现自己粗心大意犯的错或是在设计的时候逻辑上的缺陷;第四单元主要用到的工具是starUML。

  总的来说,课程组和各位同学的分享都介绍了很多测试的方式,我认为或许没有完美的测试方式;编写测试程序或使用对拍在前期的投入会比较大,但是成效很好,相较读代码的方式是比较“智能”的渠道,通过这种方式我们也能对其他语言有更进一步的理解,重点是他能够迅速找到程序的漏洞进而进行debug。但是这种方式往往会让我们忽略其他同学程序设计的优点,看不到自己和其他同学的差别在哪,也就不能取其精华,去其糟粕。通过读代码找bug的方式比较“笨”,往往效率也不高,或许盯半天代码也找不到bug,但是这种慢下来的方式可以让我们发现自己架构的不足。

  在第三单元中课程组介绍的用junit生成测试样例进行测试或许是保险且全面的测试方式,但是现在我对JML提供的工具链的应用还很不熟悉,或许在之后进行较大程序的开发会频繁的使用到这些工具。

四、课程收获

  ·比较熟练地掌握了一门面向对象编程语言:java

  ·先设计再动手的习惯养成

  ·面向对象思维的训练和提高

  ·规格化和层次化设计架构的训练

  ·多线程的设计和应用、交互性和数据共享的分析

  ·(数据结构还债)对图和部分算法的再学习

  ·程序安全性和正确性测试的方式、技巧

  ·JML、UML的训练和应用

  ·抗压能力的增强

  看自己第一次作业的代码和最后一次作业的代码,差别肉眼可见。感觉自己每周都在被指导书push,一路走来有痛苦,但是也有成就感,一学期的oo课程的确让我收获了很多,虽然虐人,但是虐得也挺值得的(吧)

五、课程建议

  ·第一单元对小白来说有点陡(大概也是该怪自己没有做好预习...),或许可以调整一下几个单元的顺序(比如把第三单元放在第一个?)

  ·希望能提升中测的全面性

  ·实验课感觉有点迷,有时候都不知道自己在做什么,希望在理论课后能够给我们一点消化的时间,让上机实验发挥应该有的作用

  之前跟学姐了解过这门课程,也是知乎上被很多人diss的课程,其实一开始是没有什么好感的,但是随着一点点深入了解,也改变了我对它的认识。这门课在这学期已经让我们看到了它很大的进步,改革意味着旧的否定和新的建立,不破不立,可能课程还存在不足,但是也没有什么是一步登天或尽善尽美的,感谢各位老师和助教对这门课程的付出,希望并且相信这门课会越来越好!!

  完结撒花~

原文地址:https://www.cnblogs.com/venturenn/p/11078563.html