OO第四单元总结

OO第四单元总结

总结本单元作业的架构设计

这个单元课下完成的是一个UML解析器,我认为主要的难点在于理解不同UML图的各种元素还有它们之间的复杂树形关系,这个不仅关乎我们解析他们的顺序,还涉及到后面进行各种指令的计算的算法 ,所以从第一次作业开始我就花很多时间在理解上面,这里很感动的是课程组的那个第四单元的总结PDF,真的很有针对性,很多我在初次学习和理解课下作业指导书的心中萌生的疑问基本得到了解答,帮助真的很大,也期盼以后能越来越完整,造福学弟学妹们。在解析好各个元素之间的关系并且理解好指令的要求后实现指令其实不是很难,不过还是很容易出bug就是了,但是都算是小bug,修复起来不是很坐牢。(特指电梯作业doge)

第一次作业

这次作业只需要解析类图的相关元素就行,如下我先是实现了自己的相关元素类和接口方便操作,然后还将要求实现的一些操作都下放到了相关的类中实现。对于类图数量这些的统计数还是采用边读取边解析的方法,这样就能保证很多指令的查询复杂度都为O(1)。

第一轮:

  • UmlClass
  • UmlInterface

第二轮:

  • UmlAttribute
  • UmlGeneralization
  • UmlInterfaceRealization
  • UmlOperation

第三轮:

  • UmlParameter

第二次作业

这一次解析器中加入了顺序图和状态图,和上次类图一样,我实现了自己的相关类来方便自己操作,如下图所示:

然后指令的实现主要策略和第一次作业类似,读取的时候不断维护,不断地完成整个的结构的架构,架构完成后对于剩下的指令的实现也比较简单。下面是多轮读入的顺序:

第一轮:

  • UmlClass
  • UmlInterface

第二轮:

  • UmlAttribute
  • UmlGeneralization
  • UmlInterfaceRealization
  • UmlOperation
  • UmlStateMachine
  • UmlInteraction

第三轮:

  • UmlParameter
  • UmlLifeline
  • UmlRegion
  • UmlEndpoint

第四轮:

  • UmlState
  • UmlFinalState
  • UmlPseudostate
  • UmlMessage

第五轮:

  • UmlTransition

第六轮:

  • UmlEvent

第三次作业:

最后一次作业是格式检查,架构在第二次作业上的改变很少,增加的可能就是UmlAssociated部分,并且我选择就在最顶层实现这些有效性的检查,主要是因为自己很多的转换所存储的位置都在最顶层,就懒得往下传参数了,选择直接在最顶层实现,格式和外观上选择开摆。具体我的实现可以分为两类,一类就是像R007、R008、R009这样的,只需要判断整个结构一类元素是否有违反这个规则的存在,这样的我在最顶层维护了一个相关有效性规则的布尔型变量,在读取的时候就去检查相关的读入元素是否满足规则,不满足的话就改变这个布尔型的值,最后有效性检查的时候就去check一下这个布尔变量的值就可以判断是否满足有效性了。还有一种就是在整个架构完成后不能做出正确判断的,这种的话就是正常在进行检查的时候按照要求检查就行,因为这个时候架构已经很完整了,写起来不是很难。

四个单元中的架构设计思维及OO方法理解的演进

第一单元

  • 这个单元中我的收获很大,当然也是最痛苦的一个单元对我来说,主要是自己没有相关基础,然后也没有在假期好好学前面的预习课程,导致自己要从零基础开始弄第一次作业,是真的坐牢。
  • 这个单元主要的任务是对表达式进行去括号,架构上采用的是训练里面提供的递归下降方法。
  • 整个单元下来让我掌握了面向对象的基本知识,在实践中感受到了面向对象这门语言的能力,当然对了其中的继承多态也有了更深的理解,还有一些基本概念也是记于心中了。

第二单元

  • 这个单元任务是完成一个电梯系统的模拟运行,该单元主要就是考察多线程的理解和使用,主要难点在于如何分析系统、剥离出来线程,然后如何很好的解决线程安全问题。里面最难和最让人头疼的肯定是如何保证线程安全,这也本来就是多线程架构里面最核心的问题。
  • 开始第一次作业自己才刚刚理解多线程,对于作业没有一个自己的架构,先是在网上学写了一些前辈的架构,然后又等到了实验的到来,才慢慢自己动手去完成作业,其中最核心的线程安全问题其实没有多少自己的思考,关于生产者消费者的架构已经有了,其中也处理好了共享变量的互斥访问。
  • 后面两次作业我也一直没有增加共享变量,只是在原来第一次的基础上做架构的扩展。比较可惜的就是一直到最也没有真正用上第二次实验中的流水线模式,希望之后自己有时间再去实现下。

