北航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. 1.3.7、通过QueryParam匹配

    server: port: 8080 spring: application: name: gateway cloud: gateway: routes: - id: guo-system4 uri: ...

  2. WebContent的子目录里面的jsp文件无法将数据传递给Servlet

    在WebContent下创建子目录FormCheck,register.jsp将跳转到RegisterServlet这个Servlet中去 分两种情况:在web.xml里面配置 和 使用注解 1.在w ...

  3. mysql binlog恢复数据实战

    在前面,我们了解了mysql binlog日志的作用以及使用方法:  http://www.php20.cn/article/237 在后面讲到了,可以通过binlog进行恢复数据,那么,具体步骤是怎 ...

  4. Codeforces Round #139 (Div. 2) 题解

    vp上古场次ing CF225A Dice Tower 1.题目简述: 有 \(n\) 个骰子被叠在了一起.对于每个骰子上的一个数,与它对面的数的和始终为 \(7\) . 你是小明,你只能从正面看这个 ...

  5. AI 预测蛋白质结构「GitHub 热点速览 v.21.29」

    作者:HelloGitHub-小鱼干 虽然 AI 领域藏龙卧虎,但是本周预测蛋白质结构的 alphafold 一开源出来就刷爆了朋友圈,虽然项目与我无关,但是看着科技进步能探寻到生命机理,吃瓜群众也有 ...

  6. etcd的使用

    etcd的使用 什么是etcd etcd的特点 etcd的应用场景 服务注册与发现 消息发布和订阅 负载均衡 分布式通知与协调 分布式锁 分布式队列 集群监控与Leader竞选 参考 etcd的使用 ...

  7. OSPF的基本工作原理

    OSPF的基本工作原理 1.定义 2.特点 3.基本概念 4.OSPF五种分组类型 5.DR/BDR 6.区域 1.定义 开放最短路径优先OSPF,是为了克服RIP的缺点在1989年开发出来的. &q ...

  8. 网页如何嵌套网页__HTML框架

    通过使用html框架,可以在一个浏览器窗口中展示多个页面.也就是一个html文件中可以引入多个html文件.在网页中框架使用比较少,但我们还是需要了解下. 方式1:iframe 使用iframe标签来 ...

  9. ES6 模版字符串及常用的es6扩展方法

    1.ES6 模版字符串es6 模版字符串主要用于简化字符串的拼接 <script type="text/javascript"> let obj={name:'rdb' ...

  10. MyEclipse无法打开jsp文件(打开是空白的),但是可以打开java文件

    转载: 解决MyEclipse使用时打开JSP发生"An error has occurred,See error log for more details"错误的解决方法这个问题 ...