OO第四单元暨学期总结

OO第四单元暨学期总结

一. 第四单元作业综述

  • 本单元代码作业依然是分为三次进行Java代码为基础的迭代开发,主要任务是通过实现官方接口userApi中的抽象方法完成对UML图的信息查询然后反馈输出结果(包括正常和异常抛出的情形)。

  • 具体来说,第一次作业的查询对象对类图,第二次作业的查询对象增加了状态图和顺序图,第三次作业则增加了查询信息时需要考虑的异常情形。

  • 作业目标是增加对UML图和相关描述的理解,并且使用Java编程语言进一步训练对面向对象思维的理解和基础图论算法的应用。

二. 架构设计

1. 第一次作业

  • 由于这一次只涉及类图分析,因此直接建立MyImpletation类实现userApi接口中的抽象方法。此外,建立了一个Assist类提供静态方法和静态字段来辅助MyImpletation中的方法实现。

  • 基本的数据结构

    • 充分利用hashMap。

    • 对于所有元素,整体上建立了一个元素id到对应元素映射的hashMap,也就是elements。

    • 对于具体的每一类元素,也建立了元素id到对应元素映射的hashMap,比如classElements、interfaceElements等。

    • 与此同时,为了便于统计耦合度、方法数,做了一个巧妙的设计,也就是使用sonElements这个hashMap存储元素id到对应子元素(包括直接的子元素和间接的子元素)对的映射,以及parametersIn,也是一个hashMap,来存储一个方法的id到对应参数集的hashMap的映射。

  • 作业代码UML类图如下

     

2. 第二次作业

  • 由于本次作业增加了状态图和顺序图的分析,如果再只使用一个建立MyImpletation类实现userApi接口中的所有抽象方法,将会使得MyImpletation类过于庞大。因此,我决定让MyImpletation类只完成对输入元素的分类解析,建立MyClassDiagram、MySequenceDiagram、 MyStatechartDiagram三个新的类获取分类解析后的元素,分别完成对类图、顺序图、状态图的解析。 Assist类的功能变为提供静态方法和静态字段来辅助以上三个类的方法实现。

  • 基本的数据结构

    • 本次作业的元素类别大幅增加,因而在MyImpletation类中增设了更多的具体类别的元素id到对应元素映射的hashMap

    • 在MyImpletation中设定了MyClassDiagram、MySequenceDiagram、 MyStatechartDiagram的三个对象作为字段。

  • 作业代码UML类图如下

    写在前面:富则入会员导出完整图片,穷则分部截图。

  •  

  •  

3. 第三次作业

  • 建立MyPreCheck类,通过获取MyImpletation类分类后的元素,完成对三种UML图异常的检测。Assist类需要增加对MyPreCheck类方法实现的辅助。

  • 基本的数据结构

    • 相对第二次作业,在MyImpletation类中进一步增加具体类别的元素id到对应元素映射的hashMap。

    • 在MyImpletation中设定了MyPreCheck类的对象作为字段。

  • 作业代码UML类图如下

    写在前面:富则入会员导出完整图片,穷则分部截图。

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

1. 第一单元——表达式

  • 学习过程

    • 此时的我还处于初学者状态,加之寒假预习不足,对面向对象思维参悟不透。

    • 首次作业以C语言面向过程的思维强行解决,然而第二次作业发现面向过程的方式已经无法有效处理,被迫重构。

      然而,由于学习方式的错误,以及时间安排不合理,第二次作业在经过了艰苦的尝试后没有在规定时间内完成而被判定无效。

      第三次作业吸取了教训,预留了足够的时间,在消除第二次作业的致命bug以后,成功在相对第二次作业小规模的改动后,首次实现了迭代开发。

    • 遗憾的是,第一单元直到最后我依然水平稚嫩,第三次作业只能采用难度降低的预解析模式,损失了不少分数。

  • 思维及OO方法演进

    • 熟悉语法,初步体验面向对象的思维方式。

    • 实现简单的迭代开发。

    • 掌握单一职责原则。

    • 奇妙地运用hashMap构造数据层次结构。

    • 理解hashMap有关key判定是否相同的机理,并且重写equals和hashcode方法。

2. 第二单元——电梯

  • 学习过程

    • 积极准备,反复参悟理解多线程的运作机理。

    • 充分解析上机实验关于请假的例程,以此为整个单元作业的基本框架。

    • 三次通宵达旦艰苦奋战,三次强测总计仅仅tle一个测试点。

  • 思维及OO方法演进

    • 进一步熟悉语法,开始真正理解面向对象的思维。

    • 未曾重构,深入体会迭代开发。

    • 通过对多线程切换和调度过程的思考,理解对象的关联。

    • 深入体会并恰当运用生产者--消费者模式。

    • 单例模式和工厂模式协助代码维护。

    • 精妙的有限状态机的设计,把计组学到的知识运用在面向对象课程中。

    • 架构设计上更加重视SOLID原则的要求。

3. 第三单元——JML

  • 学习过程

    • 阅读JML手册。

    • 学习图论算法。

    • 请教同学,以优化算法,提高性能,避免失误。

    • 依然是三次艰苦卓绝的奋斗,仅仅在第一次大意错误三个测试点。

  • 思维及OO方法演进

    • 面向对象思维渐臻成熟。

    • 充分感受类的继承和接口实现关系。

    • 熟练掌握JML规格的读与写。

    • 在面向对象的语言中进行树和图的数据结构的构建。

    • 以辅助类协助主类。

    • 拓展使用官方包,如javafx.util.Pair。

