BUAA OO 2022 第四单元
一、本单元架构设计
-
整体思路都是把elements按轮次读入并维护uml图的结构
-
把umlElement作为MyClass、MyInterface等类的构造参数,存贮便于查询指令的信息。
h13
h14
h15
二、架构设计思维及OO方法理解的演进
第一单元:表达式的化简与计算
- 在面向对象方面,我主要按照课程组提供的实验代码的思路,把因子作为接口,让表达式继承因子接口,让因子作为项的聚合。我认为这也是第一单元作业的关键,把面向对象的层次建立完以后,很自然地可以使用递归下降的思路进行拆分。
- 然而回看第一单元的不足也是显而易见的,我在表达式的拆分使用了基于面向对象的递归下降,而计算过程使用了后缀表达式的面向过程思想,所以并没有非常完美地做到面向对象。
第二单元:电梯调度
- 此单元的面向对象主要用于横向和纵向电梯调度器实现同一个调度器接口,从而提高代码的复用性;以及调度器对象和电梯对象互相协作,进行多线程的信息传输。 多线程单元中,我对于对象之间的依赖和聚合关系有了更多的使用和理解,从而进行多线程协作,保证了横向电梯和纵向电梯的交互。
第三单元:jml社交网络
- 本单元的架构设计基本被jml规定好,在面向对象的设计规范方面对于设计的规范性加强了理解,比如异常抛出的层次。
第四单元:uml建图
- 此单元我对于类的功能解耦合有了强化练习。由于类有500行的限制,所以要求MyImplementation把功能分散到更多的类中,达到解耦合的目的。
- 由于uml本身存在清晰的结构化模型,所以可以按照class-operation-parameter等结构建模。
三、测试理解与实践的演进
-
第一单元是首次做面向对象课程的作业,任务量比较大,面向对象的技巧也不够,所以评测时间相对较少,主要是自己按照所有情况分类讨论,手动构造功能测试和边界测试。后来第二次作业测试不够导致被hack,所以第三次作业使用了python的sypmy库进行评测机的测试。
-
第二单元是电梯单元,主要采用自动评测机的方式,不过这随机测试方式有一定随机性,本地评测的bug有时难复现。hw5和hw6的评测机并没有发现bug。hw7的评测机本地运行发现了bug但是没有提交成功。评测机主要用于正确性测试,适合作业前期自测正确性。
另一种hack策略时针对特定线程安全的bug手动造数据,比如hw5时的线程输出安全问题,hw7时不可达的横线电梯出现的轮询问题。hw7时hack到一个横向电梯轮询的Bug。手动hack策略覆盖范围不如自动评测,但是效率和命中率较好。超时和轮询的bug比较难通过评测机显现,所以更需要针对特殊情况手动造数据。
-
第三单元是JML规格构造测试数据,需要兼顾正常行为和异常行为,并且设置边界数据。本单元在自动评测时引入了时间参数,对于高复杂度的指令需要保证指令条数足够多,测试是否超时。此外,随机数据不能保证把各种异常类型的组合完全覆盖,需要手动构造特定异常的测试数据保证完备性。
-
第四单元的测试主要是通过绘制uml类图,然后使用课程组提供的Jar包导出测试数据。本单元的测试感受是明显体会到jml对于评测机的编写很有优势,第四单元的要求比较特殊,所以比较难自动评测,主要依靠手动构造测试数据。
四、课程收获
- 在面向对象与构造课程中,我的收获是对于项目的合理构建与布局有了初步探索,对于面向对象程序设计有了初步学习,编码更加注重层次性、规范性。
- 开始自己动手写评测机,在对数据的完备性和规范性的约束上多次迭代,从测试程序的不断完善中体验到测试的技巧和乐趣,对于作业的结构设计有了更多的优化空间。
- 课程引入的互测模式让我可以阅读同学们的代码,了解不同的架构设计。同时,互测也让我进一步认识到测试的重要性,当程序的基本功能测试完成后,还要注重边界数据的测试。
- 课程的研讨课给课程同学们提供了一个互相交流的平台,让大家可以把自己对于各单元的深入理解分享出来,在课程内容的主干方面做了很多扩展与延申。
五、具体改进建议
- 第三单元和第四单元合并。或者第三单元和第四单元调换顺序。第四单元的要求叙述清楚比较困难,虽然课程组尽力叙述,但是仍然有些过于混沌,这却是jml的优势所在,所以三四单元合并是一个可行的方案;第三单元作业要求描述比第四单元清晰,难度低于第四单元,所以希望后两个单元可以调换顺序,让简单一些的第三单元作为烤漆周的作业。
- 实验上机课希望提前。2022届的OO课程安排是周一晚发布实验、周四上午上机实验、周六晚作业截止。然而实验代码对于作业是非常有启发性和指导意义的,实验周四会造成周一到周三没有头绪,而周四到周六会面临重构或者按照实验代码思路从头开始,算上测试的时间,会比较紧张。
- 叙述不清的规则,建议指导书增加样例对比说明、或者代码片段说明、或者画图说明,建议选用三者之一的形式,要比第四单元大篇幅使用文字性的干巴巴的叙述直观清晰地多。