oo第四单元总结与课程总结

引言

本单元为oo的最后一个单元,主要内容为完成一个UML类图分析器。本博客为第四单元以及整个课程内容的整理与总结。

正文

第四单元的架构设计

第一次作业

本次作业主要实现类图的解析,除规定的接口实现外,还自己增加了三个类,分别为MyClassMyInterfaceMyOperation,分别独立实现类、接口和方法的解析。输入图的数据在接口类MyUmlInteraction进行预处理,再由以上三个类分别解析处理。

第二次作业

这次作业增加了状态图和顺序图的解析,新构建了MyInteractionMyLifeLineMyStateMyStatementMachineMyTransition五个类,分别进行顺序图、生命线、状态、状态图和信息传输的解析。由于实现的接口类过长,将类图的解析单独抽象成了一个类,使得架构更清晰、可扩展性更强,并降低了聚合度。

第三次作业

这次作业是模型检验,直接在之前的架构的基础上加入了检验函数,并没有新增类,也说明之前的架构具有较好的可扩展性。

四个单元的架构设计以及oo方法理解的渐进

第一单元

第一单元第一次作业初步接触面向对象,还没有形成面向对象的思想,采取了半面向对象半面向过程的方式来完成,然后到了第二次作业此建构完全没办法完成指定功能,只能推翻重构。第二次作业做到了拆分,尽量降低了耦合度,采用了递归解析表达式的形式求解。第三次作业就直接沿用第二次作业的架构做了简单改动,虽然性能比较差,但是正确性很好。这次作业的痛苦重构过程让我深刻意识到了面向对象思想的重要性,其具有高度的可扩展性,有利于迭代开发。

第二单元

第二单元为多线程,第一次作业采用了输入线程和电梯线程两个线程进行操作。第二次作业由于加入了多电梯增加了一个调度器线程与电梯线程交互。第三次作业直接对调度器线程进行了轻微修改。总的来说,单电梯调度采取了LOOK策略,多电梯采用了最简单的优先调度给等待乘客最少的电梯的策略,但也取得了不错的性能分。在多线程调度上采取了生产者—消费者模式,但第三次作业也出现了一定的死锁问题。在这一单元中我深入的理解了多线程的思想,更加体会到了面向对象思想所带来的提升与效率。

第三单元

第三单元为JML语言,基本上就是按照所给的JML规格进行机械化的翻译,除了容器的选择和算法的选择,基本上没有什么其他的设计。但在JML的描述中,面向对象的思想被体现的淋漓尽致。高内聚、低耦合是整个架构最显著的特征,且具有高度的可扩展性。在三次迭代过程中几乎都不需要修改前一代的代码,而是直接添加新的代码。

第四单元

第四单元为UML类图解析,其架构设计已在前文中讲述,故不再赘述。到第四单元时,面向对象的思想已经深刻的印到了我的脑海里,我自动的对功能进行拆分,进行抽象,将复杂的结构拆分成多个层次进行实现,成功实现了较好的可扩展性,在三次作业中都只是对之前的结构进行扩充,真正做到了拥有面向对象的思维。

四个单元中测试理解与实践的渐进

第一单元

第一单元最初的测试基本是对自身编写程序过程中认为可能会存在问题的地方进行测试样例编写,再进行人工的对比。后来利用python的sympy库进行正确结果的生成和结果的化简及对拍,使得测试过程轻松了很多。

第二单元

第二单元的测试需要相当大的数据,手动构造起来较为困难,且程序运行时间也很长,对测试造成了很大的困难。除了自己手动构造一些特殊的会导致tle的数据外,基本上是白嫖同学的测评机()。测评机是随机生成不同种类的数据量较大的测试样例,并对几类典型错误进行判定。程序运行时间过长的问题通过python多进程进行解决,但由于我的电脑太菜跑多进程会黑屏所以其实也没怎么用到(),这一单元的互测基本上等于白给()。

第三单元

这一单元其实只要按照规格进行代码写作很难出现bug问题,但由于中测过于水如果自己不仔细测试还是很容易强测爆掉。测试的思路其实就是先构造一个关系网络然后再进行命令查询测试,由于大家的输出是一致的直接进行对拍即可。此外需要重点对几个复杂度较高的方法进行tle的测试。在这单元的互测中由于大家架构一致且很难找到正确性问题,我是直接阅读代码进行错误查找的,一旦出现某个方法的时间复杂度达到\(O(n^2)\),便可直接构造数据使其tle。

第四单元

这一单元没有互测,但是仍需对自己的代码进行充分测试。除了通过测评机进行随机数据的构造之外,还可以用StarUML软件自行绘制较为复杂的类图进行正确性的测试,这样的测试更有针对性更容易发现错误。对比结果仍采取对拍的方式进行。

总结

要想进行较为完备的测试,地毯式的随机测试和针对性的特殊构造测试必须结合进行,这样才能使测试的可靠性达到较高水平。测试分为三个阶段,生成数据,获取结果,对比。这三个阶段的复杂性在四个单元中各不相同,需要具体问题具体分析,不断调整。

课程的收获

我认为oo课是我收获非常大的一门课,虽然学习的过程相当痛苦,但是收获也是很大的。

第一,我的编程思想由面向过程转向了面向对象。面向过程与面向对象虽各有特点,但面向对象在迭代开发和复杂程序开发中显然具有更大的优势。

第二,我获得了一定编写复杂程序的经验。在学习oo课以前,我所编写过的程序都是实现一个特定功能或者一个特定算法的微小程序,但在oo课中训练编写了拥有一定复杂度的程序,积累了经验。

第三,我获得了一定重构和debug的能力。在上oo课以前我并没有过重构的经历,也并不了解。但经过多次迭代和复杂程序debug,我的重构和debug的能力都增加了。

第四,我学习到了很多其他的内容,比如java多线程、构造模式、JML语言、UML模型语言等等。

三个具体改进建议

  • 第一,建议在课程开始之前的pre中,列出本课程将会要求的知识,如多线程思想、JML语言,让同学们提前做一个大致的了解,可以减轻在后续学习中的负担。
  • 第二,在指导书的描述中增加一些详细的举例,特别是特殊情况的详细说明,防止学生在实现过程中出现误解。
  • 第三,增加课上实验的反馈,让学生可以及时知晓自己做的是否正确,知道错误并改正才能进步。
posted @ 2021-06-26 14:14  禾草  Views(56)  Comments(0Edit  收藏  举报