OO第四单元作业总结

OO第四单元作业总结

一个学期的OO课程走到尾声。整个面向对象程序设计学习的过程中,感到困难、痛苦的时候多,愉悦的时候少;但现在回忆起来,愉悦的部分浮出水面;艰难的同时也感到收获颇丰。

一、本单元三次作业架构设计

第一次作业-hw13

  • 主要实现类图的查询。
  • 整体架构:

OO第四单元作业总结_第1张图片

  • 因为理论课学的不够扎实,本单元刚开始的时候看到jar包里诸多的类和接口时是感到十分棘手的,很多的精力都放在对UML模型的阅读理解上。充分理解之后,从0开始的架构过程也很困难。好在写着写着,对于UML的理解逐渐加深,思路也逐渐顺畅。
  • 架构方面,我对官方包中的UmlInterfaceUmlClass进行了重新的封装,并根据查询要求实现了一些新的方法,以更加有效的管理数据、更方面的实现查询。

第二次作业-hw14

  • 增加了状态图和顺序图的查询。

OO第四单元作业总结_第2张图片

  • 在第一次作业的基础与对Uml图比较详实的了解上,本次实现难度并不大,主要的方法皆为简单的计数查询。
  • 架构上面,沿用第一次作业的同时增加了StateMachine和State两类,以储存和管理状态机的状态、状态迁移以及将多种状态进行抽象统一管理。
  • 在强测中因为一个类的Exception笔误导致一个点WA,暴露出测试不够的问题。事实上,本单元的测试都不足,主要时间花费在代码理解和架构上面,期盼一个扎实的架构能够带来鲁棒的结果;当然啦,事实表明,架构和测试两架马车还是要并行的。

第三次作业-hw15

  • 依照8个规则实现UML图的检查功能
  • 整体架构:

OO第四单元作业总结_第3张图片

  • 仍然时沿用了前两次作业的架构;本次的重点就是挑选合适算法实现8个检查规则。具体实现上细节比较繁杂,003和004主要使用BFS,002的循环继承需要分类和接口不同情况结合继承解决。为了解决mid5的WA,我盯着001和005 de了一天的bug。在一开始我对001的AssociateEnd理解有偏差,005则是因为细节笔误。。。测试上面,第三次作业由于本来就是实现功能检查,难度较大,需要对各个规则的特异情况进行覆盖性测试。

二、四个单元架构设计与OO方法理解的演进

  • 第一单元刚一入手对面向对象可以说是一窍不通。前两次表达式作业时,我的代码几乎是完全面向过程,这一方面源于在最开始还在努力适应java语言,同时自己针对面向对象的作用认识还不够深刻;另一方面,我对代码编写没有一个整体的工程化认识,对每一次的下一次作业可能出现的状况没有任何预判,编写时只关注于该次作业本身的任务上,导致代码毫无扩展性。可以说,在第三次作业的难度的逼迫下,我才迟迟开始了面向对象编程,整个代码架构才算有些样子了。
  • 第二单元多线程电梯可能是我度过的最困难的一个单元。(当然第三单元中测的温水也把我煮的熟的透透的...) 多线程的坑我几乎一踩一个准,暴力轮询、死锁等等问题在我的代码中屡屡出现。而关于多线程的调试与优化,也仅仅停留在能够编写python使批量输入带时间戳的请求,其余的包括自动输出检查、自动构建随机或特殊样例、算法效率分析等相关方面并未涉及。被多线程烤的焦头烂额就并没有投入特别多在代码架构上,我也终于明白了代码架构应该在写代码之前就想好,而不是出问题了再重构==。仅仅尝试了生产者与消费者模式,但很显然是不够的(比如在讨论课上看到了诸如“单例模式”等)。设计模式作为已经经过验证的套路,是可以拿来就用的。重复造轮子绝不可取。
  • 第三单元JML,一上来的时候我过分轻敌,以为大致照着JML写出代码就完成任务了(远远不是),于是强测爆零也并不意外(当然当时很意外)。事实上,这一单元的考察很综合,从架构、算法的选择、数据存储到测试都有很细致的考察。架构设计上,在讨论课的分享/别人的代码中我才发现,可以单独创建图类、并进行分类处理。我在写代码时是完全没有想到,只呆呆跟着搭好的框架走的。算法上,我在第二次、第三次作业中逐渐开始使用并查集、优先队列、Tarjan算法等等以降低复杂度,这可是说是对数据结构和算法的一次充分练习。数据存储的重要在这一单元体现的很明显,我也为我之前的大意感到惭愧。在讨论课同学的分享以及实际实践中,我现在已经能比较清楚地区分像HashMap, ArrayList, LinkedList等等存储结构的特点,以选择最合适的存储容器。测试方面,我一直都是一个惰于测试的人,在这一单元也是吃尽了苦头。本单元中,学习了JUnit和JMLUnitNG。后一种比较旧,有时不太兼容,主要还是依靠JUnit,使用简单便捷,给第四单元打下了一定的基础。
  • 第四单元UML考察的能力相较于前三个单元而言最为综合,要编写的代码部分的架构要从0开始搭建。四个单元顺下来,其实强烈的感受到单元间层层递进的关系;到了最后一个单元,也可以说是一个面向对象课程的总结与升华。经过前三单元的历练,可以说我已经掌握了一些基础架构的方法,也终于能够在开始写代码的最之前,建构好大致建构。

