OO第四单元总结+课程总结

OO第四单元总结+课程总结

本单元作业架构设计

本单元实现了一个UML解析器,第一次作业对类图进行建模,实现一些查询的接口;第二次作业对顺序图、状态图进行建模,同样实现一些查询的接口;第三次作业则对一些规则进行了检查。

在实现第一次作业的时候,由于第一次接触UML图,指导手册看得云里雾里,不是很明白,自己总结了一下类图的结构才明白。

第一次作业

通过hashmap把element存起来后再统一建模,把需要的信息存在了自己新设计的类里面,并封装了一些方法便于查询。

这里用MyTop作为MyClass以及MyInterface的父类,这样可以把关联、继承等类和接口都有的一些功能一起写。

第二次作业

这里由于加入了顺序图以及状态图的查询,原来的架构中的MyImplementation类行数超过了checkstyle的代码风格要求,因此把顺序图、状态图的指令交互另外摘出写成了MyStateChartInteraction以及MyCollaborationInteraction,其中MyStateMachine以及MyInteraction充当画布作用,有更小的部件如MyState,MyLifeline,MyMessage。

第三次作业

这一单元增加了一些规则的检查,干脆把类图的指令交互也拿了出来,多了一个MyClassMapInteraction。其他的架构与前两次作业基本相同。

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

经过一学期,感觉对oop有了更深入的理解。以前一直觉得oop就是为了能避免造轮子,减少工作量,但是后来发现oop更重要的是能化简为零,让程序设计更像现实生活中的万事万物,如果每一个部件运作良好,那么总体的性能也会很好。特别是在进行小组合作开发或者独自开发大型的软件的时候,能快速分工,定位bug或者性能较差的地方,进行更好的开发。

  • 第一单元:表达式化简

    这个单元学会了递归下降,初步接触了层次化设计的概念,对java语言的运用更加熟练。其实是寒假没有做pre

    运用了工厂模式,生产不同的表达式元素,并且在一次次作业的迭代开发过程中体会了增量开发的思想。

  • 第二单元:多线程电梯

    在这个单元中第一次接触多线程,最主要的是需要保证对关键的部分上锁,如果上锁范围较大则容易造成电梯运行过慢,多线程退化为类似单线程,而关键部分如果不上锁会出现线程不安全的情况。同时除了synchronized以外尝试使用了更加灵活的不同种类的lock,及对应的用condition唤醒的方法。从单部电梯到多层多栋横竖动态增加电梯,每次作业都在上一次基础上进行拓展,实现了代码复用。

  • 第三单元:JML

    这一个单元主要在尝试阅读理解JML,尝试掌握JML规格以及尝试自己编写相应的JML,体会到了规格化设计的重要性。

  • 第四单元:UML

    了解了UML模型,在读不懂指导书的情况下,通过自己建模以及单元要求的合法性检查,对UML图的理解更加完善。

测试理解与实践演进

  • 第一单元

    使用python的numpy库直接对化简结果进行了检验,但由于精度问题,部分较大的数在评测时会产生较大误差判别成错误。而且测试的时候只注重结果的正确性而没有对化简格式进行检测,因此没有测出来类似于1**3这样的不符合输出格式的bug。

  • 第二单元

    针对本单元的要求更改了一下github上找到的评测机,主要是通过多次跑相同的大量数据找到线程不安全的地方来debug,并通过计CPU使用时间避免轮询发生。但最后没有轮询还是ctle了一个点

  • 第三、四单元

    这两单元主要使用对拍,由于输出唯一,通过生成大量数据和随机指令,与其他同学进行对拍。同时采用手动枚举部分指令的方法,保证cpu使用时间不会超过限制。

课程收获

除了学习了课程要求掌握的面向对象程序设计方法、多线程编程、规格化编程、uml建模等知识,还在写作业的时候收获了不少别的:

  • 学会了递归下降,为以后写parser打下了基础
  • 接触了look算法等电梯算法,对OS理论课内容加深了理解
  • 认识并尝试使用了各种设计模式,例如第一单元的工厂模式,第二单元的生产者消费者模式,还有实验课遇到的流水线模式、单例模式,课堂上讲的迭代器模式,在写作业的时候都有尝试使用
  • 预习复习了一些图论的简单算法
  • 规范了代码风格,在写代码时有意识的注意架构、写注释,增加代码的美观性、可读性

改进建议

  • 可以把预习部分放在刚开学的时候,并且给多一点时间让同学们进行预习。在没有任何java语言基础并且编程基础相对薄弱的情况下,较短时间内入门并且完成第一单元的作业真的比较痛苦 是我太菜了
  • 实验课增加反馈结果,每次上机都不清楚自己写的程序有没有bug,不了解潜在的一些坑,导致实验的效果不是很明显。如果是为了锻炼我们自己测试的能力,可以不实时反馈,每个单元或者上机结束后公布,并且提供通道让大家自行评测(不计分),这样或许更能让我们清楚自己对内容的掌握程度。
  • 第四单元的指导书和要求写得有点令人疑惑,能否在指导书中加多一点与实际作业相关的例子,比如像每次提交作业前要做的那种测验题目。
  • 降低互测强度,减少性能分占比。毕竟在OS等其他课程的时间压榨下很难有时间去写评测机或者花大量时间阅读其他人的代码找bug。性能方面,个人认为作业评测应该更注重正确性而不是相对其他人的性能优秀程度,本人曾经试过每一个点都ac但由于性能太差到了B房。是否能更改一下算法中性能分的占比,这样也会减少出现卷性能翻车的情况
posted @ 2022-06-27 12:43  peaceminuczy  阅读(46)  评论(1编辑  收藏  举报