第四单元总结

第四单元主要内容是写代码解析UML,因此需要理解UML

UML相关

starUML的储存方式是一个.mdj文件,通过使用文本编辑器观察这个文件,我们可以看出这是一个json格式储存的文件。

通过把.mdj后缀名改为.json,可以更加直观地观察这个文件。

架构分析

以上是我两次作业的类图,我在作业中,给UML中的每一种Element建了一个对应地类。

在建图的时候,我通过各种parent恢复了json文件中的树状结构,便于统计。

关于第二次作业的有效性检查

有效性检查基本上都是图论上的问题。

为了方便/代码复用性/代码美观性,我将图论算法提取出来了。

我新建了一个名为Dfsable的接口。

package graph;import java.util.List;public interface Dfsable<T extends Dfsable<T>> {void addSon(T node);List<T> getSons();
}

以下是图论算法。

package graph;import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;public class GraphAlgorithm {public static class Node implements Dfsable<Node> {private List<Node> sons = new ArrayList<>();@Overridepublic void addSon(Node node) {sons.add(node);}@Overridepublic List<Node> getSons() {return sons;}}/*May not contains itself.*/public static <T extends Dfsable<T>> HashSet<T> getCanArrive(T cur) {HashSet<T> ans = new HashSet<>();dfs1(cur, ans);return ans;}private static <T extends Dfsable<T>> void dfs1(T cur, HashSet<T> ans) {for (T e : cur.getSons()) {if (!ans.contains(e)) {ans.add(e);dfs1(e, ans);}}}public static <T extends Dfsable<T>> boolean isInCircle(T cur) {return dfs2(cur, new HashSet<>(), cur);}private static <T extends Dfsable<T>> boolean dfs2(T cur, HashSet<T> vis,T source) {vis.add(cur);for (T e : cur.getSons()) {if (e.equals(source)) {return true;}if (!vis.contains(e)) {if (dfs2(e, vis, source)) {return true;}}}return false;}public static <T extends Dfsable<T>> boolean haveMorePath(T cur) {return dfs3(cur, new HashSet<>(), cur);}private static <T extends Dfsable<T>> boolean dfs3(T cur, HashSet<T> vis,T source) {vis.add(cur);for (T e : cur.getSons()) {if (vis.contains(e)) {return true;}if (dfs3(e, vis, source)) {return true;}}return false;}
}

通过将所有具有Dfs性质的元素提取出Dfsable接口,我可以只写一次算法,就实现各种搜索。

OO课程总结

OO这门课很快就结束了,在这门课中,我在不断的写代码和学习中理解很多,学会了很多:

架构设计与OO方法

在这一个个单元中,我的架构设计能力和对面向对象的理解有的极大的提高和加深。

第一个单元,我设计的架构一塌糊涂,第二个单元有了起色,第三个单元,我的结构已经基本可以有良好的复用能力的,到了第四个单元,我的架构水平相比第一单元,有了极大的提升。

而对面向对象的理解,我也随着一次次左右有了加深,从一开始只是知道"封装、继承和多态“这些概念,到最后可以熟练甚至下意识地应用这些思想。OO,提高了我的各种能力。

测试理解与实践的演进

在历次作业中,我使用了各种进行脚本测试。

我遇到的主要难点是数据的生成。

其次,另外一个难点是多线程单元的脚本写法。为此,我尝试了解了powershell/linux shell的使用,有了很多的收获。

课程收获

认识的过程,是一个从实践到认识,再从认识到实践的过程。

​ ——马原

OO,一门又爱又”恨“的课。

”恨“当然不是指真的恨,而是说在有时写作业代码感到累的时候,不禁产生的一丝难受。

但是,我也明白,没有难受,就也没有可能有进步和收获。

这也是我爱着OO这门课的原因。

在这门课中,我从一个只写过单文件c语言的工程小白,变成了一个听见了一个宏大任务后不会慌张,可以冷静思考,可以马上开始分析如何”分解这个任务“,”如果是我,我会用什么架构“等人。当然,我肯定与大佬还差的远着呢,或者说,在工程方面依然是一个不折不扣的小白,但是,如果没有OO这门课,我可能至今为止还是写一些简单的“益智”、“好玩”的小程序。

一次又一次的作业、上课、实验和讨论,我逐渐理解、明白了什么是面向对象,为什么要面向对象,如何面向对象......

感谢OO,感谢各位老师、助教和同学。

对OO的小建议