第三单元

  • 第三单元就是按照JML语言描述写出符合要求的函数,这个单元整体是最简单的,主要是JML语言整体还是很好理解的。
  • 过程中我学习到了契约化编程思想,然后还有一般的JML语言的阅读和书写,对了,这个单元让我对于JAVA中的异常有了更深的理解了,收获还是很大的。

第四单元

  • 这个单元学习的是UML图,作业是一个解析器,难度平心而论不是很难,但是自己却因为这段时期的一些事没把OO作业太放心上翻车了,第一次作业的中测都没过完。
  • 主要过程还是理解各种元素之后的建图,图架构起来之后完成各种指令就很简单了,再说一次,手册和讨论区真的很有用。

测试理解和实践演进

  • 因为自己能力问题还有时间分配,这个学习中自己构造数据和测试很少,在前两个单元几乎没有自己去构造数据去测试,更多的还是用别人构造出来的数据和同学进行对拍来发现问题,说来确实有些惭愧。

  • 到了第三单元开始自己写评测机,主要原因还是第三单元不难难度不大,这样就有时间去写,而且这个单元由于是JML规定了很多东西,对于数据的限制很大,数据也相对方便构造。我的思路还是最简单粗暴的随机生成测试数据,根据要求对了指令数据的数量和产生位置进行一些限制,比如在开始肯定是先去多生成些person和group,然后测试也是采用的对拍(还是因为菜且懒)

  • 整个过程下来,无论是自己的尝试还是课上同学的分享,自己对于数据测试的理解和掌握程度得到了较大提升,真的很感谢那些不吝分享的同学。

课程收获

  • 首先我认为自己收获最大的还是面向对象的这种思维,就向jyp老师在课上说过的那样,面向对象它不仅是一种编程思维,它更是一种思考方式,一种处理问题的方式,一种智慧。其中我感受最深的是关于封装,封装就是将事物的一些不便暴露给外界的一些属性隐藏起来.同时给外界提供一些接口,用来和外界进行交互,建立连接关系,这个做法在编程中既保证了数据的安全,有很方便的为使用者提供了简洁的使用接口,不必在乎和关心内部实现,各司其职,对于架构很庞大的工程非常实用。这种思想在分工合作中也有很好的应用,我们再进行合作的时候可以把各部分的工作封装起来,知识告诉别人我们这部分实现了什么功能并提供相关的接口,这样机能事项安全性又方便合作。
  • 还有的就是java这门语言的很多基本知识,又继承、多态、多线程实现、互斥控制等等。
  • 再就是自己的代码风格了,虽然基本上是靠ctrl + l进行格式调整,但是后面自己也会不自觉地注意格式问题,现在自己手写的代码也看的下去了。
  • 最后我想说的就是OO这门课真的锻炼了我很多,包括但不限于抗压能力,时间安排能力,快速学习能力,还有心理素质,有的时候真的是生死时速(主要还是自己喜欢压ddl),现在也算是过来了,感恩课程组、主教团队还有很多帮助过我的同学们,也算是半只脚迈进大三了,好耶!

改进建议

  • 就是开始那个预习课程课程组可以早些和同学们强调下重要程度,比如就可以拿往年的数据先给大家看看,还有我们开始第一周的作业难度和之前几届的反馈,形式照样可以是非强制,相信既能提高大家做的积极性,也能很大程度上避免第一周大家过的太难受甚至劝退某些学生的情况发生,我要是知道第一次作业的难度肯定会提前把预习课程好好完成,主要是确实下发预习课程的时候我是不知道这个预习的重要性的。
  • 实验可以及时的给出反馈,不然就交上去了也不知道对不对,有些时候某些地方的理解还是很关键的。
  • 可是适当在第三单元多加点内容,因为迭代内容过多,导致后面每次作业需要完成的作业量真的较少,对了,要新完成的部分或者又改动的地方可以像第四单元一样给大家标出来。
posted @ 2022-06-29 14:46  谷福胜  阅读(12)  评论(1编辑  收藏  举报