​ 随着第四单元UML第二次作业的结束,本学期的OO学习也宣告结束了(但还得写博客),下面就对本单元和本次作业做一个总结。

第四单元两次作业的架构设计

​ 本单元是对UML的结构进行解析,第一次作业是对UML类图的解析,主要的难度是UML各种元素之间较为复杂的从属以及其他关系。我的类图设计如下:

​ 我自己创建了ClassModel类来统领两个子类ClassClass和InterfaceClass,分别代表类和接口,其中实现了添加、储存、处理类和接口的各种下设参数的方法和变量,让类和接口的类继承同一个父类非常重要,因为类和接口有很多相似的地方,再进行输入处理时也有很多不易区分也不用区分是类还是接口的情况,所以这样处理极大地方便了程序对这两个类地储存和管理。对于方法我创建了OperationClass来添加储存和管理方法的各种属性,然后ClassClass和InterfaceClass就只用储存和管理OperationClass即可,对于其他的属性由于没有更多的层次,所以就直接使用接口提供的UML类来进行储存和管理即可。

​ 在进行输入处理的过程中,由于其结构的层次性,应该将各种属性的UML_ELEMENT分批来处理,我首先识别处理了UML_CLASS,UML_INTERFACE,UML_OPERATION, UML_ASSSOCIATION_END, 之后再将剩余的其他属性进行识别处理,这样再识别时就可以直接建立起各种元素之间的逻辑结构。在储存中我主要使用了HashMap结构,进行从id到类,从name到类等的映射。

​ 对于各种指令的处理方法,有难度的主要分为两类,一个是需要考虑关联关系的指令,对它的处理比较直接,在每个ClassModel类中均有其关联的类或接口的引用,直接访问即可得到所需要的信息。更复杂的是需要考虑继承关系和实现关系的指令,对于继承关系需要考虑多重的继承,所以我们使用递归来处理,其中Information类就是创建用来在递归时在类与类、接口与接口之间传递信息的,我们任意从某一个类开始,逐层向上,利用递归来实现与继承和实现有关信息的统计,储存在information里,再逐层向下传递。一次递归结束后,再找一个没有经历过递归的类开始递归,直到所有地类和接口都经历过一次递归为止。

​ 第二次作业在第一次作业的基础上增加了状态图和顺序图的解析,以及对类图合法性的判断。在这里要感谢老师和助教们手下留情,最后一次作业的难度要比我想象中简单很多,特别是最后加了很多数据限制以后,整个问题变得很简单。

​ 整体架构如上,对于顺序图建立一个Interation类来储存和管理对应的信息,对于状态图类建立一个StateMachine类来储存和管理对应的信息,相比类图简单很多,想法也很自然。

​ 那么本次的难点主要在于类图合法性的检查,类似对类图的处理,我们按照层次顺序依次识别和建立各元素之间的关系,但不需要用到其他的类,只需要根据要求按照id和name建立关系即可。第一个检查较为简单,只需要遍历查看attribute和Association End有没有重复即可。对于第二三个检查,先将类继承,类实现接口,接口继承形成一张id为结点的有向图,那么第二个检查就是在有向图中找圈,具体地可以使用强连通分量等算法,但由于这里点比较少,所以我们对每个点跑一遍较为朴素的每个点只可到达一次的dfs即可,若可以回到本点,则将该点加入异常结果中。对于第三个检查,在第二个检查检查已经无圈的情况下,找任意两点之间有没有多于一条路经可以到达的情况,若有,那么起始的点就重复继承,具体地同样也是对每个点使用较为朴素地dfs,若在dfs中访问了某个点两次,那么这个起始点就加入到异常结果中。

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

​ 在最开始的第一个单元,明显地自己仍然是面向过程的思维,当时应用熟练的只是Java的语法,而不是Java面向对象的思想,第一单元的第一次作业好像就只使用了一个类来完成了所有的事情,在第二次作业中让自己多分出了几个类,但仍然不够灵活和自然,更多的是为了划分而划分。

