热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BUAAOOUnit

BUAA-OO-Unit4-Summary一、第四单元作业架构设计综述本单元作业要求实现对UML图的解析,处理输入的各个UMLElement,形成对应的关系结构,实现信息的查询。本

文章目录[隐藏]

  • BUAA-OO-Unit 4-Summary
    • 一、第四单元作业架构设计
      • 综述
      • 架构设计
        • UML图
        • 核心思路
    • 二、架构设计思维以及OO方法理解的演进
      • 第一单元
      • 第二单元
      • 第三单元
      • 第四单元
    • 三、测试理解与实践的演进
      • 第一单元
      • 第二单元
      • 第三单元
      • 第四单元
    • 四、建议
    • 五、课程收获


BUAA-OO-Unit 4-Summary

一、第四单元作业架构设计

  • 综述

    本单元作业要求实现对UML图的解析,处理输入的各个UMLElement,形成对应的关系结构,实现信息的查询。本单元主要考察的是对UML图的认识,同时我个人认为在第三单元的基础上加深了对规格化编程的训练,只不过把JML改成了介绍文档里的语言。相比第三单元,第四单元减少了对算法的要求,但是我个人感觉难度更大,因为需要考虑的条件非常的繁多复杂,对架构也有了更高的要求。

  • 架构设计

    • UML图

      BUAA-OO-Unit 4-Summary

    • 核心思路

      为了方便设计,并防止不同UML图元素相互干涉造成不必要的麻烦,我开设了四个不同的类分别对elements进行解析处理。

      ClassStorageSequenceStorageStateMachineStorage分别用于对类图、顺序图、状态图相关元素进行解析、处理、存储。第三次作业中引入CheckRule类对所有检查指令中需要用到的元素进行处理。

      MyImplementation类通过调用以上四个类中存储的元素进行具体的指令实现。

      同时,对诸如UMLClassUMLInterface之类的元素,需要实现比较复杂的操作,因此重新构建了MyClassMyInterface类,从而实现复杂的功能。

      对于同类元素的存储,采取HashMap容器,降低查找的时间复杂度。

二、架构设计思维以及OO方法理解的演进

  • 第一单元

    作为从Pre才开始接触Java且不具备任何面向对象基础知识的小白,我只会按照以前写C语言的方法面向过程编程,也没有好好设计自己的架构,花费了大量的时间,干的却是走一步看一步的活,最终得分也是非常的惨烈。

    尽管如此,我还是通过三次作业逐渐体会到了面向对象思想的精髓之处,并尝试在自己的设计中运用。

  • 第二单元

    在第一单元的最后一次作业之后,我对Java的运用算是比较熟悉了,面向对象的思想也吸收的还可以。于是我在第二单元投入了大量的精力到架构的设计中,确立了输入请求-请求调度-处理请求这样清晰的层次结构,代码具备了相当不错的解耦性。

    尽管我依然在测试中出现了线程安全的问题,但是由于架构的合理,只需要修改细节即可。最终我在三次作业中没有进行一次重构,测试得分也还过得去。

    第二单元中,主要的收获就是生产者消费者模型的掌握以及对锁与调度的理解。也是在这个单元我觉得我的面向对象能力有了飞跃。

  • 第三单元

    经历了高难度的一二单元洗礼,第三单元完成起来就比较游刃有余了。架构方面由于官方包已经给出,并不需要自己思考太多,但是出于兴趣阅读了官方包代码之后,发现其设计非常精妙、合理,不得不感叹自己依然有很多需要学习。因此也算是吸收了一些优秀架构的优点。

    这一单元,开始思考代码规格化的意义,如何通过契约式编程来提高工程的严谨性,这对于未来的开发工作是很有裨益的。

  • 第四单元

    本单元的任务分层比较简单,即解析元素、存储元素、处理元素,因此架构设计上难度不大,自己比较出彩的地方就是早早对各种图、各种元素做了分类处理吧,这既避免了CheckStyle的制裁,也能防止太多元素种类互相影响的问题出现,对于本单元这种信息繁多的情况,这样设计是利于开发的。

    本单元一方面对于UML图有了更深的掌握,最重要的还是进一步体会了层次化设计的思想。

