北航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. com.rabbitmq.client.impl.Frame.readFrom(Frame.java:95)

    RabbitMQ 基于Erlang 实现, 客户端可以用Python | Java | Ruby | PHP | C# | Javascript | Go等语言来实现.这里做个java语言的测试.首先 ...

  2. Djiango 连接数据库mysql 的基本数据操作

    1.单表操作 (1) .增加操作 1 # 增加操作 2 def add_person(request): 3 # 1.使用save() 方法 4 # person_obj = models.Perso ...

  3. Linux | 浏览(切换)目录命令

    例出目录和文件 --> ls ls 命令是最常用的 Linux 命令之一,ls 是 list 的缩写,表示:列出 在 Linux 中 ls 命令用于列出文件和目录 一些常用的参数 ls -a # ...

  4. kong配置upstream实现简单的负载均衡

    目录 通过konga实现 1. 配置upstream 2. 配置Service发布 3. 配置Route,匹配规则 4. 验证结果 通过 Kong Admin API实现 1. 配置upstream ...

  5. win10禁止粘滞键 禁止按5次shift开启粘滞键

    如果你感觉粘滞键的快捷键影响了你的使用或想强行更改连续按5次上档键的指向的话,建议用你需要的程序替换%windir%\system32文件夹下面的sethc.exe @echo offclsdel / ...

  6. 给potplayer配置iptv源,看所有你想看的电视

    目录 一.展示: 二.下载 三.播放 一.展示: 二.下载 Github 上的开源项目:iptv-org/iptv 传送门: https://github.com/iptv-org/iptv 该项目包 ...

  7. MQTT 2——服务端安装与客户端测试

    本篇记录一下MQTT服务器,客户端,JAVA客户端的选择开发与测试 MQTT服务端选择与安装过程:MQTT客户端测试工具安装与测试:MQTT JAVA客户端的选择与开发,测试 MQTT服务器选择与安装 ...

  8. 汉诺塔Python

    刚开始看python实现汉诺塔,自己想了很久才想明白,在这里记录一下,希望以后忘记能够立马记起. n=1时,可以直接a->c n=2时,可以借助b然后将a->c n=3时,可以将最上面的那 ...

  9. python编程面试题

    # 实现需求为 注册.登录.查看昵称的功能 # def userN(): #     username = input("请输入账号: \n") #     password =  ...

  10. C++:第一个c++程序

    // C++ 环境搭建: https://www.bilibili.com/video/BV1nt4y1r7Ez?t=535 // 学习资料:https://www.runoob.com/cplusp ...