北航OO第四单元——UML图解析

作业要求简析

  • 刚接触本次作业可能需要花上一会才能搞清楚到底是要我们写个啥,在这里简单说一下:
  • UML图的保存格式.mdj文件是以json文件的形式存储的,将每一个UmlElement作为其parent的属性挂载到其中。可以自己随便用starUML画一个,然后看看源文件内容
  • 课程组将这一个个UmlElement单独拿出来逐条输入,以此在我们的程序中建立起UML类图
  • 然后输入查询指令,查询有关于UML图的各种信息并输出

作业思路及架构

  • 由于许多大作业、考试全部堆在这几个周,所以没有对本单元作业进行良好的架构设计,整体的思路仍然停留在第一单元水平,十分惭愧

  • MUmlGeneralInteraction

    • 此类是与官方包进行交互的类
    • 内部属性主要是几个管理器和一个合法性检查器MChecker
      • 类图管理器:MClassManager
      • 顺序图管理器:MCollaboration
      • 一组状态机管理器:MStateMachine
    • 构造函数遍历所有要传入的UmlElement,根据其类的类型调用不同的add****函数,讲不同类型的UmlElement传给相应的管理器
    • 询问时则调用相应的管理器的相关方法
    • 当官方包调用检查方法时,调用MChecker中的响应方法
    • 注:
      • 管理器的查询方法、合法性检查器的检查方法的返回值最好有一定的普适性,从普适性的返回值到官方包要求的特定返回值的过程在MUmlGeneralInteraction中进行,这样可以提高代码可拓展性
      • 然而由于时间关系我并没有这么做 (0ω0)
  • 建模思路

    • 对类图、顺序图和状态机都是采用去建模的,尽可能地将子元素挂载到父元素节点下,从而将各个层次的方法分开
    • 比如MClassMInterface继承自抽象类MClassOrInterface,其中包含了MOperationMAssociationUmlAttribute等,MOperation内再保存了UmlParameter
    • 这样可以将各个层次的功能区分开,下级看不到上级,也不应该考虑上级
  • 类图管理器MClassManager

    • 类图管理器保存了一组MClassMInterface
    • 考虑到UmlAssociation的双向性,不方便同时挂载到两个类或接口中,因此将Association在树中的层次提高一层,保存到MClassManager中,需要的时候查询即可
      • 缺点:类或接口不知道自己有什么Association,设计较不合理(但是为了赶时间所以就 (0ω0))
  • 其他:

    • 顺序图和状态机也是差不多的道理,不再赘述
    • 第四次作业总体比较简单,但是十分复杂,代码量比较大,写代码时要一再检查好要求

OO方法的演进过程(实际是吐槽)

  • 第一单元的方程求导应该是OO思想提高最快的一个单元。由于上学期上过Java课,一些基础的面向对象变成思想提前已有接触,但第一单元各个环节巧妙地设计还是让我很不好受。前一次作业的设计如果不能做大极大的可拓展性,大概率会被下一次作业逼着重构

  • 很遗憾的是,从第二单元作业开始我觉得我编写面向对象程序的能力已经没有很多提升了。第二单元主要训练了多线程,巩固了第一单元的思想;第三、第四单元的代码练习过于简单算法的重要性超过了设计,因此并没有把精力投入到架构设计的训练中了。

  • 我认为第一第二单元的设计是最好的(虽然课程设计的时候可能十分困难),就是需要保证自己程序有足够的可拓展性,后两单元的作业在这方面做的过于简单了,因此就让人忽视了对架构的设计

  • 另外,虽然学习了许多设计模式,但是除了几种简单的比如单例模式、工厂模式等,很难应用到自己的代码中

测试方法的学习历程

  • 这学期的一大收获就是学会了如何编写测评机
  • 第一单元由于有python现成的库计算正确结果,也可以根据正则表达式自动生成测试数据,非常方便编写自己的测评机,独立实现代码测评。
  • 但是当不知道如何编写标准程序,就陷入了不会写测评机的困境。一直到第四单元我才知道一种东西叫做对拍机。他的思路非常简单,将三个人及以上的代码放到一起跑,比较结果的差异即可。这样,我们就只需要负责编写自动生成测试数据的程序即可
  • 另外,我还学习到了JUnit的使用方法,对自己的每一个方法单独测评,可以“每一个方法体会一遍AC的快感”,体验也是相当棒的

课程收获:

  • 建立了面向对象编程的思想,在编写代码时首先想到的是低耦合性、功能分层、可拓展性等,现在看到不符合面向对象编程的代码甚至会恶心(x)
  • 学习了各种测试方法
  • 数量掌握了Java的使用方法
  • 编写之前先设计,设计包括功能设计、权限设计、接口设计、交互设计等等。设计做好后编写代码是水到渠成的事情。我认为这也是一条极大的收获

改进建议

  • 加大第三单元和第四单元难度,最好像第一单元那样保证“前一次作业不好好设计,后一次作业大概率要重构”。逼迫同学们思考更优化的设计
  • 减少算法在作业中的占比,比如第三第四单元海量的图算法(虽然大部分都是简单的遍历),取消一切考验算法效率的测试点。后两次作业完全被写成了Java语言算法编写,而不是面向对象程序设计
  • 一单元作业结束后,可以讲解一下标程的设计思想,这样可以让同学们学习到足够优秀的样例,我认为仅靠讨论课是不够的,就我们班来看,同学们的表达能力不足以清晰的解释自己的算法。
  • 讲解一下最后一次作业的官方包的设计,我认为这是很好的学习样例
  • 理论课的重复内容有些多,就是感觉同一个单元的三次理论课基本讲的都是相同的东西

