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

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

一、前言

  紧张刺激的OO“昆仑课程”接近尾声,经过一个学期的学习,我的收获和感触颇多,借此博客作业的机会,对自己OO这门课程做一个总结。本博客主要有以下五个方面,一是第UML单元的作业总结,二是课程期间架构设计及OO方法理解的演进,三是测试理解与实践的演进,四是自己的课程收获,五是给课程的三个具体改进建议。

二、第四单元作业总结

(一)第十三次作业

 1.任务摘要

  实现一个UML类图解析器,可以通过输入各种指令来进行类图有关信息的查询。

 2.要点分析

  理解UML类图的几个关键类型对象,并通过一系列数据结构来管理这些对象,完成查询。

 3.架构设计

 (1)主要思路:

   根据各类UML元素的职能,按照逻辑关系将其整合,构建出类似类图的结构,用Hashmap这一容器存储各类UML元素的信息并实现UML元素之间的索引交互。

 (2)类图:

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

(由于图片较大,看不清的话可以右键将图片转到新标签页,以下皆是)

  分析:构建了MyClass类和MyInterface类,各自包含Attribute和Operation,由于Operation与其参数Parameter是包含关系,因此创建MyOperation类,以Parameter为成员变量。其中,每个MyClass类和MyInterface类可以包含多个MyOperation类,这些底层模块的上层联系在MyUMLInteraction类里构建。

 (3)方法复杂度分析:

OO第四单元总结及课程总结_第2张图片

   分析:分析复杂性比较高的几个方法,其中MyUMLInteraction的构造方法复杂度最高,原因是在构造方法中我写了三个循环,将各类UML元素elements[i]中的信息提取出来并存储到相应的数据结构中,所以设计复杂度iv(G)高,同时,有许多复杂的判断语句和if语句,导致圈复杂度v(G)较高。

 4.程序bug

 (1)一个由于粗心导致的非常愚蠢的错误。在MyInterface类里存储MyOperation的HashMap未实例化,导致要往里存东西的时候产生异常报错。

 (2)在查询类实现的全部接口时,由于对接口的多继承理解不到位,采用一个fatherID变量存储,在出现某个接口继承多个其他接口的时候就会导致漏掉某些接口。修改方法为:每个MyInterface类用一个HashMap存储与其有Generalization关系的其他接口的ID,查询的时候遍历所有“父”接口。

(二)第十四次作业

 1.任务摘要

  在上次作业基础上,扩展解析器,使得能够支持对UML顺序图和UML状态图的解析,并能够支持几个基本规则的验证

 2.要点分析

  理解UML顺序图和状态图的几个关键类型对象,并通过一系列数据结构来管理这些对象,完成查询。理解类图几个基本规则的原理并实现其验证。

 3.架构设计

 (1)主要思路:

   类似上次作业,增加顺序图和状态图这两个相对独立diagram的结构,存储关键UML元素的信息,完成新增的查询指令。同时,在上次类图的模块中增加三条检查规则,检查重名、循环继承和重复继承。

 (2)类图:

OO第四单元总结及课程总结_第3张图片

  分析:与上次的类图相比新增了顺序图SubMap类和状态图StateMap类,这两个类几乎独立于类图相关的那些类,作为新的模块与MyUMLGeneralInteraction中构建出联系。值得一提的是,上次作业的架构并不好,封装性不强,很多代码都是在顶层类中完成的,导致这次作业产生了超行问题,其实应该将类图有关的所有代码都封装起来,从而使整个架构变得整洁。这次作业,与顺序图。状态图有关的许多操作都放置在了类自身里,而MyUMLGeneralInteraction类只负责调用方法并抛出异常。

 (3)方法复杂度分析:

