OOP第四次作业
一、第四单元两次作业的架构设计
1.第一次作业
需求分析:其实就是要将这些解析好的数据组织成一定的结构,满足指令查询的要求,同时满足一定时间复杂度的要求(貌似复杂度不容易炸)
测试以及公测:整体细节还是比较多的,这也需要自己理解,还是挺容易遗漏一些细节的,所幸经过一些测试公测并没有出错
类图如下:
2.第二次作业
需求分析:其实就是在之前的基础上多实现了状态图以及流程图的查询功能,外加一部分的规则检测。同样新加两个类(MyStateMachine
和MyInteraction
)、同时通过DFS
和染色等方法对整个模型进行有效性检查
架构设计:在原来的基础上新增对新出现的数据的处理,然后在模型构造完毕后,依此对模型进行有效性检查,在检查时顺便把第一次计算较为复杂的查询操作缓存好(getInterfaceList
)
测试以及公测:在课下测试还是遇到一些问题的,由于有效性检查的需要,第一次作业的部分操作就不需要再次进行计算(getInterfaceList
),于是我违反了SOLID原则改了第一次的代码(找了一天的bug),以后的设计还是不要改动之前的代码为好。还有就是这次作业的需求是在有点不清楚,造成了代码的反复横跳可能这就是以后的常态吧。公测幸运的没有错误。
类图如下:
二、总结四个单元的设计架构
-
在第一单元还是遭受到了
OO
的恶意的,每次作业都需要进行大幅度的重构,对我的帮助还是很大的,在之后吸取了经验考虑了可能的需求方向,设计出来的架构也就比较容易扩展了 -
在第二单元,架构还是整体比较满意的,除了第一二次作业改了调度算法,第二次到第三次作业也就只新增了新扩展的换乘功能以及楼层限制,架构还是自我感觉比较良好的
-
在第三单元,历次作业只是新增了一些查询指令的需求,对程序进行扩展,那些数据的存储方式等架构并没有大的改变
-
第四次作业,自己自作主张对之前的架构进行调整,就导致自己
de
了一天的bug,还是需要遵循SOLID原则,大体的结构仍旧没有大的变化 -
在这四个单元的作业中,从最初的不加思考草率开工次次重构,到最后谨慎思考分析轻松扩展,我的
OO
之旅还是非常有收货的,在这里感谢各位助教的辛勤付出
三、测试方法的演进
-
在第一单元时,还没有构造对拍器的意识,还是以手动构造数据测试集为主的测试
-
到了第二单元,由于定时输入的需求,我开始尝试构造数据生成器以及对拍器对自己的程序进行大规模的测试,同时与自己的手动构造数据相结合,并且在互测时也表现良好
-
到了第三单元之后,同样沿袭了之前的数据生成器+Judge的测试方法,对自己的程序进行测试,还结合
Junit
,对各个单元进行测试 -
由于采取了这些测试方法,在公测和互测前基本就找到了自己的bug,在第一单元有两次作业被发现了bug,在第二单元只有一次作业被发现了bug,之后就没有被找到bug了,我感觉这还是在
OO
学习了许多测试方法所取得的进步
四、总结自己的课程收获
-
首先最浅显的就是学习了
java
这一门语言、掌握了正则表达式、多线程、java
天下第一JML
、UML
这些具体的知识 -
测试方法的改进:这一点真的是吹爆
OO
课,在此前的程设课以及数据结构课,基本采取的都是面向评测机进行编程,大部分都是通过评测机的反馈数据以及和同学之间的交流来debug,只要过了课下的点就意味着这份程序的结束。而到了OO
课,课下弱测不是终结,还有接下来的强测以及互测,就让我对自己的bug很是谨慎,从最初比较原始手写测试数据对自己的代码进行局部高强度的覆盖,到后来使用数据生成器和对拍器对程序的自动化测试,还有单元测试,都极大地减少了bug的数量,学习了许多测试方法,极大地提高了我的测试能力。虽然这一学期没有周末,但是真的很充实,很有收获 -
关于架构的设计:从最初的不加思考草率开工次次重构,到最后谨慎思考分析轻松扩展,就像以上所说的,我的架构设计获得很大的提升,我变得更加
OO
了 -
鲁棒性思维:在最后一次作业中,关于顺序图的消息就有一个坑点:消息可能不只是从
LifeLine
到LifeLine
的,如果统计一个LifeLine
的Incoming消息数必须要找到这一LIfeLine
,就可能发生NullPoint
的异常。我在这里因为不确定输入的种类就采取了记录Id的形式,对Id的Incoming数进行统计,增加了鲁棒性。荣文戈老师也说:你永远不知道你的程序的输入会是什么,于是增强程序的鲁棒性,以适用更为一般的情况是十分重要的
五、自足于自己的体会给课程提三个具体改进建议
-
一个是指导书有时候确实比较不够明确
特别是第四单元的指导书,我认为还是在这些容易产生误解的地方把问题明确,在讨论区以及水群里对需求进行猜测实在过于痛苦 -
理论课和实验课的衔接过于不友好,由于理论课课程还是有点抽象,而且加上上午理论课,下午实验课的机制,导致了这学期的实验课还是有点跨度过大,任务难以完成
可能是因为我比较菜,还是希望这一机制合理一点,感觉还是将理论课和实验课隔周考察比较合适 -
对于互测屋大小的设计我认识还是很合理的,但是认识其他同学的优秀代码的目标还是挺难实现的,一个是屋内的代码实在过于多而且大多没有注释,对于复杂的作业基本上没有这么大量时间来理解别人的代码,对那些发布的优秀作业也是如此。我认为理解其他同学的优秀代码真的很重要,因为那些设计方法说起来很简单,实现却比较抽象,只有看到了才知道这一设计方法的妙处以及实现方法,真的学会不仅是设计方法的提升,也是设计思维的提升。我建议可以采取一定的分数为激励手段,让优秀的同学单开一个帖子对于他的思路进行阐述,与同学进行互动,以此来增强所有同学对
OO
思想的理解。
最后,再次感谢OO