UnitFourSummary&Final
目录
-
一、本单元三次作业架构设计
-
二、四个单元中架构设计及OO方法理解的演进
-
三、四个单元中测试理解与实践的演进
-
四、课程收获
-
五、改进建议
-
六、线上学习OO的体会
-
七、最后
一、本单元三次作业架构设计
-
第13次作业
-
第13次作业的输入处理我采取了自顶向下的拆分策略。即先拆解出Class、Interface和AssociationEnd,然后再拆解出Attribute、Operation、Association、Generalization和InterfaceRealization,最后拆解出Parameter。在拆解的同时,我还为后面我认为指定方法会用到并且操作比较复杂的元素单独建了类,分别为MyClass、MyInterface和MyOperation,这样在处理一些方法时,我就可以下发到具体应该干这个事情的类,使结构更加清晰。
-
但是,在写完三次作业后,我想对我以上的一些结构进行一些更改。在第13次作业,我的MyClass和MyInterface都是开的新的类,然后把UmlClass和UmlInterface中要用到的元素比如name、id等等传进去,其他再无关联。如果再有一次机会,我大概会让MyClass和MyInterface分别继承自UmlClass和UmlInterface(这样第15次作业就不会看起来那么丑了qaq),然后建一个接口,向其中加入class和interface的共性操作,MyClass和MyInterface实现此接口,虽然按我原来的做法可以满足第13次作业的要求,但是扩展性不是很好,导致后面的扩展看起来很冗余。
-
此外对一些方法的结果设置了缓存机制。
-
-
第14次作业
- 第14次作业的输入处理与第13次作业的输入处理相同,也用了自顶向下的方法,在此不再赘述。其中,考虑了一下后面的扩展性,为EndPoint、LifeLine、StateMachine、Region、State建了新的类(虽然后来发现并没有多少用),由于发现initial、final state和普通的state处理上没有什么区别,因此没有单独区分,一并归入State类中,并存了type,以供后面扩展用。
- 同时,我这次的类图、顺序图、状态图在我的程序架构中依然以三张图的形式存在。在总类MyUmlGeneralInteraction中调用这三个的方法。
-
第15次作业
- 第15次作业需要完成uml图的检查。同样,按照第14次作业的方法,新建了一个MyUmlStandardPreCheck来检查,在总类中调用这个类的方法。
- 这次作业中,最头疼的莫属002和003(004可以直接在第13次的查找所有实现接口上添加查重功能,比较好实现)。在综合考虑了复杂度、时间以及实现难度后,我002还是抛弃了拓扑排序判环采用了对每个点都进行一次朴素的dfs,并记录查找路径,如果一个点符合了环,那么就把路径上的所有点都加到答案中去,这样后面再查这个点的时候就可以直接跳过。但这样还是有一个问题,通过测试数据发现如果查询完一个点没查到,回退的时候将访问标志撤销,在某种极端情况下会tle,后来通过一番
个人直觉离散知识的推理,发现完全不用撤销访问标志,只需将其从记录的查找路径中去掉。对于003,最后也采用了朴素的dfs(dfs好啊dfs妙!),通过复杂度计算和个人数据测试,觉得没有问题,强测也没有测出任何问题。
二、四个单元中架构设计及OO方法理解的演进
-
第一单元
- 第一单元我认为面向对象的思想很明显,也很重要。主要思路还是自顶向下拆分,一步步提取出表达式、因子以及各种项。如果需要递归调用就再递归调用。每个类只需要做好自己的事情,分而治之,做到高内聚低耦合。个人认为本单元作业,好的架构至关重要,因为一开始没有什么面向对象的思想,我的类之间界限划得不明确,还带有一些面向过程的感觉,导致我第三次作业化简的十分艰难,很多地方因为架构完全不敢动,最终只做了去零项等最基本的化简。
-
第二单元
- 第二单元延续了第一单元面向对象的思想的同时,加入了多线程这一概念。它要求我们能够正确处理各个对象之间的交互,并且保证在交互时的线程安全。相比于第一单元的架构,我们不仅要考虑对象本身以及如何划分结构,更要考虑对象之间的关系。保证你做的每一步都是线程安全的是此单元一个需要重要考虑的问题。
- 本单元的架构中,我三次作业均采用了“生产者-消费者”模式,并有单独的调度器类用于调度。在后两次作业中,我也不断尝试了不同的调度,自测数据+方法分析比较性能,最终性能分数还是不错的。但是再回头看我第7次作业代码,由于不断的添加优化的东西,发现输入线程和调度线程都太过冗余了,这点需要改进。
- 对于以上所说问题的改进办法,我有一个初步的想法。即将电梯运行与调度策略完全分离,电梯只负责上下楼,剩下的由外部的调度策略决定。这样,可以把各种优化的策略全部都扔到一个单独的策略类里。每次只需要单独更改策略类就可以完成优化。
-
第三单元
- 第三单元涉及了JML,锻炼了我们在工程中根据规格要求实现代码的能力。我们首先需要知道JML的各个条件的含义,能够翻译出其的意思,但是不能完完全全靠翻译写代码。JML是方法规格不是方法注释,它只是告诉你什么时候什么条件下要完成什么事情,但是具体实现方式是靠个人理解。我们在阅读JML的时候,应当将其需求抽象出来,然后加上自己的架构设计,完成需求,否则,就可能酿成复杂度超标的惨案。
- 本单元的作业,虽然在各个方法中注意到了抽象出JML的需求,再去完成,因而没有出现TLE的情况。但是在整体架构上几乎没有设计,完全按照课程组下发的文件来的。这也就造成了我有几个类差点超500行,缺少了面向对象的思想,这点应该改进。
-
第四单元
- 第四单元涉及了UML,需要我们了解UML模型的构造以及将从UML模型中抽象出来的各个元素,在程序中组装起来,形成树形(图)结构。我认为此单元的重点就在于如何组装、如何建模。
- 本单元我的实现中,将每种图的各个元素划分了层次,采用自顶向下的方式建模,同时每个类都只需完成自己的事情以及调用其他类,做到分而治之。
三、四个单元中测试理解与实践的演进
-
第一、二单元
-
自动化测试:
- 数据生成: py脚本自动生成数据
- 结果验证:
- 一单元采用python的库函数生成正确结果进行结果比对
- 二单元采用自行写验证程序对程序结果进行验证
- 运行:shell脚本统筹运行,实现自动化
-
手搓数据:
- 手动出一些边界/刁钻数据进行验证
-
-
第三单元
-
自动化测试:
- 数据生成:py脚本自动生成数据
- 结果验证:与其他同学结果对拍
-
Junit单元测试
-
-
第四单元
-
手动画图构造(边缘)数据
-
-
理解:
-
最优选择:手动构造边界数据/Junit+大数据对拍。
前者保证了一些边缘数据得以被测试到,以及一些基本功能的全覆盖性测试。但是一些诡异的bug往往是多个条件共同触发的结果,或者是小概率触发的结果,通过人力往往很难找到,这时候自动化测试的优点就体现出来了,通过海量数据对拍,将这些小bug揪出来。
在自己的努力和同学的帮助下,我的四个单元的测试自认为做的还不错,做到了0 ERROR , 0 HACKED,没有体会到传说中的Bug修复。
-
四、课程收获
-
学会了一种解决问题的思想—“面向对象”
- 颠覆了我以前学过的编程语言的面向过程思想,学会了将需求进行合理划分,学会了统筹各个类之间的相互协作。将程序模块化、层次化,并分而治之。
-
学会了对拍
- 其实在计组的时候就看到身边很多同学在对拍,但由于个人比较懒,一次在OO之前对于对拍的概念丝毫不知晓。在知道OO规则的时候就傻眼儿了,本着不会对拍就会被别人拍死的想法,开始从头学起。下wsl,学习书写python脚本,学习书写shell脚本,学习如何使对拍完全自动化以及全覆盖等等。第一周每天爆肝写测试的记忆还历历在目,虽然的确很辛苦,但是很有成效,不仅使我在课程中守住了自己的阵营
狠狠的hack了别人(爽!)还使得我现在对于测试建立起了自己的框架,可谓受益无穷。
- 其实在计组的时候就看到身边很多同学在对拍,但由于个人比较懒,一次在OO之前对于对拍的概念丝毫不知晓。在知道OO规则的时候就傻眼儿了,本着不会对拍就会被别人拍死的想法,开始从头学起。下wsl,学习书写python脚本,学习书写shell脚本,学习如何使对拍完全自动化以及全覆盖等等。第一周每天爆肝写测试的记忆还历历在目,虽然的确很辛苦,但是很有成效,不仅使我在课程中守住了自己的阵营
五、改进建议
- 把多线程第一次作业时下发的资料,在前一周博客周就下发,让同学们学习。在课程中我最累的两次作业,除了第一单元最后一次作业,就莫属二单元第一次多线程作业了。由于以前完全没有接触过多线程这个概念,单线程思想根深蒂固,短时间内无法透彻的理解多线程思想。虽然现在看起来,那次作业并不难,但是当时真的是狂虐我。所以建议课程组提前一周即在一单元博客周便下发多线程的学习资料,让同学们提前学习,减少因博客周摸鱼
(比如我)而多线程懵逼的现象。 - 如果明年OO作业还是周二晚上下发的话,个人建议实验课/研讨课放在周四晚上。就我个人而言,周二晚上下发作业后,基本可以写一个大概出来,周三进行完善,周四上午进行基本测试,中午提交中测,基本在周四晚上的时候,我大概已经可以对这个单元(作业)有一个较为全面的理解,这样的话,对于实验而言,我会拥有更加充沛的准备,对于研讨课而言,会能够对于同学们所讲的内容产生共鸣,得到更大的收获。但是按现在周三晚上来的话,一个是既要顾及实验,还要顾及作业,一个是有些同学所讲的内容当时并没有什么理解,往往做完作业回头看看ppt才恍然大悟。
- 如果可以的话,希望实验可以公布一下每次的正确答案(可以不公布分值/分数)。如果只是实验但是不知道答案的话,就总有一种稀里糊涂做完实验就完了的感觉,除了分数上的占比,感觉对个人没有带来什么益处。
六、线上学习OO的体会
个人感觉线上学习和线下学习没有什么太大区别,甚至我认为线上学习在某些点上还会优于线下。比如在看教学视频的时候,我没看懂或者走神儿的地方就可以会看,并好好钻研。并且每次的课上讨论题,大家也会在群里热烈讨论,感觉使我收益颇丰。
七、最后
虽然虽然OO真的是一门很累的课,但是回想这一学期的学到的东西,我真的觉得很值很值。无论是课程机制还是作业难度,都觉得设置的很不错(虽然的确南到我了)。评测的阶梯设置使得我们虽然会十分努力的搞测试,但是由于强测的数据还是够强的,不必太担心前面的错误会影响这次的作业(即这周的bug是上上上周无知的我写的OS PTSD),这一点就真的是让人狂赞!!(今天的命运掌握在了今天的我手里!!!)谢谢老师以及助教团队的付出,为我们营造出了这样的环境。最后的最后,完结★,°:.☆( ̄▽ ̄)/$:.°★ 。