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. minicom - 友好易用的串口通信程序

    总览 SYNOPSIS minicom [-somMlwz8] [-c on|off] [-S script] [-d entry] [-a on|off] [-t term] [-p pty] [- ...

  2. 关于session的记录

    在做DRP项目中的修改密码功能时,在JSP中先获取了之前登陆时设置的session中的用户账号,在调试的时候一直只是刷新页面,而没有重启页面,导致AJAX一直传输到相应的servlet失败,出现404 ...

  3. 将Docker主机数据挂在到容器中

    dcoker 提供三种不同的方式将数据从宿主机挂载到容器中:volumes,bind mounts, tmpfs.volumes: Docker管理宿主机文件系统的一部分(/var/lib/docke ...

  4. 判断是否是iframe框架打开登录页, iframe框架着顶部页面刷新

    if (window != top) top.location.href = location.href;

  5. Django扩展内置User类

    内置User类 使用内置User可以方便实现登录验证,利用Admin管理界面还可以方便添加.删除.修改用户. 一个内置的User类定义了以下字段: username: 用户名 password: 密码 ...

  6. vb6中word编程总结

    1,在project\references 中加入microsoft word 9.0 object library 2, 启动word    Dim wApp As Word.Application ...

  7. Java并发(具体实例)——几个例子

    一步步优化页面渲染功能                                                           本节将模拟一个简单的页面渲染功能,它的作用是将HTML页面绘 ...

  8. mysql 中文乱码 修改编码 utf8

    在安装完数据库的时候,先不要创建数据库,先去更改字符集设置. show variables like 'character%'; vim /etc/my.cnf   (注意 下面的字段文件内没有时,自 ...

  9. DevExpress v18.2版本亮点——Analytics Dashboard篇(一)

    行业领先的.NET界面控件——DevExpress v18.2版本亮点详解,本文将介绍了DevExpress Analytics Dashboard v18.2 的版本亮点,新版30天免费试用!点击下 ...

  10. Python---面向对象---修学校

    一.创建北京和成都两个校区: 1.创建Linux\Python两个课程 2.创建北京校区的Python 3期课程和成都校区的Linux 1期课程 3.管理员创建了北京校区的学员小张,并将其分配在了Py ...