面对对象 第四单元总结
面对对象 第四单元总结
本单元作业的架构设计
第一次作业
本次作业只需要对UML类图进行建模,虽然实际上官方代码中已经储存了各个元素的所有信息,但是为了更好地实现查询功能,我创建了自己的MyClass、MyInterface、MyOperation类,并在其中将元素与其他元素的联系存了起来,在进行查询时只需要调用其方法即可。
另外,在初始化类图时,由于可能出现某一个元素的依赖还没有存入模型中的情况,我进行了3个层次循环读入,由上至下逐一建模,保证所有元素的依赖均在其之前已经存入。
第二次作业
这次作业加入新的顺序图和状态图,仍然与上次相似,创建自己的类来建立相应的模型,之后设置相应的查询方法即可。
第三次作业
本次作业加入了模型的正确性判断,对于一些可以读入时便可判断的规则我直接设置了一个变量来判断是否成立,检测时只需对该变量进行判断即可完成,另外有需要使用相关的图算法来实现,但是实际上不会卡t,直接暴力搜索即可。
四个单元中架构设计及OO方法理解的演进
四次作业中总体架构的设计明显越来越好。实际上只有第一单元进行了大量的重构,第二单元的多线程实际上改动的是调度算法,并不能算大的架构改动,第三四单元便没有出现重构的情况了,都是从第一次一直迭代到最后一次作业。
第一单元是表达式求导,我使用的是表达式树架构。重构问题主要是对下次作业的要求没有预测到,没有好好设计对于不同表达式的构架。尤其是在第二次中加入了三角函数的求导,我的第一次架构只适于多项式相加的情况,对于三角函数根本无法解决,因此我第二次基本上重新写了一遍,第三次则为了性能分,将二叉树修改为了多叉树,实际上也算比较大的改动了。这次我逐渐对面对对象的思想的理解有了一定的提升,明白了如何进行类的设计来满足需要,同时利于后续迭代开发。
第二单元是多线程电梯,我使用的是集中式调度,让电梯自由竞争。所进行的大改主要是将电梯的调度算法进行了全部更改,主要的线程设计实际上没有进行过大的更改。这单元我主要学习的是多线程的设计,如何避免死锁和轮询。
第三单元是JML语言的学习,这个单元按JML书写就没什么大问题,学习了JML的理解和实现能力。
第四单元是UML的学习,我是按层次分别建模,实现自己的类从而实现查询。学习了UML的基本模型。
在四个单元中测试理解与实践的演进
在第一单元,我采用的是随机构造表达式样例,使用python来进行反向的梯度下降法随机生成,之后利用python的sympy来进行求导化简验证正确性。
在第二单元,我采用的是随机构造加手动构造,主要借鉴了前辈的代码,使用python的subprocess来实现数据的按时投放,实际上只要电梯能跑完就问题不大,我测试时经常出现的问题是由于调度算法的bug导致电梯来回死循环。
在第三单元,本来是应该使用JUnit来进行测试,但是尝试了一下实在不太好用,于是还是采用了之前的随机生成数据和同学对拍的方法。
在最后一单元,由于测试数据较难自动构造,我大部分都是直接手动构造,将题目中所描述的情况全部构造一遍,再通过官方包将mdj文件转换为输入数据。
课程收获
本学期的oo课程从四个方面展开,分别是层次化,多线程,规格化,模型化。每一次作业都对我面对对象的思想有一定的提升,第一单元带我走入了面对对象,第二单元带我学习了多线程,第三四单元带我学习了规格化和模型化。另外我们使用的git基本操作对我之后也有很大帮助,而课程组安排的互测也让我明白了测试的重要性,也学习了python的一些相关操作。
改进建议
- oo课程基本上对java的语法没有进行过详细的讲解,默认大家都会java,事实上在寒假之前我基本没有写过java,仅仅俩次pre的练习也只是让我明白了java的一些语法,但是对于容器的选择,容器操作的一些注意事项仍不是非常熟悉,希望课程组可以多增加一些java语法相关的教程
- 第一单元的迭代要求往往会造成大量的重构,我认为大家往往在第一单元出现大量重构而在第三四单元基本没重构很大程度上是题目的问题,第一单元三次作业要求很容易把之前的架构推翻,而三四单元的作业实际上课程组已经打好了主框架,因此也很难出现重构的情况。所以我认为可以第一单元时一次将三次作业的要求都发放出来,这样就可以减小同学们重构的概率。
- 第四单元的题目描述过于玄学,第三次作业甚至连样例都没有(或者说有,但是那个样例没有啥用,就跟让你实现一个计算器只给了一个1+1=2的样例),做个题目还要一个一个去讨论区翻这题目到底是什么意思,而讨论区还不人性,想找到自己需要的内容只能一个一个肉眼翻,效率实在低下。建议将题目意思表达清楚,讨论区设计合理一点。