BUAA-OO-第四单元总结

第四单元架构设计

本单元总体作业思路是读取识别每个umlelement,然后构建对应的类图、顺序图、状态图的uml树状结构,根据构建好的树状结构进行一些检查和查询工作,涉及到一些树的遍历和搜索算法。难点在于准确理解uml类图、顺序图、状态图的结构(第四单元的手册中的三个树状图是很好的参考),以及其下属元素之间的关系,构造出正确的、方便使用的树状结构。由于不像上个单元的jml描述,本单元很多地方的理解需要很细致、理解到位,否则可能出现理解偏差。

hw13

第十三次作业主要是构建类图的uml结构,然后对类图进行一些查询工作,自己重新构建了类、接口、方法三个类,结构上就按照类图模型来,不过没有充分利用官方包的这三个类,或许可以继承来实现。类和接口的地位基本上差不多,两者所管辖的元素基本一致,只是规则上有些差别,类似于官方包,或许可以提供一个classOrInterface作为父类。

hw14

新增了顺序图和状态图的uml模型,对于状态图模型的状态,我既构建了三个类区分初始状态、中间状态、最终状态,又都实现了一个统一的node接口方便状态图的遍历。作业进行到这,会发现此时MyImplementation已经非常臃肿了,需要我们进行结构上的优化,否则就是checkstyle检测超出500行。

hw15

在三种uml模型上基本上没变,就是给顺序图增加了一层,由于这次作业涉及到了顺序图中的umlattribute。

新增了Parser类来进行umlelement的识别构建uml模型工作,新增Util类来提供第三次作业检查uml模型的方法,MyImplementation只提供第三次作业方法的接口。

最后,一个要注意的地方是构建uml模型时,由于读入元素的顺序是不确定的,所以要先进行记录,所以需要循环读入再构建。然后每个元素都以Id作为索引,这样就可以识别或者找到每个元素。然后,本章对性能上没有过多要求,所以一些树或者图的遍历搜索就直接递归深搜或者广搜暴力解决了。

架构设计思维及OO方法理解演进

第一单元第一次作业刚开始是毫无头绪,不知从哪下手,经过第一次研讨课后,对第一单元的层次才有雏形。脑子里也开始有层次化设计的概念。面向对象并不是说简单的分成很多函数来写,或者说建几个类分开写代码,分层设计一定是基于功能和需求的,弄清楚功能和需求才能进行有效的分层,层次结构才会清晰明了,随着需求和功能增多,良好的层次结构可以进行不断优化,扩展出更多层次。面向对象进行层次化设计,对功能进行模块化,各模块干好自己内部事情,对外提供接口,问题分解成不同层次,模块也可以处于不同层次。这样我们进行编程时,只关注分解成的比较简单的子问题,可以提高效率和减少bug,方便调试和测试。第一单元设计中,我个人的代码架构并不是很优雅,甚至可以说丑陋,不过第二单元到第三单元的倒是良好过度,基本上没有架构上的修改,或许不优雅但实用就行。

第二个单元中,初次接触多线程,对各种设计模式也开始了解。我的理解是设计模式类似于良好的编程范式,在不同场景下,一些良好的处理问题的思想模式。这个单元,主要是使用生产者-消费则模型,但是对锁的了解与使用只停留在了synchronized上,所以基本上就是靠人脑去识别哪些地方同步或者互斥。而且个人还遗留了一些未知的问题没能解决掉。多线程让人感受是一不留神就出错,而且还不知道错在哪里,不同的机器还可能跑出不同的结果。(主要是自己的机器死活跑不出bug)

第三单元完成的工作相对而言比较简单了,就是填写各个函数,然后涉及到一些图的算法。第三单元还检测怎么记录一些关键的中间信息,以便减少算法的复杂度。这个单元对测试也做出了一定要求,不过本人测试做的并不是很好,基本上就是脑力想一些可能出现的极端情况和随机生成测一下。(随机生成的数据也测的不多)这个单元重点还是读懂jml描述吧,形式化描述对于一些需求描述起来让人挺摸不着头脑的,对于一些地方读起来又感觉好繁琐,但其的确是准确描述需求只不过很抽象。(要把需求转换成如此抽象的描述真的十分不易呀)个人感觉,如果jml不能自动化生成代码,或许一般的文字描述加上jml会更好理解,不然上来一个复杂的jml描述可能一下子就让人蒙了。

第四单元主要是是理解类图、顺序图、状态图的uml模型,架构设计上基本上按照uml本身的结构就行了。

测试理解与实践

个人对于OO平常任务的完成压力其实挺大的,对于测试方面就并没有花费很多功夫,研讨课听别人关于测试心得的分析并没有很深刻的收获,毕竟没有实践,一切都停留在了理论上面。

课程收获

首先是面对一个问题,不管代码写的怎么样,结构优美不优美,能够硬着头皮啃下来,即使自己写的是“屎山”,也能够开发下去吧。总的来说,个人觉得OO对自己的写代码实践的能力进行了很大的提升。方法思想很重要,但是能够写出来是最重要的。

第二点是层次化设计的思想和一些设计模式的学习,还有多线程的学习。虽然目前了解的并不多,运用的也不是很好,但至少有这个意识了。

第三点是对于JML和UML的学习吧,对于形式化描述和统一建模语言,就像进入了新世界的大门吧,不过目前还没体会到两者非常实用的地方。

个人觉得面向对象更多的是对一个人编程思想上的锤炼,是人类面对复杂问题提出的思想方法以弥补人类思考能力的有限性。虽然OO课程已经结束了,但OO课程只是打开面向对象世界的大门,未来还有许多东西待我探索,更多的应该是等待我去实践。

课程建议

预习可以提供Java基础知识的指导,预习内容或许可以更丰富些,让同学们有个提前量的储备,不然第一个月真的是压力山大的一个月。

对于多线程部分,或许可以提供更详细的指导,对于一些常见问题,debug的教程或许可以更详细些。

可以收集同学们提出的bug,或许可以发现一些共性问题,看到同学们解决问题的痛点在哪。

指导书答疑可以开一个专门栏目,重点提示一些容易误解的地方。

互测模块,个人体验其实并不是很好,而且大部分时候,可以说基本上不会去阅读别人的代码,hack方式就是丢数据跑就完事了,或许可以改进改进,也没能想出什么好的改进方式。

测试部分的教程或许不属于基本任务范围,但是或许可以增加一些测试部分的教程与练习。

posted on 2022-06-27 13:03  lxyskyler  阅读(14)  评论(0编辑  收藏  举报