第四单元总结性博客作业

第四单元总结性博客作业

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

    我认为本单元的三次作业独立性比较高,后面的作业不需要对前面的作业进行修改,只需要继续添加功能即可。本单元第一次作业是类图分析,第二次作业加入了顺序图和状态图分析,第三次作业加入了模型有效性检查。在刚刚接手第一次作业的时候,因为我平时的学习习惯比较差,上课的时候没有很认真地听讲,因此我对类图里的元素很陌生,公共仓库里的第四单元手册也只是讲了顺序图和状态图的元素。我先在博客园上看助教们的博客,并没有一篇系统地讲类图;我又在csdn上刨食,终于在某个角落里找到了某位学长(学姐)总结的UmlElement以及每个元素属性的含义。

    在我大致了解了类图元素以及属性的含义之后,我就直接开始写类图查询指令了,并没有充分的构思结构,没有对一些重要的UmlElement建新类。这样做的后果就是我用了非常多的HashMap、HashMap套HashMap、HashMap套两个HashMap......在经历了一晚的沉淀(睡眠)之后,准备写类的操作可见性之前,我终于意识到了问题的严重性,果断选择了重构,并且谴责了我之前的行为。如果我的博客有幸能够被后来人看到,我给出一个建议:如果已经看到了一个结构的局限性,那就一定要重构。在选择重构之后,我仅仅用了一个多小时就完成了之前四五个小时才肝出来的进度。

    在整体结构方面,我想到的新结构就是,对拥有层次结构的比较重要的UmlElement建新类,比如UmlClass,一个UmlClass里会有多个UmlAttribute、UmlOperation,那么我就可以把UmlClass单独建类(MyClass);UmlOperation里会有多个UmlParameter,那么我就可以把UmlOperation单独建类(MyOperation)......

    在性能方面,由于本单元作业是一次性输入完之后再查询,那么对于查询数量比较大的数据而言,使用预处理的方式(在发起询问之前提前把答案算出来)是比较快的方法。本单元的三次作业都存在单向图的问题,直接照搬第三单元的并查集就不现实了,只能用dfs深搜来解决。

    在代码风格方面,由于每个java文件最多500行,我就直接把类图处理、顺序图状态图处理、有效性检查从MyImplementation中拎出来单独建类了,让MyImplementation调用这几个类,把自己作为参数传进去,这几个类计算并修改MyImplementation内部参数,这样就解决了MyImplementation超量的问题。

  • 总结自己在四个单元中架构设计思维及OO方法理解的演进

    第一单元时间比较赶,我在开学前并没有做好准备,因此我在第一单元基本上是套着面向对象外皮的面向过程,架构设计也是参考了讨论区的大佬发的贴子,但是这段时间我快速积累了java语法,也算是有所收获。

    第二单元是多线程,刚刚补完java语法的我再次陷入了苦海,但是相比于第一单元还是轻松一些。架构设计采用了横向电梯与纵向电梯分离,使用纵向座、纵向层、横向层、横向座的结构存储人员数据,调度策略也是使用了指导书里的ALS策略,没有写调度器使用了自由竞争的策略。在这一单元中我才开始真正地面向对象编程,开始有意识地抽象实例为类。

    第三单元是JML,这个单元虽然是这几个单元里最简单的,但却是我失分最严重的单元。我完全是按照给定的JML补全代码,并没有过多考虑性能,因此出现了超时问题,第二次虽然考虑了时间复杂度,但是还是没有跳出固有思维,没有采用更快的预处理模式,出现的超时问题更多了。虽然这一单元分拿的比较少,但是我认为JML是一个能把编程过程抽象化的工具,是有着抽象美的。

    第四单元是UML,这个单元第一次作业比较折磨,因为那时的我对类图元素和属性知之甚少。在这一单元我意识到了一个相对有序、有体系的架构不仅会让写代码的过程非常顺畅,而且在后期的维护中优势也很明显。

  • 总结自己在四个单元中测试理解与实践的演进

    第一单元的测试就是几个同学一起手搓数据,然后各自跑一下对答案。第二单元的测试已经有同学写样例生成器了,但是我能力比较差,已经在oo和os每周的任务中喘不来气了,也没有心思尝试,在测完指导书中的样例之后,索性把评测机当测试工具,也自己手搓了一些、问其他同学要了一些来测试。第三单元因为有了JML的加持,更多的时间是在对照JML和代码,基本上都是一遍过,也没有很多测试的机会。第四单元由于指令之间相互独立,出现错误比较容易判断错误位置,因此采用的是点对点测试,比较容易实现。

  • 总结自己的课程收获

    OO不愧是六系名课,每周作业的高压像一只无形的手在推动着我不停学习,与同龄人之间的差距也让我意识到自己有很多不足。我认为OO带给我的收获有以下几方面:

    编程能力方面。我的代码能力真的很一般,上大学前完全没接触,大一的程序设计和数据结构也都是90分左右,也有很多学不懂的地方,我能进入六系几乎要归功于我高数学的比较好。对我而言,在一周之内从Git、Java环境、IDEA的安装开始,到能够运用容器、建类解决问题,是一个很大的挑战,让我的代码能力有了一些进步,也带给我很大的成就感,而这些要感谢第一单元的无情push。

    心理建设方面。在OO课上我也认识到自己可能真的不够聪明,虽然不能轻言放弃但是即便失败了也不能破坏情绪。比如第一次作业我因为一个数据点过不了,没交上有效作业,虽然感觉有点难过,毕竟开局不顺利,但是我还是在吃了顿夜宵之后再次回到电脑前改bug,这是对我心态的考验。

  • 立足于自己的体会给课程提三个具体的改进建议

    首先,我认为像我这样在开学之前完全没预习的人不止我一个,所以说打好预防针是很重要的,我建议把预习部分作为算分的作业布置在假期里,这样才能调动我这样的懒狗的积极性。

    其次,我认为应该适当地加强中测,并且开放这些比较强的数据。中测太简单太容易过会让人产生麻痹心理,可能有的人过了中测就不再管了(比如我),如果有几个比较强的中测卡着我,我肯定会一直debug。但是中测太强可能导致有人过不了中测,我认为可以在周六早上开放这些比较强的中测数据,起码让我们知道问题出现在什么位置。

    最后,我认为指导书有值得改进之处。可以在指导书中加入一些基础知识,比如JML类图元素的属性。还可以多给一些测试样例,照顾一下没有精力写自动评测机的同学。

posted @ 2022-06-27 00:32  Albert_ZYT  阅读(13)  评论(0编辑  收藏  举报