面向对象的程序设计-模块四课程总结
[TOC]
壹·本单元两次作业的架构设计
本单元两次作业的架构设计中:
- 第一次作业 采用 类图 - 类 - 类中的其他元素 的架构进行设计和编码
在代码的复杂度控制上,MyUmlInteraction
中添加UmlElement
的方法,由于需要控制不同类型的UmlElement
添加的顺序,导致本方法的v(G)较高。 - 第二次作业 考虑到在作业要求中,状态图、顺序图和类图之间联系性不大,所以将三者分开处理。由
MyUmlGeneralInteraction
综合对于三个不同图(stateMap
,sequenceMap
,classMap
)的操作指令,并由类图完成各自需要的操作。在具体实现上,也采用了Lazy更新、缓存等机制来优化查询时间。
在代码复杂度控制方面,我在UmlGeneralInteraction
类中,对输入的UmlElement
进行了分级处理,导致本方法的v(G)过高。在类的复杂度控制方面,给对类图需要做的东西没有进行很好的拆分,导致其复杂度很高,影响了代码整体的质量。
贰·架构设计与OO方法理解的演进
四个单元的OO作业的设计,是一个架构越来越清晰的过程。从A.多项式求导作业时的数据结构写法,到逐渐能够分离问题、逐个分析,到最后代码的架构能够较为清晰地反应思维过程。能够运用一些设计模式来分析问题,解决问题。在第二单元的相关作业中,我看到了简单的多线程程序应当如何架构,和将程序功能分块解耦对于程序后续发展的重要性。
在第三单元的某次作业中,看到同组有的同学的架构并不是很好,这对后续修BUG是非常不友好的。这也提醒了我,一个良好的架构不论是对于程序正确性还是对于程序的后续改进都是非常必要的。在看自己的作业的过程中,也能看到前面的一些作业变量的命名不是非常规范,在编码的过程中也确实出现了变量名误用这类的bug,这也提醒自己在今后编程的过程中,在设计完成时一定要对变量名进行规范化的分层命名,防止误用。
叁·测试的演进
测试是整个作业完成过程中比较耗费时间的部分,也是对保证正确性比较重要的部分。在整个学期的OO学习中,我使用到的测试方法主要有 人眼Review + Junit测试 + 自动化测试 这几种方法,从静态到动态,从小规模到大规模、压力数据、边界数据,来保证代码的安全性。
静态测试
静态测试是检查代码逻辑性的重要手段,在编码的过程中,根据JML或者是编写的Javadoc来确定每个方法的具体用处和其规范,再逐个方法检查它的实现是否符合需求。这里需要注意的是在编码的过程中,就要逐层规范使用变量名,在便于检查的同时,也防止因为变量误用导致的失误发生。
小黄鸭Debug在测试过程中是非常有效的方法,但是一些时候,自己在看自己程序的过程中是不容易发现错误的,还是需要通过编写数据进行测试来发现bug。
Junit测试
单元测试对保证代码的质量同样非常重要。通过编写单元测试,可以对代码的正确性进行覆盖性测试,一些边界数据样例也能保证代码是符合我们要求的。
在个人编写单元测试的过程中,可能经常会觉得有些枯燥和无聊,所以会在一定程度上偷懒,而错误也是在这些不经意间的偷懒中产生的。例如在第三单元JML的第三次作业中,我在原本的代码的基础上拓展了新的功能,在使用Junit进行测试的过程中,我为新加入的代码编写的测试数据,而没有测试原来代码的正确性。然而自己在编码的过程中,对原本代码进行了一行的修改,也正是这一行,导致了那次强测中20个点只有2个是正确的。
自动化测试
自动化测试的有点在于其效率高,其测试的随机性可以对以上两种办法中涉及不到的点做较好的补充。自动化测试由于其生成的数据规模较大,构建的测试模型可以较为复杂,能够对代码进行较好的性能测试。
在本学期OO课程的四个单元中,我利用同学/自己的测试脚本对代码进行了测试,充分的自动化测试,基本上能够保证代码整体的正确性。在电梯作业中,使用自动化测试来绘制电梯在生命周期内的运行图,来获得得电梯调度性能更加直观的感受。
自动化测试也具有一定的缺点,一个是在数据生成的过程中,如果生成的数据不够全面,则不能很好地检查程序的全部内容;第二个是自动化的数据生成得到的一些数据可能并不是“最强”的,也即对程序的测试仍然不是完全的。
肆·课程收获
OO这门课就像是一个敲门砖,给我们打开了OOP的大门。在课程进行的过程中,很多知识很多方法,因为时间的仓促、每周作业的压力,都没有来得及去学,还是非常遗憾的。但是OO这门课却给我们大致介绍了OOP的大致框架,在今后自己进一步地探索和摸索的过程中,相信在本学期的学习中积累到的、收获到的都能够提供良好的帮助。相信OO课程更多地也是想要教会同学们方法,去学习更多的知识吧。
伍·OO课程改进
在本学期的OO课程中,无论从知识还是代码能力上都是有着进步的。
对于未来的OO课程,希望老师们能够更多地讲解设计模式等方面的细节。希望课程组能够多提供一些代码例程来帮助同学们更好地学习OO代码的书写方式。在测试方面,课程组也可以更多地提供一些Junit等测试方法的教程,能够更好地帮助同学们对代码进行测试。
一学期的OO课程过得很快,现在满眼还是当时完成寒假预备作业时的样子。
本学期的课程、实验和作业中,收获了很多。
感谢老师和助教学长们的辛勤付出。