三、测试理解与实践的演进

  • 第一单元

    本单元由于刚接触oo,为完成作业而焦头烂额,没有很细致地构造数据,但是依靠构造随机数据就能取得不错的效果。

  • 第二单元

    ​ 本单元主要还是根据自己本地测试中出现的bug来构造hack数据。结果表明这样的测试方法还是比较有效的,因为诸如轮询、死锁等问题是比较普遍的。与第一单元相比,随机数据的hack成功率大大降低白盒测试或是根据已有bug测试在本单元中是更优的方法。

  • 第三单元

    JML为代码提供了严格的约束,通过仔细阅读JML可以找到许多边界条件以及容易疏忽的细节进行数据构造。

    同时,JML便于观测方法的复杂度,从而可以构造极限数据进行测试,方便进行优化。

    相比第二单元,随机数据又变得有效了起来,但是这会导致无法找出bug具体是在哪里出现。因此单元测试是十分有效且必要的,从JML约束的规格出发,对所有作业中涉及的指令进行全覆盖测试,从而更精准的定位bug。

  • 第四单元

    由于第四单元基本上和考期重合,加上本单元自动化生成数据需要兼顾随机性与强度,比较繁琐,因此没有太认真的构造测试数据,就对于某些特定指令进行手搓数据加以比较浅明的验证。

四、建议

  • 有不少同学在课程之前没有接触过Java,建议在Pre中增加Java的教程。具体重点我认为有:基础语法介绍,容器(包括HashMap、Array List、HashSet、TreeSet等等)的使用。

  • 第一单元的难度相比Pre有着非常巨大的飞跃,尽管课程组已经采取了预解析与正常作业两种选择,来给同学们一些缓冲,但是实际上预解析相当于直接把很关键的表达式解析给砍掉了,差别实在太大。

    前一次采取预解析的同学如果想在下一次换为一般解析模式,需要巨量的时间成本,甚至不一定完成得了。而如果三次作业都采取预解析的话,我认为获得的锻炼量是不够的,并没有接触到面向对象的核心

    因此,我建议在Pre中加入递归下降的教程,酌情考虑取消预解析模式,同时将第一次作业的完成时间延长至两周

  • 第三单元以JML为核心,但三次作业主要的难点还是在图论算法,两者不相匹配。相比之下,第四单元我认为更加合理,核心是UML,那就把难点放在对UML元素的理解上,不会有违和感。因此可以酌情减少第三单元对算法的考察,而将根据JML进行单元测试的部分内容作为考察内容。

  • 目前的中测与强测强度差距过大,一个漏洞百出的程序都能通过中测,尽管这样能降低有效作业的门槛,也能鼓励同学们更多地进行本地测试,但是中测过于简单我认为并不利于同学们好好完善自己的作业。希望课程组能加强中测强度

  • 希望能实时公布课上实验成绩。

五、课程收获

  • 掌握了Java这门语言,Java真好用 :)
  • 掌握了面向对象的思想,颠覆了我对编程的认识。
  • 掌握了线程安全、生产者消费者模型、JML规格化语言、UML图等知识。
  • 提升了构造数据的能力。
  • 代码能力有了很大的提升。
  • 结课之后看这一学期的历程,巨大的成就感。

希望在之后的代码开发中,能够好好运用自己在OO这门课中收获的知识;也希望自己能在未来的学习中,不要忘记自己是在大二下那一个个挑灯的夜晚,不惧困难,直面挑战。


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • c语言基础编写,c语言 基础
    本文目录一览:1、C语言如何编写?2、如何编写 ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
author-avatar
有些事想不到
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有