oo第四单元——UML图解析

本单元是在理解UML图的基础上实现对图的解析和检查。UML图是新接触的一种建模工具,一开始接触UML的时候觉得理解起来比较困难,并不能单纯从代码的角度按照类、方法这样来理解,这只是从类图的角度,还有从顺序图来理解类与类之间消息的交互,从状态图理解一个类内部的状态变化。基本上理解了UML图这个单元就成功了一大半了。

homework13

UML图

架构设计

这次作业仅仅是围绕类图,所以按照类图中的一些从属关系设计了在各类UMLElement的基础了设计了自己的类图中的元素,管理一些相关的数据,这样可以在以类为范围查询的时候比较方便。同时也设计了一些HashMap来放各类的元素,有的是以元素的id为HashMap的Key值,这样可以快速通过id信息找到元素,有的是以name的HashMap的Key值,因为查询操作都是以name的形式给出。

这次作业也涉及到了一些比较复杂的图的操作,特别是继承问题。对于UmlClass,因为规定了单继承,所以我不断循环找出父类,然后将父类的相关信息加入集合。对于UmlInterface,存在多继承的情况,所以我使用bfs来遍历父类。特别是getImplementInterfaceList()这个方法,既需要找类的父类,也要找接口的父类,需要将上面的两种方式结合。

homework14

UML图

架构设计:这次作业对类图的需求没有变化,新增了顺序图和状态图。架构设计与前一次作业类似,增加了相应的UmlElement的拓展元素。在状态图的getSubsequentStateCount方法中也是使用bfs来找到所有的后继状态。

为了解决MyUmlGeneralInteraction这个类内容过长的问题,将对三种类型的图的查询方法分别放入三个类中,MyClass,MySub,MyStateMachine,在MyUmlGeneralInteraction创建这三个类的对象来调用这些方法。

homework15

UML图

架构设计:这次作业加入了检查。对于R005,R006,R007这三个检查,我发现这三个检查都是对于元素自身性质的检查,即不需要知晓与别的元素之间的关系,所以我在一开始遍历处理输入的时候就对这些性质进行了判断。对于R002,R003,R004是借鉴了之前遍历父节点的思路。

架构设计及oo方法理解的演进

让我感触最深的是第一单元的作业。在第一单元没有考虑到后面拓展的问题,所以在第一次作业和第二次作业都是使用比较固定的格式,第一次作业的a*x**b和第二次作业的a*x**b*cos(x)**c*sin(x)**d的格式,这样写起来非常简单,求导也是只要解析出系数和指数就可以套公式得到答案。所以前面两次作业完成的很快也比较轻松。但是第三次作业这个方法就失灵了,因为表达式的形式太多种多样了,所以我不得不回归到最基础的求导方法,花费了很长时间重构,相当于直接完成了第三次作业。

通过这次惨痛的教训,我认识到代码设计的可扩展性的重要性。可能在一开始设计的时候可以发现一些需求上特殊的地方可以利用来化简,如果可以确定需求是固定的,那利用这些固然是好的,但是如果可能会不断改变需求,这种代码修改起来就会很麻烦。在以后的作业中我都注意了这一点,采用的架构设计都是比较常规的,根据一定的逻辑来组织架构,比如第二单元是根据电梯运行的行为逻辑来组织架构,第四单元是根据元素之间的关系逻辑来组织架构,所以重构的次数和幅度都减小了很多。

在课上讲的很模型架构都非常有用。第一单元的工厂模式,第二单元的生产者-消费者模型、观察者模型等,根据这些比较经典的架构设计,对我编写代码起到了较大的帮助作用,让代码结构更加清晰,代码的可扩展性也很好。

测试理解与实践演进

通过这个学期讨论区的分享和研讨课的讨论,我了解到了很多测试方法。有python库的应用,比如第一单元就可以用sympy库来对表达式求导。有脚本的编写,实现代码的自动运行。第三单元开始接触JUnit工具,可以自动生成全面的样例,还可以用来限制运行时间,对于第三单元对时间的要求很严来说很有用。

通过惨烈的强测和互测,我也知道了更多测试的角度。比如第二单元可能会存在电梯调度太弱导致超时、换乘、超载这样的问题,设计测试数据的时候可以针对这些设计,第三单元数据多的情况下对时间的限制。所以测试不仅仅是针对结果,还有时间等多方面的。我觉得手动测试+自动化测试这个模式很好,手动测试可以构造比较容易出错的样例,针对性强,效率高;自动化测试样例多,可以弥补手动测试的不足,但是编写程序比较困难。

课程收获

  • 从原来的面向过程编程转变为面向对象编程。经历了这么多次“大”作业,我实实在在的感受到了面向对象编程的好处,对象把属性和方法封装起来,所以即使有很多的属性或方法,也可以按照一定的规则管理起来。如果是面向过程编程,最多只能用struct来管理数据,但是方法管理就很困难。还有继承和接口,都可以简化代码。所以对于工程量大的代码,面向对象编程就比面向过程编程。
  • 掌握了JML语言和UML建模工具。虽然作业中只是解析UML图,但是我觉得以后遇到比较复杂的工程用UML图来建模,是比较形象直观的。
  • 学会了自动化测试。在增强了java能力的同时也增加了python能力,学会了基本的脚本的编写。
  • 对代码的可扩展性有了新的认识,在后面的作业中重构的幅度都逐渐减小。

改进建议

  • JUnit还是挺重要、挺有帮助的,建议课堂上多强调一些,也可以作为第三单元作业的一部分。
  • 第三单元的作业就仅仅是看JML写代码,而且后面两次作业的重心都放在图的算法和时间上,感觉对学习运用JML并不友好。
  • 实验课的题目在结束后可以公布题目和答案,因为作业只能以java代码的形式进行,有很多的知识点都涉及不到,实验的形式比较灵活,所以实验可能会涉及在作业中涉及不到的知识点。这一点是值得肯定的。但是实验后不知道答案,不知道解题过程,收获不是那么大。

线上学习的体会

oo这门课程是比较注重实践的,所以我觉得线上学习和线上学习的效果差不多。线上学习不足是比较缺少同学之间的相互讨论,虽然设立了讨论区,但是讨论仍然比在学校的时候受限。学习氛围也比较缺失。在课堂教学上也有好的地方,课后的问卷可以督促我们认真听课、按时听课,巩固知识点。不知道在学校的时候有没有课堂讨论题,这也是一个不错的点。

 

posted @ 2020-06-18 12:54  Nebula007  阅读(165)  评论(0编辑  收藏  举报