一、第四单元架构设计

1.第一次作业

我在本次作业中设置了多个储存结构:Directory,ElementsInName,ElementsInId,Cache。

Directory: 顾名思义,这是个目录结构,可以通过一个UmlElement的id来获得他的子元素(储存结构上的子元素)。之所以设置这个结构是因为这个结构是UML中最基本的组织结构,通过UmlElement的一些属性可以快速的建立起来。

ElementsInName: 在这个结构中,可以通过一个元素的名字,获取所有同名的元素。设置这个结构的原因是由于第一次作业中多个查询语句都使用了元素名字来进行查询。

ElementsInId:在这个结构中,可以通过一个id来获取该id对应的UmlElement。设置这个的结构是因为1.id是一个UmlElement独一无二的标识。2.id在很多元素(UmlElement)的属性中充当其他元素的引用。

Cache:用来存储一些查询结果,以优化之后的使用。存储的结果具有以下特征:1.完全从头开始查询需要较大的开销,比如图搜索。2.查询的结果可能再之后被用到,比如查询类的属性中一个父类查询到的属性可以被他子类再利用。

2.第二次作业

为了在第一次作业的基础上直接扩展,为每个图的解析实现了一个类:MyUmlClassModelInteraction,MyUmlCollaborationInteraction,MyUmlStateChartInteraction。

设置公共的储存结构Directory,ElementsInName,ElementsInId用来给解析类提供查询方法。同时为每个类实现专门的Cache来保存对应类查询过程中产生的可缓存数据。

3.第三次作业

在第一次、第二次作业的基础上,大部分检查都不是特别复杂。主要的工作量在于R002-R004。

R002: 使用tarjan算法得到双连通分量,如果存在多顶点的双连通分量,以及单顶点但有自继承的双连通分量,则存在循环继承。

R003、R004: 每次从入度为0的根节点开始bfs,每次搜索过程中,被重复访问到的顶点即存在重复继承或是重复实现问题。

二、架构及OO方法演进

1.第一单元

第一单元是表达式相关。这一单元给我留下较多印象的就是对正则表达式的使用,正则表达式在其中主要起到了两方面作用:1. 通过正则表达式匹配来检查输入的表达式是否符合我们的要求。2. 通过正则表达式来提取表达式中的不同部分以供处理。对于提取出的不同部分,抽象为不同对象来分别处理,算是面向对象的第一次尝试。

2.第二单元

第二单元是多线程相关。这单元告诉了我什么叫架构的重要性,由于从始至终控制器都设置为了单独的线程以及一些其他的原因,导致总是有一些场景有复杂的多线程冲突问题,较大的增加了当时的工作量,同时也限制了控制策略的发展导致这一单元完成起来不是特别轻松。但在本单元中还是初步了解多线程的相关知识以及经典的生产者消费者模型。

3.第三单元

第三单元是JML相关。重点学习了规格化设计思想(官话)。简单来说就是对着JML写自己的代码,由于各个方法的规格都已经有所限制,所以在自己的水平之内也想不到别的架构以及面向对象相关的内容。

4.第四单元

第四单元是UML相关。总体还是在UML的理解上,就我自己来说这一单元倒是更接近面向过程了,除了几个储存结构,其他时候大致都是再思考如何实现工能,特别是第三次作业,更有点像是算法训练了。

总体来看,非要说自己的OO方法在几个单元的作业中不断演进有点不太现实。只能说在几个单元中分别从不同方向上初步了解了面向对象的思想,对面向对象有了一个大致轮廓上的了解。

三、测试理解与的演进

惭愧的说,自己在测试方面的精力花费可以说是少之又少,从第一单元到第四单元,每次都只是写完代码后就几个点进行完一般的测试就过了,大部分时间都把测试的关键部分交给了和同学的自动对拍来完成(在此谢谢各位大佬)。但这种做法可以说是很不推崇了(但自己还是由于怠惰而选了这么干),偷懒往往只能使麻烦事晚点到来,所以还是希望自己以后能突破自己的怠惰吧(虽然很难)。

四、课程收获

从大的角度来说,学习了java,了解了面向对象,提高了自己的编程能力。从小的来说,这种每周来一份作业且每份作业都需要较多精力的模式也锻炼了自己,培养了自己先思考架构再开始写代码的习惯。同时在平时与同学探讨问题以及在研讨课上听大佬分享都在一定程度上扩展了自己的知识面。

五、改进建议

1. 首先是课程作业与上课内容的联系。总说OO这门课好,但我认为是好在围绕着作业所构建起来的一整套体系,让我去回忆这学期学到什么时,我也只是记住作业相关内容以及在作业驱动下所学习到的知识。也就是说,我所认识到的OO这门课的优势在于每周一次的作业。而在这种以作业为中心的体系下,上课的内容却总是很少能和作业产生联动,不免会使得上课的内容被边缘化了,所以我认为是否能在上课内容上做出一些改变,增加其与作业的关联性。

