第四单元博客

这个单元的作业,emmmm助教们做的工作还是一如既往的多,我们只负责添一添代码,最后一次作业了,感谢各位助教和老师,同时也希望我能顺利通过这最后一关。

架构设计

第一次作业架构展示

第一次作业需要实现10个命令,需要熟悉staruml的文件格式,同时还需要区分类与接口,理解继承与实现的不同。
本次作业的实现用了5个类:

  • MyUml类,用于实现类和接口的相同行为
  • MyUmlClass类,用于实现类相关命令,是MyUml的子类
  • MyUmlInterface类,用于实现接口相关的命令,也是MyUml的子类
  • MyUmlOperation类,用于实现类中操作相关的命令
  • 最后就是需要实现的MyUmlGeneralInteraction类

第一次作业实现分析

这次作业的命令实现起来都不困难,主要还是对命令的含义理解透彻以及把可能的情况考虑全,容易出现错误的地方有:

  • 没有考虑到接口可以多继承。接口与类不同,接口可以多继承而一个类的父类只有一个
  • 关联端的id和reference要区分清楚,reference才是表示这个端所代指的类或接口
  • 在Generalization元素出现时,其中包含的父类的元素可能还没有出现, 所以需要注意读取元素时先读取类和接口的定义,然后再读取其他元素保证id总是可以索引到正确的类或接口
  • 在进行宽度优先搜索时,注意标志位清空o(╥﹏╥)o...

在实现时,Map数据结构起到了很大的帮助,所以要善用这个数据结构实现id到类和接口的快速索引。

第二次作业架构展示

与第一次作业相比,第二次作业的难度就大大降低了,这少不了助教团队和老师对大家的仁慈...这里再一次感谢助教和老师们。

第二次作业相比第一次作业增加了四个类。

  • MyUmlInteraction,记录interaction的相关信息
  • MyUmlLife,记录lifeline的信息
  • MyUmlMachine,记录状态机的信息
  • MyUmlState,记录状态的信息

因为第二次作业在助教团队的宽宏大量下难度大大降低,所以对于状态图和顺序图的命令的实现,这里不再赘述,重点讲一讲三个规则检查的实现。

  • 规则1:类的属性中不能有重名,类的属性和类的对端名称也不能重

    • 这个相比其他两个规则很好实现,只需要使用set记录即可
  • 规则2:不能循环继承
    • 这里一开始理解出错了,把实现也加了进来,在讨论区看到老师的回答才改过来,所以要区分号实现和继承这两个不同的关系。而环的检测算法就很简单了,深搜后发现有回向边即可。
  • 规则3:不能重复继承
    • 这里和规则2不一样,这里需要考虑类对接口的实现。而重复继承的检测算法只能适用深搜,在回溯时检查有没有重复继承,不知道有没有更好的办法。

OO理解方法演进

经过这四次作业, 对于OO的理解越来越深:

  • 第一次作业因为对java语言的掌握还不够熟练所以没有顾上管OO...只想着把功能实现对了就好,而且当时时间也很仓促没有好好写代码,只有在之后几次作业中,才在慢慢的重构中逐渐理解OO
  • 到了第二单元,需要实现多线程,还好之前的经验让我对多线程掌握了一点皮毛,可是这个单元在使用多线程时还是漏洞百出,比如锁的错误使用和信号量的错误使用,但是经过不断的重构,也慢慢的体会到了面向对象的一点皮毛
  • 在第三单元写JML时,我理解了为什么程序要先确定好规格再动手写代码,理解了设计比实现更重要这个道理。

测试理解与实践的演进

  • 一开始只会用IDE自带的console进行交互测试,在测试时也只是自己拍脑袋想测试样例,覆盖度和完备性完全不足
  • 然后学会了使用JUNIT,真的好用

课程收获与感悟

  1. 相对于助教和老师们的工作,我们做的真的很少了
  2. 对java语言掌握更熟练,对多线程掌握更熟练
  3. 学会了软件测试的方法
  4. 对设计模式有了一定的了解
  5. 对UML的类图,状态图和顺序图有了更深的理解

课程建议

  • 怎么说呢,自然语言不像机器语言,表达的准确性还不够,指导书上一些规定的叙述还不够完善。不过已经很好了。
  • 给我们的工作量再大一些(反正我也不用继续写OO了哈哈),主要是感觉助教们做的工作好多,把格式检查这些都做了。
  • 可惜目前还没有一个准确的量化的判别标准用于判断代码是否符合面向对象的特性和风格,所以在互测时或许可以在准确性的基础上,增加对代码是否足够OO的检查

最后再一次感谢老师,感谢助教团队。