​ 到了第二个单元,有了前面一个单元三次作业的练习,自己有所进步,开始从面向对象的思路开始思考,自己所处理的问题有哪些对象可以使用,他们之间又有哪些关系,但第二单元的重点我认为是在线程的设计和处理上,根据线程的理论,类的划分也就比较自然,但也是让我感受到了面向对象的便利。

​ 在第三单元之中,是根据JML来写代码,更多地是在助教们设计好的架构下来补充代码,虽然没有太多的自己的设计,但这也是一个学习的过程。到了第四单元,对面向对象的理解应该已经有了比较高的进步了,可以从问题涉及的对象入手来分析问题,可以很自然地想到一个比较好的架构,并实现它。

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

​ 第一个单元最开始自己测试的方法还是比较原始,主要是自己手动构造一些边际数据来进行测试,肉眼来看结果的正确性。在后面由于表达式难度的加大,肉眼很难分辨正确与否,所以我和几位同学一起用python来对拍,答案相同则认为正确。

​ 第二个单元是多线程,在第一次作业中我吃了手动输入的亏,由于自己手动输入的速度太慢,所以基本上不会造成线程安全问题,所以隐藏了很多问题。所以之后我使用了bash批处理和Python来实现了自动生成输入,自动按时输入和检查输出的合法性,大大加快了检查效率,也使得在互测中方便了很多。

​ 第三个单元中引入了JML,开始我还是使用自动数据生成和多个程序对拍的方法,之后也尝试了利用JML自动生成数据并自动测试,但总有一些bug,所以最后尝试使用了朴素的Junit单元测试,还是比较方便的。

​ 第四个单元是UML的解析,由于数据不易生成,所以测试主要是利用starUML来生成一些边界性的数据进行测试,也由于UML的结构相对比较固定,所以还较为方便。

​ 总的来说,测试是程序设计过程中一个非常重要的环节。经过四个单元,我认为测试最好的方法就是使用Junit对没个小单元进行功能测试,但实践中由于自己类和方法的设计问题以及时间问题,比较难以实施。同时自动化测试尤其是压力测试对测试也是一个必须的过程。

课程收获

​ 最大的收获当然是面向程序的设计思想,面向对象提供给了我们一个程序设计的高效思路,使得我们的程序层次化架构更加清晰,代码重用更加便利,加快了程序设计速度,提高了程序设计效率。丰富了我之前单一的面向过程的变成思想,展现了编程更多的可能性。

​ 在这个过程中自己的代码能力也有了很大的提升,也是第一次拥有了工程性的想法和思维。还学习到了多线程的程序设计,了解了Java较为底层的实现,对Java有了更深的理解。也学习到了规格化的设计,JML语言,UML建模语言等。

​ 另外,在这个过程中,自己分析问题的能力,测试的能力,debug的能力也有很大的提升,也是对自己的抗压能力,面对较大规模编码的能力的提升。

课程改进建议

- 希望改进一下课上测试的形式和方法,至少找时间讲解一下课上的题目或给出参考性答案,否则我们在课上测试中得到的收获很少。
- JML部分课程组或许可以再进行一些探索和优化,删去一些难以实现的部分,增添一些更为实际的要求。
- 希望可以改进一下课堂使用的ppt,个人认为课堂ppt的逻辑普遍有一些混乱,结构不是非常的清晰,常常有一些重复等。另外,截图也经常看不清楚。

转载于:https://www.cnblogs.com/yhhhz/p/11078284.html