OO第四单元总结及课程总结_第4张图片

  分析:除了由于设计架构(在构造方法中直接提取信息)导致的难以降低的复杂度以外,这次作业有刻意降低其他方法的各类复杂度,比如简化了条件表达式、使用更为简洁的代码、令函数携带参数 - 使用代参函数,强调函数的复用性等方法。

 4.程序bug

 (1)程序超时,产生CPU_TIME_LIMIT_EXCEED

 (2)检查R003时,应注意重复继承的类的子类也通过Generalization关系产生重复继承。

 三、架构设计及OO方法理解的演进

  回首课程整个学习过程,我的架构设计和OO方法理解的发展大概有三个阶段。

  • 第一阶段为“思维转变阶段”,通过学习大一的C语言程序设计课程和数据结构课程,我初步建立起面向过程编程思想,首次接触面向对象编程,第一步需要进行编程思维的转换:在分析问题时,学会把构成问题的各个事物分解成各个对象。
  • 第二阶段是“动手实践阶段”,在把问题分解成对象后,尝试在编程时具体实现:对象作为程序的基本单位,将程序和数据封装其中,以提高程序的重用性,灵活性和可扩展性。在这个阶段,设计时争取遵循七大原则:SOLID原则(单一职责原则、开放关闭原则、里氏替换原则、接口隔离原则和依赖倒置原则)、迪米特法则组合、优于继承原则(合成复用原则)。同时,在架构设计方面,尝试运用24种设计模式。比如:工厂模式、单例模式等。
  • 第三阶段是“形成习惯阶段”,在一次次的作业中,用OO思想分析问题,欣赏学习他人优秀代码,努力形成面向对象编程的习惯,提高面向对象编程的能力,使自己的程序变得更好。

四、测试理解与实践的演进

  回顾课程整个学习过程,我的测试理解与实践大概有四点方法。

  • 第一点是“肉眼观察”,通过walk through发现程序中的漏洞,在面向过程编程时,这种方法还算有效,毕竟代码一步一步的过程很明晰,错误也很容易找到。但是在面向对象编程时就不是很好用了。
  • 第二点是“构造边界测试用例”,这种方法需要极高的逻辑性,需要对输入需求有充分的理解。
  • 第三点是“System.out”方法,在多线程单元,线程之间的关系错综复杂,传统的断点调试方法已经不适用,我回归到原始的输出调试,在可能的地方输出标志语句,使程序的运行过程可视化,从而发现问题所在。
  • 第四点是“JUnit单元化测试”,可以使用OpenJML、JUnitNG自动化生成测试用例,抛却底层实现,而是着眼于“输入”与“输出”的顶层正确性,不关心具体的代码实现。

五、课程收获

  • 第一单元是多项式求导单元,这一单元主要收获有:Java语言的初级编程技术、正则表达式匹配字符串、面向对象的思想、面向对象程序的构成、对象与类的概念、对象的特性、可变性、类的属性和方法、类的继承多态抽象等。
  • 第二单元是多线程电梯单元,这一单元主要收获有:Java系统概览、JVM的基本结构、内存划分、对象方法调用、利用JProfile对程序进行分析、多线程程序的概念、处理方法、多线程并发时常见的线程安全问题、线程安全问题的解决方法、如何进行安全的设计、OO程序的分析与设计原则等。
  • 第三单元是JML单元,这一单元主要收获有:规格的概念、JML语法、方法、类的规格、继承层次下类规格之间的关系、基于规格的测试方法、OpenJMLJUnit等测试工具的使用、数据抽象规格等。
  • 第四单元是UML单元,这一单元主要收获有:UML语言、UML类图、UML顺序图、UML状态图、程序系统的理解、描述、StarUML的使用等。

  早有耳闻OO课程会让大家苦不堪言,的确,看不懂指导书、写不出程序、强测炸掉没进互测、互测被人刀几十下,这些都是会让大家痛苦的东西,但是,痛苦能激励我们不断学习,如果每个人都做得很好,很水的过了这门课,短期内看起来很轻松幸福,但是从长远看,这些东西在你脑子里只是如一道流星一般划过,留下的只有美好的记忆而不是坚实的知识,而我们的OO,就像一块大陨石,狠狠地砸到你身上,不仅能把知识留下,还能砸出一个巨大的陨石坑,方便以后用知识对其进行填补(笑)。

六、课程建议

  1. 合理安排理论课和实验课的内容,尽量避免上午讲、下午实验的现象。
  2. 适当减少互测屋人数,个人认为四人一组为宜。如果可能的话,可以安排一个智能测试机器人,构成五人小组。
  3. 研讨课可以增加一个讨论时间,坐在一起的同学分小组讨论,这样同学们之间更方便直接地互相交流(因为站起来提问有时候会准备不够充分,而且不好沟通)。
  4. 建一个课程通知大群微信群,重要的通知(如时间节点啥的)发布在群里,因为同学们不可能天天守着课程网站的讨论区去看通知。

转载于:https://www.cnblogs.com/lwt-0521/p/11074609.html

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