OO第四单元博客的更多相关文章

  1. OO第四单元博客作业

    OO第四单元博客作业 BUAA_1706_HugeGun 目录 第四单元作业架构设计 四个单元架构设计及OO方法理解 四个单元测试理解与实践演进 课程收获 一点建议 第四单元作业架构设计 ### 第十 ...

  2. 第四单元博客总结——暨OO课程总结

    第四单元博客总结--暨OO课程总结 第四单元架构设计 第一次UML作业 简单陈述 第一次作业较为简单,只需要实现查询功能,并在查询的同时考虑到性能问题,即我简单的将每一次查询的结果以及递归的上层结果都 ...

  3. OO第四次博客作业!

    oo第四次博客作业 一.测试与正确性论证比较 测试只是单方面片面的证明对于当前的输入程序是正确的,测试只能证明程序有错误,不能说明程序是对的. 正确性论证是程序达到预期目的的一般性陈述,是通过规范化的 ...

  4. OO第四次博客作业(第四单元作业及期末总结)

    (注意:本文写作顺序与作业要求不完全一致,但涵盖了作业的所有要求) 一学期的BUAA特色OO课程结束了. PART 1  我想先写我这一学期的感想 从第一单元满怀期待地写完多项式求值到最后看着60分不 ...

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

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

  6. OO第四次博客作业--第四单元总结及课程总结

    一.总结第四单元两次作业的架构设计 1.1 第一次作业 类图如下: 为了突出类.接口.方法.属性.和参数之间的层次结构关系,我为 Class 和 Interface 和 Operation 分别建立了 ...

  7. oo第四篇博客作业

    测试与正确性论证的效果差异及各自的优缺点: 测试针对一些典型的输入情况进行方法验证,可操作性更强,结果直观.但不能完全覆盖所有的输入情况. 正确性论证则是根据代码逻辑从所有的方面对方法进行论证,可操作 ...

  8. 迎来OO的曙光,总结规格的意义——OO第四次博客总结

    一切都要结束了,砥砺前行~ 一.测试与正确性论证的效果差异 测试,顾名思义就是我们暴力用大量数据轰炸编写的程序的过程.日常的OO过程中,我们经常互相寻求“测试集”,正是因为测试使用特定数据对我们的功能 ...

  9. 2019年北航OO第四次博客总结<完结撒花>

    一.UML单元架构设计 1. 类图解析器架构设计 1.1 UML类图 这次作业的目标是要解析一个UML类图,首先为了解耦,我新建了一个类UmTree进行解析工作,而Interaction类仅仅作为实现 ...

随机推荐

  1. c# ExpandoObject动态扩展对象

    js中的Object 对象. php中的stdClass. c# 也有动态可扩展对象 ExpandoObject,需要添加System.Dynamic引用 用法: dynamic model = ne ...

  2. Spring的配置及jar包下载

    一.相关说明 IOC: Inversion of Control,控制反转,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency In ...

  3. 多线程----Thread类,Runnable接口,线程池,Callable接口,线程安全

    1概念 1.1进程 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 任务管理器中: 1.2线程 线程是进程中的一个执行单元 ...

  4. vue-cli3项目优化首页加载过慢的一些心得

    博主最近发现vue-cli3项目做完后,点击首页加载时间好久啊,一般都要3-5s.这样的加载时间博主自己都受不了,所以就有了这个随笔,将自己的一些研究心得分享给大家. 首先推荐大家下载一个webpac ...

  5. Linux下安装并配置SSH服务

    一.使用命令检测Linux系统上是否已经安装了SSH服务:(命令:rpm -qa |grep ssh) 二.如果没有安装SSH软件包,可以通过yum 或rpm安装包进行安装(命令:yum instal ...

  6. 分享eclipse自动生成java注释方法

    设置方法介绍: eclipse中:Windows->Preferences->Java->Code Style->Code Template->Comments,然后对应 ...

  7. Redis相关注意事项

    本文介绍了五个使用Redis使用时的注意事项.如果你在使用或者考虑使用Redis,你可以学习一下下面的一些建议,避免遇到以下提到的问题. 一.配置相关注意事项 1.涉及到内存的单位注意添加 b 1k ...

  8. Android(java)学习笔记126:判断SD卡状态和SD卡容量

    1. 判断SD卡状态和SD卡存储空间大小 当我们在使用SD卡时候,如果我们想往SD卡里读写数据,我们必须在这之前进行一个逻辑判断,那就是判断SD卡状态和SD存储空间大小: 核心代码: String s ...

  9. Python-OpenCV中的resize()函数

    改变图像大小意味着改变尺寸,无论是单独的高或宽,还是两者.也可以按比例调整图像大小. 这里将介绍resize()函数的语法及实例. 语法 函数原型 cv2.resize(src, dsize[, ds ...

  10. python_100_静态方法

    class Dog(object): def __init__(self,name): self.name=name @staticmethod#实际上跟类没什么关系了 def eat():#def ...