2. 关与JML这一单元,一开始的想法很美好,希望在学习JML的过程中,通过利用JML相关工具链来提高效率。但最后只能说效果很差,在几个工具的配置上都没能得到很好的效果还浪费了较多时间。所以是否可以对工具链这一部分多做些介绍或是提供几个较为可行的方法来提高同学们对这一单元的总体感受。

3. 关与UML部分,实验课会专门要求对关联、依赖、组合、聚合进行区分,但课程组对这部分的介绍又难以帮助我对他们进行细致的区分,所以以后是否能在这方面进行更细致的区分。

六、线上学习体会

与其他课程相比,我认为面向对象课程是受线上教学影响最小的学科了,因为就像我上面说的,我认为本身课程的核心就不是上课内容而是每周一次的作业以及围绕作业所构造的一套体系,而围绕着作业的这套体系似乎不管是线上教学还是线下教学效果都差不多,受影响较大的研讨课部分也被腾讯会议给很好的弥补了。所以总的来说面向对象的线上教学体验还是很不错的,可以称得上本学期给我感受最好的课了。

最后也希望面向对象的课程组以后能发展的越来越好。

北航OO(2020)第四单元博客作业暨学期总结的更多相关文章

  1. 北航OO(2020)第三单元博客作业

    一.JML理论基础及相关工具链 1.JML理论基础 该部分梳理本单元作业中涉及到的JML知识. 1.1注释结构 JML采用javadoc注释的方式来表示规格,且每行以@开头.通过使用//@annota ...

  2. OO第四单元博客作业

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

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

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

  4. oo第四次博客-UML暨学期总结

    一. 本单元两次作业架构设计 这两次作业实际上难度不大,不存在算法上的难题,大部分时间都是用在处理UML图中各个元素的关系上. 第一次UML主要处理UML类图.有UMLclass,UMLinterfa ...

  5. OO第四单元博客

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

  6. OO第四次博客作业!

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

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

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

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

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

  9. C语言I博客作业12—学期总结

    一.我学到的内容 二.我的收获(包括我完成的所有作业的链接+收获)不能只有作业链接,没有收获 作业次数 作业链接 第一次 C语言I博客作业01 第二次 C语言I博客作业02 第三次 C语言I博客作业0 ...

随机推荐

  1. Qt添加注释模板

    背景 软件:Qt Creator 在写代码的时候我们为了规范化,一般会加文件注释.类注释和函数注释 用注释来说明我们的代码,也方便模块化开发 那么我们在写注释的时候经常会写一些重复的内容,我们会复制粘 ...

  2. 【java框架】SpringBoot(4)--SpringBoot实现异步、邮件、定时任务

    1.SpringBoot整合任务机制 1.1.SpringBoot实现异步方法 日常开发中涉及很多界面与后端的交互响应,都不是同步的,基于SpringBoot为我们提供了注解方式实现异步方法.使得前端 ...

  3. vue项目中,更改数组元素的值,视图没有实时更新?

    问题背景: export default { data(){ showItems: [false, false, false, false] }, methods: { showItem(index) ...

  4. Recoil 的使用

    通过简单的计数器应用来展示其使用.先来看没有 Recoil 时如何实现. 首先创建示例项目 $ yarn create react-app recoil-app --template typescri ...

  5. springcloud面试题【第一期】

    全文目录 1:谈一谈你对微服务的理解? 2:微服务之间是如何独立进行通讯的? 3:springcloud和dubbo有哪些区别? 4:springboot和spring cloud得区别? 5:Eur ...

  6. 并发编程-线程池&J.U.C

    8. 共享模型之工具 8.1 线程池 池化技术相比大家已经屡见不鲜了,线程池.数据库连接池.Http 连接池等等都是对这个思想的应用.池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率 ...

  7. lvs 负载均衡 _DR模式 _Python脚本

    import paramiko vip='192.168.83.6' # 虚拟IP # direct_server_information ds_info={ 'ip':'192.168.83.5', ...

  8. [高清文字版]R语言实战(可复制文字PDF)

    电子书资源:R语言实战 书籍简介   <R语言实战>从解决实际问题入手,尽量跳脱统计学的理论阐述来讨论R语言及其应用,讲解清晰透澈,极具实用性.作者不仅高度概括了R语言的强大功能.展示了各 ...

  9. .NET6 平台系列4 .NET开源之路

    系列目录     [已更新最新开发文章,点击查看详细] .NET平台是微软于2000年推出的Windows操作系统的应用软件开发框架,发展至今形成巨大的技术栈,涉及多语言(支持C#.F#.VB.NET ...

  10. 《疯狂Kotlin讲义》读书笔记6——函数和Lambda表达式

    函数和Lambda表达式 Kotlin融合了面向过程语言和面向对象语言的特征,相比于Java,它增加了对函数式编程的支持,支持定义函数.调用函数.相比于C语言,Kotlin支持局部函数(Lambda表 ...