三、四单元中对测试理解与实践的演进

就像我之前所说,我一直是个惰于测试的人,整体测试上面没有太多进展,倒是积累了很多教训。

  • 第一单元时,基本上以手动构造一些边界数据样例为主。会在自己测试时记下具体样例以便互测。
  • 第二单元手动测试宛如天方夜谭。尝试了Python编写批量输入带时间戳的请求,试图编写自动数据生成未果。
  • 第三单元的核心在学习了JUnit,可以对代码进行一个比较全面的覆盖性测试,收获颇多。
  • 第四单元在测试上没有太多进展,主要还是以重视架构避免bug产生以及在starUML观察uml图来进行debug。

四、课程收获

​ 很多的收获在上面几个部分中已经一一举例了,在这里就做一个宏观上的总结吧。

​ 整个面向对象课程核心训练的,在我看来是【以工程化的方式解决实际问题的能力】。工程化这个词蕴含的东西就很多了,包括:有效、高效、更强的可扩展性...于是为了达到这个目标,我们进行了面向对象、多线程编程,使用了不同的设计模式以及多种架构,学习了系统的调试、测试方法,掌握了规范性语言使代码规范化...

​ 从一main到底的完全面向过程式编程,到会提前思考程序架构、设计不同类和对象,我认为OO课程,尽管过程痛苦,对于我的能力锻炼和提升是显著的。我也十分感激这一学期的训练。

五、对课程的改进建议

  • 也许是我比较木讷,我感觉第三单元JML作业一上来提示很少,直接就照着JML写就以为完事儿了;而同时第三单元的中测又过弱(相较于其他单元),导致交上去的代码与实际能过强测的代码差距过大,在代码撰写阶段得不到特别充分的锻炼。希望可以给更多的提示,引导大家去进行一些架构和算法的优化;或者中测变强一些。
  • 希望能在course平台公布实验课成绩以及测试结果。
  • 希望在授课内容上内与实验课的联系更紧密;现在有一点点感觉理论和实践的割裂,实验上的问题大多靠自学完成。

六、线上学习OO课程的体会

单从课程内容上来说,oo课程线上或线下其实差距并不大。线上学习的主要挑战在于在家的自律性和与同学/老师的当面交流、讨论问题。作为本身自制能力一般、有问题很需要当面和同学讨论的类型,我在学期中间一度因自己de不出bug又无人交流感到很痛苦。我也相信,如果这学期的OO是在校完成,我会有更多的收获,也会获得更好的结果。(还是希望疫情早日过去、能早日返校吧。)

你可能感兴趣的:(OO第四单元作业总结)