面向对象程序设计——UML分析和本学期总结相关推荐

  1. 《面向对象程序设计》2018年春学期寒假及博客作业总结

    在过了半个月后写这篇总结,有点时过境迁的感觉,开头写了好几遍,都找不到感觉,但又觉得有些要点很有必要记录下来,以便以后改进.因此,只能简略言说,无法传情达意. 一.关于寒假作业1.寒假作业有必要继续保 ...

  2. C++面向对象程序设计 学习心得

    C++面向对象程序设计 学习心得: 这学期学了C++面向对象程序设计,通过成绩单处理,ATM,通讯录,图书管理系统这几个简单系统,慢慢地对系统的设计有了一个初步的认识. 简单说一下设计系统具体的过程以 ...

  3. 第四单元作业——UML分析总结学期总结

    本单元主要学习关于Unified Modeling Language (UML)的设计与分析的内容,重点对UML中的类图.顺序图和状态图的表达方式和有效性进行了分析. UML与上个单元学习的JML同样 ...

  4. 面向对象程序设计第四单元总结(UML系列)

    2019面向对象程序设计第四单元总结 前言 ​ 本单元是面向对象程序设计课程的最后一个单元了,本单元是和UML模型相关,也就是说,我们需要正确理解UML模型的基础上,对构建出的UML模型进行解析,但是 ...

  5. python在删除对象时会自动调用析构函数_Python面向对象程序设计构造函数和析构函数用法分析...

    本文实例讲述了Python面向对象程序设计构造函数和析构函数用法.分享给大家供大家参考,具体如下: 构造函数和析构函数 1.构造方法的使用 很多类都倾向于将对象创建为有初始化状态.因此类可以定义一个名 ...

  6. python定义私有变量的方法_Python面向对象程序设计之私有变量,私有方法原理与用法分析...

    本文实例讲述了Python面向对象程序设计之私有变量,私有方法原理与用法.分享给大家供大家参考,具体如下: 私有变量,私有方法:python的私有化是为了规划私有属性,避免非相关的访问[假如!我有老婆 ...

  7. python的类变量和成员变量用法_Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析...

    本文实例讲述了Python面向对象程序设计类变量与成员变量.类方法与成员方法用法.分享给大家供大家参考,具体如下: 类变量与成员变量 在类中声明的变量我们称之为类变量[静态成员变量], 在init() ...

  8. 《面向对象程序设计》第12章在线测试

    <面向对象程序设计>第12章在线测试  <面向对象程序设计>第12章在线测试 剩余时间: 59:55  答题须知:1.本卷满分20分.            2.答完题后,请一 ...

  9. 20175212童皓桢 Java实验二-面向对象程序设计实验报告

    20175212童皓桢 Java实验二-面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设 ...

最新文章

  1. 最佳置换算法(OPT)
  2. Linux初学(Linux命令行的使用)
  3. 8月第2周中国五大顶级域名增4.1万 美国减6.8万
  4. 微信小程序/uni-app 封装请求
  5. 出口埃塞俄比亚,有哪些需要注意?
  6. jmeter xml 请求_Jmeter学习笔记(十六)——HTTP请求之content-type
  7. Mipmap纹理技术简介
  8. 腾讯2020校园招聘后台开发面试编程题
  9. 外贸网站服务器搬迁方案,WordPress网站迁移到新服务器教程
  10. mysql跨库复制_mysql跨库表结构和数据复制
  11. 《概率论》大学课堂笔记——高分笔记,考试复习专用
  12. android 闪屏页 动画,记一次 Android 闪屏页适配
  13. 安科瑞无线测温装置,多点温度在线测温装置
  14. elasticsearch-es search 查询
  15. 【自动控制原理】——第二章——数学模型【时域】【复频域】【梅森增益公式】
  16. 求一个数除 1 和自身以外的因子
  17. 哪个品牌的蓝牙耳机降噪好?主动降噪耳机排行榜10强
  18. SQL Server2012 安装方法详解
  19. 南京理工大学计算机学院刘,南京理工大学计算机学院导师介绍:刘永
  20. 二.使用JDBC对数据库CRUD

热门文章

  1. [我研究]Behavior Based Software Theft Detection - Hawk
  2. 关于重装系统后或打补丁后不能上网的问题的解决
  3. 职业生涯中12个最致命的想法
  4. python数字转换_Python实现中文数字转换为阿拉伯数字的方法示例
  5. curd操作php代码,Laravel 5.6中的CURD操作(代码示例详解)
  6. java 播放.pcm文件,java播发PCM文件
  7. android如何导入活动,关于android:如何将活动值传递给另一个活动(Kotlin)
  8. C++内联(inline)函数
  9. JavaScript中的数组
  10. 用python计算ln函数_python-含参函数