4. 第四单元——UML

  • 学习过程

    • 系统学习UML语言,以及类图、顺序图、状态图的概念。

    • 反复请教助教学长,加深概念理解。

    • 最后三次艰苦奋斗,最后一次作业一气呵成,强测全部顺利通过。

  • 思维及OO方法演进

    • 面向对象思维基本熟练成型。

    • 能进行漂亮的数据输入解析处理,漂亮的架构设计。

    • 辅助类的静态方法和字段的使用娴熟。

    • 性能优化意识显著。

    • 类与类的关联认识更加深刻。

    • 代码简洁漂亮,代码风格优良,语句含义明显。

四. 测试理解与实践的演进

1. 第一单元——表达式

  • 白盒测试:直接阅读代码,寻找逻辑漏洞。

    • 优点:偶尔能够解决构造数据难以涉及的bug。

    • 缺点:效果一般,费时费力,难以寻找出全部的bug。

  • 黑盒测试:搭建简易评测机,借助正则表达式随机生成测试数据,将生成数据输入待测试程序获得输出,配合对拍程序与他人结果比对。

    • 优点:可以较好地对边界情况测试。

    • 缺点:覆盖率有限。

2. 第二单元——电梯

  • 黑盒测试:搭建评测机,通过控制参数获得乘客请求和新增电梯数据,并且保证数据的量足够庞大,测试运行时间,验证方法使用了有限状态机的思维。

    • 优点:可以采用linux的计时工具进行运行时间的测试,支持多人测试以加快测试速度。

    • 缺点:bug时常无法复现,这是一个很头疼的问题。

3. 第三单元——JML

  • 单元测试:利用Junit进行测试,第三单元指导书推荐。

    • 优点:可以实现对于方法的精准测试,同时保证测试的覆盖率。

    • 缺点:数据需要手搓,完整测试时间周期长,效率低下。

  • 黑盒测试:搭建评测机,控制参数生成固定比例的各类随机数据。

    • 优点:省去了不习惯单元测试的麻烦。

    • 缺点:数据难以构造,覆盖率很有限。

4. 第四单元——UML

白盒测试:先使用starUML画比较极端的图,然后人工提取标准格式的输入数据,输入测试程序进行测试,判断是否符合预期结果。

  • 优点:稳定,操作简单。

  • 缺点:覆盖率极其有限。

黑盒测试:自己这次实在不会搭建评测机了,使用大佬的评测机对拍。

  • 优点:准确可靠,安全高效。

  • 缺点:坐享其成,缺乏锻炼。

五. 课程收获

  • 成功建立面向对象思维,从而摆脱面向过程的单一思维模式。

  • 了解多线程的运作机理,进一步打开编程世界认知的大门。

  • 首次学以致用,将计算机组成原理中的有限状态机思想引入面向对象编程实现课程的交叉融合。

  • 补习图论算法和堆栈理论,夯实编程基础,加深数据结构的理解。

  • 搭建评测机和构造数据的能力有所提升。

  • 学会使用git进行简单的代码管理。

  • 充分体会迭代开发的乐趣。

  • 意识到自己的学习方法和时间安排的不合理,及时做出调整。

  • 明白自己的能力存在很多不足,未来还有很多挑战要经历。

  • 明白交流和对拍的重要性,拒绝闭门造车。

  • 抗压和熬夜能力得到十足锻炼。

六. 课程建议

  • 希望未来能至少在开学第一周不要布置代码作业,给同学们一个缓冲期去适应面向对象的节奏和思维。毕竟,普通人大有人在,这门课程对普通人还是挺难的。

  • 调整单元顺序,我认为最适合做第一单元的就是JML单元,这个单元可以充分引导同学们体会继承、实现等必备语法的使用,借助固定的规格和模式体验面向对象思维,是很好的教学材料。

  • 给出评测机搭建教程,第二单元和第三单元还是挺难搭建出覆盖率高的评测机,对于小白而言更是难上加难。如果有教程,或许人人都会评测机搭建不再是梦想。

  • 取消互测或者取消互测被hack的扣分。咱们的OO平台不是codeforce,写完代码已经够累了,搭建评测机自测和对拍也很费劲了,还要增加一天的时间去hack或者在被hack以后修复bug,是一件挺折腾人的事情。互测,最多让喜欢hack的同学加分就行了,真的不是每个人都愿意参与互测过程。

七. 课程感受

  一个学期的OO课程学习经历行将随着我的这段话结束。从起初的一无所知和由此产生的彷徨和恐惧乃至于愤恨,到如今轻车熟路驾驭面向对象思维的自然和淡定,这样的转变,是以我接近10个通宵挑灯夜战为代价驱动的。其间太多辛酸,所幸我坚持下来了,所幸一直有朋友陪伴,翘楚提携。我的确是一个编程能力至少在计算机学院乏善可陈的普通人,OO课程学习成绩难言优秀,我深知,革命尚未成功,同志任需努力,OO课程的结束绝不意味着OO学习的终结。未来,我希望进一步训练自己的面向对象思维,也希望能够应对更多种类的编程挑战,这是我追求计算机科学研究梦想的前提准备。此刻,竟然对平日让我感到痛苦的OO课程感到些许不舍,或许,无意间已经喜欢上这门课程了吧。

posted @ 2022-06-26 03:36  cfmcyl1024  阅读(65)  评论(0编辑  收藏  举报