BUAAOOUnit4总结分析以及OO学期总结

OOUnit4总结分析以及课程总结

目录
  • OOUnit4总结分析以及课程总结
    • Unit4作业总结分析
      • Task1
      • Task2
      • Task3
    • 对架构设计及OO方法理解的演进
    • 对测试理解与实践的演进
    • 课程收获
    • 个人建议
    • 线上学习OO体会

Unit4作业总结分析

Task1

本次作业,需要完成的任务为实现一个UML类图分析器UmlInteraction,学习目标为UML入门级的理解、UML类图的构成要素及其解析方法。

该部分内容较为简单,按照指导书要求实现UmlInteraction接口即可。为了对输入的元素进行管理,我在实现接口的MyUmlInteraction类中创建了一个私有类NewUmlElement,使用该类对所有输入的元素和其对应的不同种类的儿子们进行封装,这样就可以充分利用UML图的树形结构管理相关元素,为了节省空间,在存储时只存储相关元素的Id,使用时从“元素池”中取用。除此之外,在MyUmlInteraction初始化时,分类存储了一些常用的类,例如UmlClass类等,还将所有输入的元素放置在“元素池”中,使用HashMap容器实现。Key值为其Id,这样就可以用Id值进行存取。

Task2

本次作业,在上次作业基础上,扩展解析器,使得能够支持对UML顺序图和UML状态图的解析。即扩展类图解析器,使得可以支持对UML状态图和顺序图的分析,可以通过输入相应的指令来进行相关查询。

由于上次的作业实现的类已经有四百多行,继续在该类中实现会使得类太过臃肿,为此我采取了两个措施。一,将上次作业冲创建的私有类NewUmlElement提取出来创建为独立的类,并再一部扩充其分类功能和对应的方法。二,将上次作业的MyUmlInteraction类改为抽象类,让本次作业所要求的MyUmlGeneralInteraction类继承这个抽象类,这样就改善了代码的臃肿结构,使得代码结构较为合理,并且 不需要改动上次作业的代码,只需要做扩展任务即可。

Task3

本次作业,在上次作业基础上,扩展解析器,使得能够支持对UML顺序图和UML状态图的解析,并对模型进行有效性检查。

本次作业的架构沿用Task2架构即可,在MyUmlGeneralInteraction类实现接口要求的相关方法。但是为了方法时间复杂度能够较低,所以要在创建MyUmlGeneralInteraction对象时做足缓存内容,即需要对构造方法进行功能扩充,使得分类功能更加齐全,这样在使用时不需要遍历,只需要取用,节省了大量的时间。由于子类不能直接访问父类的私有属性,所以需要增加相应的get方法,子类的构造方法也要进行相应的改动。

对架构设计及OO方法理解的演进

第一单元的作业中,我们练习了面向对象编程中继承与多态的思想,最终实现了包含简单幂函数和简单正余弦函数及其组合的导函数的求解。在本单元,本人首先认识到了充分测试的重要性。随着程序的逐渐复杂,测试集也就变得复杂起来,为了得到健壮稳定的程序,充分的测试就显得尤为重要。其次就是解决问题的思路与程序的架构十分重要,如果没有完整的思路就写程序,很有可能造成后续无数的BUG,所以在写程序之前,必须要把架构设计与思路明确。最后就是优化的问题,在没有正确的解决问题之前就时时刻刻考量着优化方法显然是不明智的选择,应该是在保证程序功能正确性的基础之上,再去做一些在自己力所能及范围内的优化。

第二单元的作业中,我们练习了简单的多线程编程,总所周知,多线程编程在实际工作科研中十分常见,是一门重要的技能。本单元的作业我们依次实现了单部多线程可捎带电梯的模拟、多部多线程可捎带调度电梯的模拟和多部多种类多线程可捎带调度电梯的模拟。在本单元颇受启发,总结如下:一,类的本质就是数据与维护该数据的方法的集合:明确每个类的功能,使其职责单一化,做到这一点会大大增加的可扩展性和健壮性,每次作业设计的重点在于最大限度降低耦合,每个对象只应该管自己该管的事;二,优秀的架构一定是兼顾正确性与性能优化的:在写程序之前一定要着重设计程序的架构,使其尽可能合理,尽可能提高其工程性;三,尽量将数据结构和算法作为独立模块进行封装,并且实现充分的可重用、可移植、逻辑分离;四,将代码中经常使用的部分提取出来封装成函数,以避免代码的冗余与重复;五,设置好方法与属性的访问权限,只在类内被使用的方法权限应设为private。这样可以对外部隐藏类的实现细节和保护类的数据。

