一:本单元两次作业的架构设计
第一次作业:
第一次作业要求实现一个MyUmlInteraction类,在数据的存储方面,我的思路是用三种结构来分别存储这些umlelement,这三种结构分别是:(1)直接按elementType分类用hashmap存这些elements。(2)用树状结构存储,存储依据是每个元素的parentid 。(3)用树状结构存储,存储依据是每个元素的继承关系。这三个结构显然是为实现不同的功能服务的。当涉及继承关系时候,用第三种结构实现查询显然效率更高,而当实现操作,属性等查询时使用第二种更高效,总而言之,实现多种结构存储的需求导向是功能。
除此之外,本次作业实现了缓存机制,避免重复计算,缩短查询时间,提高效率。
第二次作业:
这次作业新增加了两种uml图,但是通过观察这两种新增的图要求实现的6个方法可以发现,和上一次作业类似,用上一次作业的架构能够轻而易举的实现。有一点不同,就是这次作业增加了一个"连通性分析"需求,因此为了高效的实现这个功能,在上一次的基础上增加了图的结构。
类图:
二:四个单元中架构设计以及oo方法理解的演进
2.1 多项式求导
第一次作业就是带有一点面向对象思想的面向过程法,没啥架构。
后两次作业是面向过程向面向对象转变期,把写代码的思想扭过来了,模式方面也学了一些,比如抽象工厂等,但是本单元关注点还在java语法的熟悉上,尤其是正则表达式。
2.2 电梯
电梯作业我觉得是oo最接近实际工作的一次作业,而且很oo。为什么说接近实际工作呢,首先,虽然我们实现的电梯很傻瓜,功能也很简单,但是确确实实是实现了生活中存在的电梯,其次,三次作业在原来的基础上不断地改需求以及新增功能更加复杂的需求,极大的锻炼了我们代码的可扩展性能力。然后为什么很oo呢,这次作业是多线程作业,把电梯,人,调度器单独实现类,作为对象考虑,则很容易理清其中的关系,如果用面向过程的思想来写这次作业很难下手,并且写出来了也很难维护以及debug,且代码扩展性极差,基本要重构。因此这次作业我觉得功能在于加深面向对象思想的理解。
2.3 JML规格
这单元学习的是规格化设计,即通过先设计规格,再实现代码的工程化设计思想,然而jml三次作业感觉很数据结构,这个单元虽然学的是jml规格化设计,学习代码架构的设计,然而作业却是数据结构课似的要求,一味地在性能,算法上做出限制,要求实现的功能也是典型的数据结构课要求实现的功能。因此这三次作业都是建图,实现缓存机制。这次作业主要功能是学习的就是规格化设计的工程化思想。
2.4 UML图
架构参见一,本次作业学习了uml各种图的知识,uml是统一建模语言,适用于复杂工程实现。这是软件架构层次上的学习。
2.5 总结
从上述四次作业分析可以看出,四次作业oo方法理解的演进循序渐进,层层递进,从基本的java语法与一些面向对象思想,到面向对象思想的高阶应用,再到规格化设计的工程化思想,最后软件架构层次上的学习。
三:四个单元中测试理解与实践的演进
第一个单元的第一次作业测试理解只停留在手工构造测试数据以及人工测试,效率极低。后两次作业学乖了,使用对拍加人工测试,解放了劳动力。第二个单元作业是电梯,因此通过写脚本进行测试。第三单元学的是JML,因此使用工具Junit和OpenJml进行单元化测试,不仅能发现bug,还能精准定位bug在哪个方法。第四单元由于必须通过画图才能得到测试数据,因此测试方法为先设计测试要点,再根据测试要点手动画图,然后生成测试数据。
四:课程收获
4.1 学会了java语言的基础知识
4.2 学习了面向对象的分析问题的思想
4.3 学会了一些架构设计模式以及工程化的设计思想
4.4 学会了很多高效的测试方法
4.5 学会了在写代码时注意考虑优化代码的可维护性,扩展性等结构性问题
五:具体改进建议
(1)实验课建议:建议不要刚上完理论课就开始上实验课,中间没有理解理论课学习内容的时间,感觉这样学习效果不是很好。
(2)指导书建议:建议指导书关于要求以及限制等方面描述的细致清楚一点,前几次作业还好,最后一次作业指导书关于有些方法的要求以及数据限制根本没有写清楚,然后等自己写完了发现评论区发了新帖改需求就很头疼,也浪费了很多时间,所以希望指导书在这方面改进一下。
(3)作业测试建议:建议中测不要太简单,毕竟有时候可能自己课下测试疏忽了某方面的测试,导致课下测的没问题,然后中测也过了,但是强测崩盘的现象。
六:最后
这个学期oo真的使我学到了很多东西,虽然有些地方待完善,但是我觉得助教和老师已经付出了很大的努力让我们在学到知识的同时有一个不错的oo体验,因此非常感谢老师助教们的辛勤付出!