第四单元架构设计

第四单元要完成的是对给定UML元素的建模/统计/分析,考虑到UML元素的组织是树状的,很容易想到基于树状的数据结构完成

由于UML元素已经由官方接口给出,因此结点类采用wrapper的形式简化设计。建图的过程为:

  1. 根据不同元素type选用不同的wrapper生成对应结点。其实这里类似一个工厂(但是使用工厂的动机不够强烈,因此未采纳
  2. 将生成的结点放入对应的结点池中
  3. 考虑到UML图已经固定,没有可预见的动态变更图结构的需求,采用强制离线的方式建图:在所有结点生成完毕后,按拓扑序将结点依次从结点池中取出,完成其向父结点的挂载(mount)过程。4. 为了方便实现中间结果缓存,在父结点完成挂载后显示地调用setImmutable将其标注为不可变对象,允许保存查询缓存

除此以外,实验性质地尝试封装了一个可以按type对node进行查询的QueryableNodeList类,效果没有达到预期

第二次的三条check全部使用checker类完成,单独根据类与接口的实现/继承关系建立一个有向图并在图上完成相关检测

这次的架构有些over designed,第一次作业对第二次作业的需求迭代方向并没有把控好,好在并没有失控

学期回顾与课程建议

这学期的四次作业下来收获还是蛮多的,在几个不同的场景中深刻审视、理解了一些经典的oo思想,也在实战中尝试实现了一些之前没有机会使用的design pattern,同时也不乏一些自己的实验性质的探索与尝试。总的来说,无论是架构观点还是工程能力,在这学期中都得到了相当程度的锻炼。

对oo特别是java风格的oo的理解更深了。在形式上我们可以简单地说,oo是【继承·多态·封装】,但是实际上这并不能很好地总结oo究竟是什么:js原型链也是一种形式的代码复用,各种追求优雅的语言的闭包特性也可以很好地隐藏实现细节,它们又不是我们所理解的classic oo。smalltalk的oo是纯粹的对象与消息机制,c++的oo是对其他编程风格与特性的补充与完善,swift的oo是面向协议而非面向接口的,而python的oo大有元编程的意味……一千种语言,一千种oo,我们在训练中所熟知的java的oo不过是oo的一种理解角度。所以很难一概而论地说什么才是绝对的oo。所以在这个层面的理解上,我们的探索不仅没有结束,才刚刚开始。

即便如此,无论是广义的还是狭义的,这学期在oo这方面的理解与实践也足够回顾品味了。从最基本的语法特性,到常见的设计模式,到java并发编程,每次作业都是一次全新的工程体验。我们在一次一次的迭代中,在工程这个角度触摸到了oop的初衷:高度复用、易维护、易扩展、人类友好、清晰的架构……

我认为oo课目前最大的好处就是,在压力适度的同时,给我们提供了一个自由探索与试错的机会。同样的一个task,用很直线的方式可以实现,用高度设计的架构也可以实现,哪个实现好,哪个实现不好,在迭代的时候自然就能感受到——欠设计会导致经常性的重构,过设计又会在维护时明显地感到重力——这些都是难得的经验积累的过程。编程的哲学是实用主义哲学与经验主义哲学,因此这些训练对我而言是很有用处的。

在这个基础上,我个人对课程设计有如下几点建议:

  1. 适当调整难度曲线。比如第一单元在要求熟练掌握正则表达式的同时迅速展开针对oo特性的训练,体验比较陡峭
  2. 适当调整部分测试数据集,比如电梯第二次作业的构造数据比例远大于随机数据,这导致对一些算法的性能评估出现较大偏差
  3. 希望能适当增加并发编程的比重,因为这一部分个人认为在生成中相对更重要,而目前的训练对并发安全性、并发性能的涉及程度较轻

白驹过隙,一个学期转瞬即逝。愿来年此时再回首,且听风吟且把酒。

BUAAOO第四单元总结与学期回顾的更多相关文章

  1. 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾

    「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 目录 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 Part 0 第四单元作业架构设计 架构设计概要 AppRun ...

  2. 返璞归真——OO第四单元总结暨学期总结

    本次作业是第四单元的最后一次作业,也是本学期面向对象的最后一次作业,在此我将分别对第四单元和整个学期进行总结. 一.本单元的两次作业 第四单元的作业是关于UML的一些处理.UML语言是一种区别于具体语 ...

  3. OO第四单元总结及学期总结

    目录 OO第四单元总结及学期总结 第四单元三次作业架构设计 第十三次作业 第十四次作业 第十五次作业 四个单元中架构设计及OO方法理解的演进 第一单元 第二单元 第三单元 第四单元 四个单元中测试理解 ...

  4. OO第四单元总结暨学期总结

    一.第四单元作业架构设计 我们第四单元围绕UML图展开,在第四单元开始之前,本来以为我们的工作是学习如何使用UML工具,开始后才意识到我们要做的是解析UML类图.顺序图和状态图.当然,让我们解析的只是 ...

  5. OO第四单元总结 and 学期总结

    第四次单元总结 本单元架构设计总结 第一次作业:类图解析 本次作业仅仅需要实现官方的UmlInteraction接口,通过反射机制在Runner中实例化一个我们实现的类,来进行类图元素的分类解析,从而 ...

  6. BUAAOO第四单元总结

    ---恢复内容开始--- 一.本单元两次作业的架构设计 第十三次作业:本次作业我创建了四个类,除去官方提供的Main和MyUmlInteraction类之外,还有Uclass和Ulinterface分 ...

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

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

  8. oo第四单元总结及总课程回顾

    一.第四单元架构设计 1.第一次作业 第一次作业要求实现的只有对类图的分析.为了直观地搭建出一个类图,我新建了Manager类来处理UmlElement以及搭建树.但由于未能做好时间管理,因此第一次作 ...

  9. 北航OO(2020)第四单元博客作业暨学期总结

    一.第四单元架构设计 1.第一次作业 我在本次作业中设置了多个储存结构:Directory,ElementsInName,ElementsInId,Cache. Directory: 顾名思义,这是个 ...

随机推荐

  1. java例题_40 字母字符串转数组后排序

    1 /*40 [程序 40 字符串排序] 输入一个字符串数组,按照字母表的降序对这些字符串进行排序. 2 题目:字符串排序. 3 */ 4 5 /*分析 6 * 1.从键盘得到一个纯字母的字符串 7 ...

  2. Android 学习之活动的生命周期

    •返回栈 Android 中的活动是可以叠层的: 我们每启动一个新的活动,就会覆盖在原活动之上: 然后点击 Back 键会销毁最上面的活动,下面一个活动就会重新显示出来: 其实 Android 是使用 ...

  3. [树形DP]电子眼

    电 子 眼 电子眼 电子眼 题目描述 中山市石一个环境优美.气候宜人的小城市.因为城市的交通并不繁忙,市内的道路网很稀疏.准确地说,中山市有N-1条马路和N个路口,每条马路连接两个路口,每两个路口之间 ...

  4. Windows Service 2016 Datacenter\Stand\Embedded激活方法

    安装好系统后连入互联网之后使用管理员身份打开命令行 输入命令 slmgr /skms kms.03k.org 弹出窗口提示模式修改成功后再输入命令:slmgr /ato 以下为各个版本的key 版本: ...

  5. @babel/preset-env使用polyfill遇到的坑

    场景还原 最近将一个项目由babel@6升级到babel@7,升级后最重要的两个包: @babel/preset-env: 提供代码的转换和API的polyfill的能力 @babel/plugin- ...

  6. 2-69.x的平方根

    题目描述: 解题思路: 计算平方根可以依次通过自然数递增,来判断两者相乘是否为目标值,是一个有序的序列,因此考虑使用二分查找. 由于x=0和1时,就是其本身,单独拿出来.当x>1时,其平方根一定 ...

  7. 【运维】Shell -- 快速上手Shell脚本

    1.Shell概述 shell脚本是利用shell的功能所写的一个[程序(program)].这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式.管道命令与数 ...

  8. UT之最后一测

    经过前面几次文章的分享的UT的相关知识,今天接着分享UT相关最后一测文章,希望对大家在UT的学习中有一点点的帮助. Spring集成测试 有时候我们需要在跑起来的Spring环境中验证,Spring ...

  9. spring boot 通过feign调用api接口

    目的:远程调用服务器api,直接上步骤: 1,添加maven依赖,这是必须的: <dependency> <groupId>org.springframework.cloud& ...

  10. 如何高效的遍历Map?你常用的不一定是最快的

    微信公众号:大黄奔跑 关注我,可了解更多有趣的面试相关问题. 写在之前 如文章标题所言,遍历Map是开发过程中比较常见的行为,实现的方式也有多种方式,本文带领大家一起看看更加高效的遍历 Map. 『茴 ...