北航OO第四单元——UML图解析的更多相关文章

  1. oo第四单元——UML图解析

    本单元是在理解UML图的基础上实现对图的解析和检查.UML图是新接触的一种建模工具,一开始接触UML的时候觉得理解起来比较困难,并不能单纯从代码的角度按照类.方法这样来理解,这只是从类图的角度,还有从 ...

  2. 2020北航OO第四单元总结

    2020北航OO第四单元总结 一.本单元架构设计 本单元作业是实现一个UML图解析器,其中实现接口及主要框架课程组已经提供,只需要我们完成特定功能. 在第一次作业时,感到十分迷茫,不知道如何下手,最后 ...

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

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

  4. OO第四单元UML作业总结暨OO课程总结

    目录 目录一.第四单元UML两次作业架构设计第一次作业第二次作业二.架构设计总结与OO方法理解演进三.测试理解与实践演进四.课程收获总结五.课程改进建议六.尾声 一.第四单元UML两次作业架构设计 第 ...

  5. 2019年北航OO第四单元(UML任务)及学期总结

    第四单元两次作业总结 第十三次作业 需求分析 本次作业需要完成一个UML类图解析器,所需要解析的只有符合UML标准和能够在Java 8中复现的UML类图.查询指令存在两种:仅与所查对象有关的指令,以及 ...

  6. 2019年北航OO第4单元(UML)总结

    1 架构设计 经过了接近一学期的程序设计训练,在这一单元的第一次作业中我就非常注重架构的设计,竭力避免像之前一样陷入"第一次作业凑合,第二次作业重构"的不健康的迭代模式.整体上来说 ...

  7. 北航OO第四单元作业总结(4.1~4.3)及课程总结

    前言 在学习过JML规格描述语言之后,本单元进行了UML(Unified Modeling Language)的学习.和JML单纯用语言描述的形式不同,UML通过可视化的图形形式,对一系列有关类的元素 ...

  8. 北航OO第四单元总结

    OO最后一次博客作业--好聚好散 一.单元总结 作业一: 第一次是对类图进行解析,没有太大难度,只要根据讨论区提供的建议,新建两个类来存储相关数据即可实现. 作业二: 第二次作业的难度只有量的提升,然 ...

  9. OO第四单元单元总结

    目录 1.本单元两次作业的架构设计 2.四个单元中架构设计及OO方法理解的演进 3.测试理解与实践的演进 4.课程收获 5.给课程的改进建议 1.本单元两次作业的架构设计 第四单元的两次作业,我的表现 ...

随机推荐

  1. macos 安装telnet命令

    在10.12及以下版本,都内置了telnet命令,但是在10.13中,已经取消了 接下来给大家介绍下如何安装telnet命令 打开"终端",输入: /usr/bin/ruby -e ...

  2. mqtt 集成

    -- 在pom.xml导入依赖 <!-- mqtt --> <dependency> <groupId>org.springframework.boot</g ...

  3. python中的内置函数lambda map filter reduce

    p.p1 { margin: 0; font: 12px "Helvetica Neue" } p.p2 { margin: 0; font: 12px "Helveti ...

  4. Source not found for GeneratedMethodAccessor127.invoke(Object, Object[]) line: not available

    报错:Source not found for GeneratedMethodAccessor127.invoke(Object, Object[]) line: not available 我在使用 ...

  5. WPF教程四:字段、属性、依赖项属性的演变过程

    这个章节主要讲解属性是什么,为什么会演变出依赖项属性,依赖属性的优势是什么.以及如何更好的使用属性和依赖项属性. 一.属性 属性是什么. 翻了好几本C#的书和微软的文档,我觉得对属性讲解比较好理解的就 ...

  6. 华为交换机5855设置ssh

    配置思路 配置交换机密钥对 #生成RSA密钥对 设置vty登陆用户界面的认证方式为AAA认证 #设置远程认证方式 设置aaa用户信息 #本地用户名和密码 #本地用户服务类型 #本地用户授权等级 设置s ...

  7. CVE-2017-12615 Tomcat远程代码执行

    影响版本: Apache Tomcat 7.0.0 - 7.0.81 ps:安装Tomcat需要安装jdk(JAVA环境) 下面来正经复现,Payload: 利用burpsuite 进行抓包 发送到r ...

  8. Django基础06篇 分页

    1.导入Django自带的分页类 from django.core.paginator import Paginator 2.分页类的使用 def index(request): # return H ...

  9. 支持 Homebrew 安装和编辑器模式的 flomo 命令行工具

    什么是 flomo-cli 这是一款可以在命令行中将笔记和想法保存到 flomo 的工具. 基于 Golang 实现,可通过 Homebrew 便捷安装. GitHub Repo:https://gi ...

  10. C语言:数组数据交换

    //交换数组中各个变量的值:第1和最后一个交换,第2与倒数第二个交换 #include <stdio.h> int main() { int a[]={1,2,3,4,5,6,7,8,9} ...