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

一、前言

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

二、第四单元作业总结

(一)第十三次作业

 1.任务摘要

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

 2.要点分析

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

 3.架构设计

 (1)主要思路:

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

 (2)类图:

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

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

 (3)方法复杂度分析:

   分析:分析复杂性比较高的几个方法,其中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)类图:

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

 (3)方法复杂度分析:

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

 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. 建一个课程通知大群微信群,重要的通知(如时间节点啥的)发布在群里,因为同学们不可能天天守着课程网站的讨论区去看通知。

OO第四单元总结及课程总结的更多相关文章

  1. OO第四单元总结与课程总结

    OO第四单元总结与课程总结 第四单元作业架构设计 总体分析:本单元作业的需求集中于对UML类图进行查询.对于查询操作来说自然的想法是提前预见到需要查询的内容,在一开始就采用适当的数据结构将必要的信息进 ...

  2. OO第四单元与全课程总结

    OO第四单元与全课程总结 一.作业代码架构设计 1.第一次作业 作业类图如下: 具体架构设计: 第一次作业的全部查询工作都是和类图有关,需要解决的主要问题就是如何解析原有UML类图数据的结构,并形成自 ...

  3. 【OO学习】OO第四单元作业总结及OO课程总结

    [OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...

  4. OO第四单元——基于UML的UML解析器总结&OO课程总结

    OO第四单元--基于UML的UML解析器总结&OO课程总结 前言:一学期愉快(痛苦)的OO课程学习结束了,OO几个单元作业都各有特色,实验也各有特色,仔细回味起来,不再是单纯的敲代码(但自己还 ...

  5. oo第四单元作业总结暨课程总结

    oo第四单元作业总结暨课程总结 一.本单元作业架构设计 本单元需要构建一个UML解析器,通过对输入的UML类图/顺序图/状态图的相关信息进行解析以供查询,其中课程组已提供输入整体架构及输入解析部分,仅 ...

  6. 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾

    「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 目录 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 Part 0 第四单元作业架构设计 架构设计概要 AppRun ...

  7. OO第四单元(UML)单元总结

    OO第四单元(UML)单元总结 这是OO课程的第四个单元,也是最后一个单元.这个单元只有两次作业,相比前三个单元少一次作业.而且从内容上讲这个单元的作业目的以了解UML为主,所以相对前三个单元比较简单 ...

  8. OO第四单元博客作业

    OO第四单元博客作业 BUAA_1706_HugeGun 目录 第四单元作业架构设计 四个单元架构设计及OO方法理解 四个单元测试理解与实践演进 课程收获 一点建议 第四单元作业架构设计 ### 第十 ...

  9. OO第四单元总结及学期总结

    目录 OO第四单元总结及学期总结 第四单元三次作业架构设计 第十三次作业 第十四次作业 第十五次作业 四个单元中架构设计及OO方法理解的演进 第一单元 第二单元 第三单元 第四单元 四个单元中测试理解 ...

随机推荐

  1. nginx之热部署,以及版本回滚

    热部署的概念:当从老版本替换为新版本的nginx的时候,如果不热部署的话,会需要取消nginx服务并重启服务才能替换成功,这样的话会使正在访问的用户在断开连接,所以为了不影响用户的体验,且需要版本升级 ...

  2. win32 界面 背景图片

    case WM_PAINT: { HBITMAP hbm; BITMAP bminfo; hbm = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE ...

  3. 64bit机器编译32bit汇编

    sudo apt-get install gcc-multilib sudo apt-get install g++-multilib gcc -m32  -S a.c -o a.s gcc -m64 ...

  4. AngularJS中forEach的用法

    AngularJS中当我们需要遍历某个数组的时候,我们会用到forEach语法.AngularJS中forEach的用法如下: angular.forEach(array,function(obj,i ...

  5. DDD领域驱动设计初探(四):WCF搭建

    前言:前面三篇分享了下DDD里面的两个主要特性:聚合和仓储.领域层的搭建基本完成,当然还涉及到领域事件和领域服务的部分,后面再项目搭建的过程中慢慢引入,博主的思路是先将整个架构走通,然后一步一步来添加 ...

  6. ZROI 19.07.28 序列数据结构/jk

    写在前面 dls:"我不会数据结构,但是APIO的数据结构场我写了,还是蛮简单的." T1 CF643G Sol: 有一个\(O(n\log^2n)\)的做法:假设将区间排好序,取 ...

  7. os模块、sys模块、json模块、pickle模块、logging模块

    目录 os模块 sys模块 json模块 pickle模块 logging模块 os模块 功能:与操作系统交互,可以操作文件 一.对文件操作 判断是否为文件 os.path.isfile(r'路径') ...

  8. 关于反射和动态代理和AOP

    package Exercise.reflect; /** * 反射把java中所有的东西都当做对象,甚至是类的本身也作为一种对象,并把它作为Class的对象的实例: * 反射是把类.类的属性.方法都 ...

  9. React Native 之项目的启动

    运行项目有两种方法 1. 到根目录,执行 react-native run-ios 命令 会开启一个本地服务,加载jsbundle文件,然后是去index.js文件 import {AppRegist ...

  10. sqlite3 on python for newbies

    python 集成了 sqlite3 ,其接口很简单: import sqlite3 db_connection = sqlite3.connect(db_filename) db_cursor = ...