在第三单元的作业中,我们练习了基于JML语言的编程。我们根据课程组所下发的JML规格,逐步迭代实现社交网络的相关功能,虽然本单元的内容较为简单,但是由于自己的粗心,本单元的成绩并不是很理想。在经过了这单元的三次作业和对JML学习的经历后,我有如下心得体会:学会对自己的程序进行全面的测试,不经过充分测试的代码有很大概率存在BUG;阅读JML要逐字逐句仔细理解,不能自以为是地掠过一些部分,很有可能对规格产生误解;自动化测试可以极大地提高测试效率和测试能力,是值得一试的好方法;作业不能等到最后几天才开始着手,这样在写完程序后很有可能不再想进行测试,导致最后的代码漏洞百出;对一些常见算法还是要熟练掌握,良好的数理基础有利于算法能力的提高;学会对JML进行抽象化理解,不能总是按照JML生硬地翻译代码,而是进行功能抽象,架构设计,以实现“同样的功能,更好的架构”的目的;好的架构才是程序设计的最终目的。

在第四单元的作业中,我们主要学习了面向对象编程中重要的建模语言UML,并且依据课程组提供的接口实现了UML树形结构的解析器。故本单元的主要内容为学习UML建模语言以及了解其内部的层次结构。通过本次作业,我认识到建模语言在面向对象编程中的重要性,在小规模的程序中可能并不能凸显出其重要性,但是在大规模的工程中,建模语言在程序设计、测试等方面发挥着至关重要的作用。

对测试理解与实践的演进

在第一单元中,我对测试并不是很重视,写出来的程序大多是通过黑箱测试的形式来测试的。黑箱测试虽然方便,但是需要充分的考虑才能达到才能将程序中所有的情况覆盖,而且只能构造一些简单的测试样例,没有办法构造较大数量级较复杂的测试数据,所以在第二次和第三次作业中都出现了BUG。

在第二单元多线程测试中,我结合Jprofiler、print和黑箱测试三种方法来实现测试。

在第三单元和第四单元中,我逐渐熟悉了自动化测试和JUnit测试的方法,将新的测试方法应用于这两单元的作业取得了不错的效果,同时结合了黑箱测试来测试一些逻辑的易错点。

课程收获

  1. 能够较为熟练地使用Java语言进行编程
  2. 较为深刻地理解了面向对象编程的思想
  3. 能够较为熟练地使用Git,学习到了多线程编程、契约式编程(JML语言)、UML统一建模语言等知识
  4. 测试是写程序过程中最重要的一环,充分的测试是保证程序正确性的基础
  5. 程序鲁棒性的重要性
  6. 优秀的架构一定是兼顾正确性与性能优化的。在写程序之前一定要着重设计程序的架构,使其尽可能合理,尽可能提高其工程性、可扩展性、复用性
  7. 熟练的掌握一些基本的算法

个人建议

总体上,我认为OO课程是一门非常好的专业课,在学习的过程中,我感受到了OO教学组的细心与耐心,感受到了课程组全面的考量和训练计划。但是在以下一些地方,个人认为可以稍作改进:

  • 个人认为可以设定一定渠道来帮助同学获取实验成绩。这样一来,想了解实验课成绩的同学可以了解实验成绩,而对其不感兴趣的同学可以自行忽略。
  • 在每次理论课后,可以为大家附上一些好的参考资料,每次作业前,相关的理论知识其实是远远不够的,这样就要花费大量的时间进行寻找学习。最重要的是网上的学习资料质量参差不齐,有的问题甚至在国内的网站找不到合理的解释,这样就更加浪费时间和精力了。所以,如果课程组在每单元给大家一些优质的学习资料和学习网站,相信大家整体的学习效率与质量会有提升。
  • 研讨课为大家提供一些具体的Topic来讲。个人感觉大家研讨课积极性不高的主要原因是感觉自己没什么可讲的。如果在每次研讨课之前可以为大家提供几个参考话题,大家的积极性可能会有改善。

线上学习OO体会

由于疫情原因,本学期的所有课程都是在网上进行的,有些课程因为上课形式特殊在线上开展变得十分困难,但是计算机的相关课程不存在这样的问题。

个人认为OO课程在线上的开展十分成功,通过腾讯课程进行理论课的学习、实验课的预习,通过腾讯会议开展研讨课,通过OO平台进行作业的提交、测评、讨论和开展实验,通过微信群来发布通知和进行讨论。OO课程在线上通过多维度为大家创造学习环境与学习氛围,全力为大家提供帮助,真的是十分感动。唯一的遗憾就是没有能见到老师、助教和一起奋斗在OO前线的各位同学,也希望疫情快点过去,我们能够早点回到校园,恢复正常的学习和生活。

你可能感兴趣的:(BUAAOOUnit4总结分析以及OO学期总结)