北航OO(2020)第四单元博客作业暨课程总结博客
北航OO(2020)第四单元博客作业暨课程总结博客
本单元作业的架构设计
架构设计及OO方法理解的演进
四个单元中测试理解与实践的演进
课程收获
关于课程的一些建议
OO线上学习体会
本单元作业的架构设计
在本单元中,由于UML图具有比较清晰的树形结构,因此我对其中需要进行查询操作的元素进行了包装,在树的父节点中存储所有孩子的引用。考虑到性能问题,我采用了缓存机制,一次查询后尽可能缓存已经遍历过的信息,以减少遍历次数。
本单元我对架构没有做出修改,只是进行了增量开发。因此,下面展示本单元第三次作业的UML类图并进行分析:
在本单元作业中,我采用Main类作为主控类,MyUmlGeneralInteraction类实现相应的接口,并将UML元素分派给三种图类进行构造,同时调用三种图类中的相应方法进行查询和验证。ClassModelDiagiam、CollaborationDiagram和StateChartDiagram三个类分别对应类图、顺序图和状态图,它们管理相应的Elements并处理查询和验证操作。
架构设计及OO方法理解的演进
在四个单元的作业中,我的架构设计从最初的按照数据简单拆分类,并将相应的方法封装到类中,演进到现在的结合数据特点、类之间的关联关系以及一些OO原则和设计模式进行类的构建,并由此设计出类中的属性和方法。
通过一学期OO课程的学习,我对面向对象的理解从简单拆分类演进到各种设计模式和设计原则,并看到了OO带来的好处:模块化、层次化、可扩展性和隐藏实现细节等。在作业开发的过程中,我从最开始的直接编码,逐渐演进成现在的先进行架构设计,确定每个类中的属性和方法,以及类之间如何进行交互。这样,在最后只需要对方法进行填充即可。这也体现了一些设计和实现分开的思想。
四个单元中测试理解与实践的演进
测试是我在本学期中比较薄弱的环节。在前两个单元中,我主要依靠人工构造一些数据对程序进行测试。虽然人工构造可以覆盖一些极端的边界情况,但仍不及自动化的对拍测试高效全面。这导致我在第一单元第三次作业中出现了Wrong Format判断错误的情况。而且对于多线程程序来说,人工构造数据并进行验证的效率更为低下。
在第三单元中,我主要依靠JUnit进行单元测试,并与他人程序进行对拍。由于JUnit可以查看覆盖率数据,并可以方便地进行回归测试,在开发阶段的测试还是比较方便的。对拍测试通过大量数据的生成来达到覆盖测试的目的,实际效果也十分不错,帮助我发现了一些bug。在这两种测试手段的帮助下,我无伤通关了本单元的测试。
在第四单元中,由于需要画图,我的测试手段又回归了人工构造数据。果不其然,在最后一次作业中再次出现了循环继承判断错误的情况。由此可见,一定程度上的自动化测试还是十分必要的。
课程收获
通过OO课程的学习,我了解了面向对象的基本原则和一些设计模式,掌握了Java中小型程序设计,入门了多线程程序设计以及规格化和模型化设计。
在第一单元中,我接触了层次化设计的思想以及抽象、封装、继承和多态等基本OO特性,并在三次作业的训练中,逐步使得自己的程序有了一些OO的特点。
在第二单元中,我接触了多线程程序的设计,并学习了线程同步的一些方法和经典的生产者-消费者设计模式。通过三次电梯作业的训练,我初步掌握了多线程程序的同步方法。
在第三单元中,我接触了规格化程序设计,并了解了JML这种建模语言。虽然在如今的互联网软件开发中,如此严格的形式化规格表述并不常见,但形式化的规格方便进行严格的正确性验证,可以应用在高可靠性领域。
在第四单元中,我接触了模型化设计,并了解了UML这种建模语言。通过作业训练和实验训练,我从结构层次和应用两方面认识了UML。
通过12次代码作业的训练,我的Java代码量达到了数千行。在这个过程中,我也逐步上手了Java中小型程序设计的一些基本方法。
关于课程的一些建议
建议控制课程时长,尽量不要在临近考期时布置大量任务;
建议互换第二单元与第三单元的顺序,在平衡难度的同时可以与OS课程进行更好的衔接(这样可以在OS介绍完进程同步后再开始接触多线程程序设计,降低同学们的上手难度);
建议UML部分将讨论区的文件结构介绍整合成参考手册下发给大家,可以降低大家第一次作业的上手难度。
OO线上学习体会
OO课程受线上教学带来的影响较小,仅仅是理论课部分不再能进行现场交互了。这一点通过课堂讨论和课后问卷得到了一定程度上的弥补。但是我认为一些课堂讨论题难度较大,不适合在课后立刻进行讨论,因此一定程度上影响了讨论的效果。