第一次:采用包装官方包类的方法,把每个类型的元素和其需要知道的信息包装在一起,形成树状结构。其中最主要的是MyUmlClass,它包含类的属性、方法、相关类等信息。MyUmlClass具备处理针对类内部情况的问询的能力,同时提供与之相关类的指针。MyUmlInteraction构造器中用switch处理所有元素,主要是把元素包装好提供给相应的MyUmlClass,然后接收各种问询,转接给所有相关的MyUmlClass处理。
第二次:和第一次思路类似。MyRunner负责和外部交互,以及分发元素和问询。开始时MyRunner把元素集合交给MyUmlClassModelInteraction,让它从里面挑出属于自己的元素整理好,把过滤掉的元素传给下一类图,以此类推。之后MyRunner调用三种图的问询方法,让它们根据内部数据结构分别处理请求。因为涉及到交互更多,包装的元素类型增加了不少。
第三次:和第二次架构相同。在MyRunner中构造器增加了检查功能。因为每个检查功能只涉及一个图,所以也是分发给对应的Interaction类处理。
(2)总结自己在四个单元中架构设计及OO方法理解的演进
第一单元架构还有一些面向过程思想,本质上是主类调用表达式简化器完成所有工作。通过看往届代码,意识到term是对象。但细节上很模糊,只是觉得term是一类实体,正则表达式是一类实体,因此要分开,对对象的理解还是静态的。
第二单元通过分析问题,架构明确了一些,主要是人、电梯、处理请求的类和处理输入的类之间协作。第三次作业首次使用了继承,不同类电梯用同一接口实现,虽然最后写崩了……
第三单元其实没有太思考架构,因为一直都觉得JML已经给好架构了,在最后讲解才发现JML还有很大拆分整理的空间。
第四单元架构比较明确,能快速鉴别对象及其之间的关系,基本没想过用别的思路实现,扩展也没什么问题。毕竟UML“元素”本身就很好地体现了对象的概念。总之,对架构设计认识有了很大进步,但在分配功能时,还是会出现全能的类,感觉在这方面还要改进。
(3)总结自己在四个单元中测试理解与实践的演进
之前对测试的理解就是手动构造或随机样例+评测机。通过这四个单元,接触到了JML测试,例如JUnit,对测试有了更深的理解。不过实现起来因为工具链问题有点困难。
第一单元主要是考虑边界条件,手动构造测试样例。第二单元写崩了,基本没有对别人代码进行测试,对自己的测试也主要是参考以样例和测试点。不过通过研究别人的评测机了解了python自动评测和定时输入,对debug帮助很大。第三单元主要是靠仔细研究JML,尤其是在相对复杂的地方,测试对规格理解是否有误。第四单元感觉和之前也差不多……?从指导书出发分析哪些地方比较复杂,可能出错,构造针对性样例,同时借助官方包和StarUml生成测试样例。
(4)总结自己的课程收获
1)工具方面,首先感谢OO的安利,现在所有码字工作都会用Typora,相比之下word就像草稿纸^ ^ StarUML在分析问题、整理数据上也非常有用。
2)理论层面,OO让我接触到了很多新思想和方法。一开始学会了很多面向对象的设计原则,实现了从面向过程到面向对象的转变。学习了多线程的相关概念,这在之前编程时从来没有接触过。虽然理解起来费了很多功夫,但结合理论课semaphore等内容,理解了线程的生命周期、线程安全之后感觉非常有价值,刷新了对代码的认识。JML这样的规格化设计语言可以解决需求不明确的问题,让我深刻体会到编码是开发的最后一步,用合适的工具明确架构非常重要。UML和多线程一样是非常实用而强大的内容,更像一种思维模式,在编程之外的领域也可以用来分析问题。
3)代码能力上,OO的代码量比之前大很多,并且帮助复习了很多数据结构的内容,对代码能力有很大提高。同时,课程设置也锻炼了我之前没有关注过的一些能力,比如三次作业为一组的迭代开发过程要求考虑可扩展性,互测锻炼了读别人代码和用各种途径进行测试的能力。
(5)立足于自己的体会给课程提三个具体改进建议
1)关于实验课:希望每次实验课能看到分QAQ。感觉实验课的内容难度和形式每次会有一些变化,可以更系统一些?大部分实验课内容都很好,但中间那次用junit测试找bug有点跳跃,范围太大了,感觉是想考小顶堆排序写法……
2)JML单元:如果可以的话建议去掉junit(junit真的一脸多年没维护的样子),增加写JML的作业。
3)针对作业的讲解如果不局限于通过数据分析会更好,比如讲解测试样例,讲一个比较好的架构,或者每个单元分享一些优秀代码,这样可以对架构有更好的理解。感觉虽然学了很多理论知识,但最后用的还是自己最熟悉的思路。