关于课上实验的部分,好多都是上午上完课的内容,下午立刻可能就需要使用,希望下次安排的时候,可以给一些缓冲。

关于第一单元的正则表达式部分,建议可以开始前把正则表达式进行一些训练。

转载于:https://www.cnblogs.com/login256/p/11073475.html

OO第四单元——UML及其解析器——总结 暨 OO课程大总结相关推荐

  1. 【面向对象】第四单元UML总结及面向对象课程学期总结

    目录 一.第四单元的架构设计 第一次UML作业 第二次UML作业 二.四个单元中架构设计及OO方法理解的演进 三.四个单元中测试理解与实践的演进 四.总结自己的课程收获 五.对面向对象课程的建议 一. ...

  2. OO第四单元小结暨2019春季学期OO课程总结

    OO第四单元小结暨2019春季学期OO课程总结 目录: OO第四单元总结 一.总结本单元两次作业的架构设计 第一次作业 第二次作业 学期最终总结 二.四个单元中架构设计及OO方法理解 2.1 第一单元 ...

  3. 【OO学习】OO第四单元作业总结及OO课程总结

    [OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...

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

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

  5. OO第四单元博客作业

    一.UML作业架构设计 1.第一次作业 其中 Main 是入口类,MyUmlinteraction实现了接口,UmlInteractionBase为MyUmlinteraction实现提供了底层功能, ...

  6. OO第四单元作业小结

    一.本单元两次作业的架构设计 1.第一次作业 整体思路:以class为核心,建立MyInterface.MyAttribute.MyOperation.MyAssociation四个类分别储存每个类的 ...

  7. OO第四单元作业总结

    第四次博客作业 本单元架构设计 第一次作业 在自己尝试画了第一次作业的类图后,发现自己作业的架构依旧混乱不堪.第一次作业中,我总共建了四个类,除去MyUmlInteraction类外,ClassRel ...

  8. 浏览器工作原理(四):HTML解析器 HTML Parser

    HTML解析器的工作是将html标识解析为解析树. HTML文法定义(The HTML grammar definition) W3C组织制定规范定义了HTML的词汇表和语法. 非上下文无关文法(No ...

  9. 面向对象第四单元小结

    面向对象第四单元:UML类图.顺序图.状态图 一.架构设计 第一次作业      第四单元第一次作业,需要完成的任务为实现一个UML类图解析器UmlInteraction,学习目标为UML入门级的理解 ...

最新文章

  1. seq2seq(1)- EncoderDecoder架构
  2. Python - 在CentOS7.5系统中安装Python3
  3. linux系统管理及vim
  4. Windows 8各个版本的功能详解与对比【中文详表】
  5. 关于“ModuleNotFoundError: No module named ‘flask._compat‘”的解决
  6. php reset input,PHP reset() 函数
  7. C语言 | 基于MPU605(六轴传感器)的I2C实现LCD1602显示(代码类)
  8. 古风登陆html,再祭古风扬 文/凌霄一羽
  9. Java中new function另外新建个文件的写法
  10. 【转】什么是 Azure 资源管理器
  11. 计算机里的文件丢失6,丢失的文件怎么恢复?腾讯电脑管家恢复电脑丢失文件的方法介绍...
  12. ubuntu下装java
  13. 广和通再推5G利器,发布高性价比5G模组FM650
  14. MFC Radio Button笔记
  15. Django扩展 —— uwsgi+nginx部署
  16. 概率论经典问题 —— 三个事件 A、B、C 独立 ≠ 三个事件两两独立
  17. php机械相关毕业设计,PHP+MySQL毕业设计选题管理系统(含论文)
  18. Android SDK Permission大全访问权限
  19. PMP培训内容有哪些?都要仔细看!
  20. html自动选择省市,jQuery中国省市区地址三级联动插件Distpicker

热门文章

  1. 数组的合并和升序排列_leetcode 33 搜索旋转排序数组
  2. PyTorch的nn.Linear()详解
  3. oracle数据库延迟执行,如何诊断oracle数据库运行缓慢或hang住的问题
  4. python中split函数_python strip()函数和Split函数的用法总结
  5. React中的组件通信——父传子、子传父、Context
  6. LeetCode 2022春季赛 2. 烹饪料理(状态枚举)
  7. LeetCode 2085. 统计出现过一次的公共字符串(哈希)
  8. LeetCode 1676. 二叉树的最近公共祖先 IV
  9. LeetCode 491. 递增子序列(回溯+判重剪枝)
  10. 回溯算法(Backtracking Algorithm)之八皇后问题