OO第四单元&课程总结
一、本单元作业的架构设计
本单元需要在,而设计上个人将所有类分为数据模块和解析模块。
1)数据模块
数据方面上首先将官方包解析出来的 Uml* 封装在自己的 MyUml* 里,然后在自己的类里定制属性。
继承关系上可以参考官方包的设计,所有的 MyUml* 元素都继承 MyUmlElement
元素。其中,个人比较特殊的实现有将 MyUmlClass
和 MyUmlInterface
提炼接口 MyUmlNode
,MyUmlPseudostate
和 MyUmlFinalState
继承 MyUmlState
(方便统一管理)。
2)解析模块
如图,解析模块个人设计为顶层模块+类图/协作图/状态图解析类,主要目的为减少类与类之间的耦合(避免过大的类)
此外,每个图的解析上也采用了层次化的方法(->表示解析顺序)。
类图:Class/Interface -> Attribute/Opreation -> Generalization/Association/Realization/Parameter
协作图:Cllaboration/Interaction -> Attribute -> Lifeline/Endpoint -> Message
状态图:State Machine -> Region -> State/Pseudostate/Final State -> Trasition -> Event/Opaque Behavior
3)数据测试
本单元的测试比较简单,直接手动构建所有可能情况的图后遍历所有指令即可(每次作业1-2小时构建,可以达到覆盖率100%)。
二、在四个单元中架构设计思维及OO方法理解的演进
第一单元——表达式
这一单元一开始我采取的方法是之前数据结构课程中采用的栈的方法,然而我实现的这种方法在可读性、可扩展性、可复用性等方面都非常差,不适合迭代。
于是我大规模重构代码,采用了递归下降的方法。在重构的过程中,我也对单一职责原则的理解逐渐深入:表达式的归表达式、因子的归因子,每个类都需要各司其职。
值得一提的是,在本单元的学习过程中,我抽空读完《重构:改善既有代码设计一书》。这在我每次写完重构代码,甚至在编写设计代码之前就在降低耦合度、提高可读性/可复用性方面起到了很大的作用。
第二单元——电梯
这一单元最重要的是对一些常见设计模式的理解和恰当使用。
整体上采用的还是常见的生产者—消费者模式,然后细节方面也采用了单例模式、工厂模式。使用前人总结出来的代码设计经验无疑使我的代码更好维护了。
同时,虽然是第一次接触多线程,但是生产者—消费者模式的设计让我很快理解了多线程中的关键点,以及每个类应当起到的作用。在架构设计上也是更加重视是否符合SOLID原则的要求。
第三单元——JML
本单元架构方面只需要跟着官方包实现接口即可,并没有太多可以自由发挥的空间。
第四单元——UML
本单元架构上部分参考了UML的设计,不过解析类则是采用了顶层模块+功能类的设计。到本单元的时候,一些常见的设计模式/重构方法已经基本掌握,所以很轻松的就能写出比较高质量的代码。
不过UML图的解析也让我对类与类之间的联系认识更加深刻。
小结
在几个单元中,个人的开发模式实际上出现了一个“大爆炸模式”到“瀑布模式”的转变,即逐渐重视设计这一环节在开发中的重要性,审视自己是否在设计阶段就遵循了SOLID原则,之后进行代码编写也是事半功倍。此外,一些设计模式和代码重构方法的学习也让我对面向对象方法的理解更加深入。
三、在四个单元中测试理解与实践的演进
第一单元
第一单元的测试非常简陋的白盒测试,只是自己手动构建了几个数据,结果在第二三次作业中均出现了BUG。痛定思痛后决定在之后的单元搭建评测机以辅助测试。
第二单元
第二单元采用了黑盒测试的方式。使用了JAVA搭建数据生成器,Python的subprocess模块进行测试。本单元的测试方面主要是通过调整参数控制乘客生成的位置/方向/请求时间区间,然后对测试程序跑足够多的输入数据。(主要是模拟多线程下高并发可能引起的问题)
第三单元
第三单元采用了白盒静态测试+黑盒动态测试。白盒静态测试为参考Uml检查代码是否符合要求(可以说规格给出后可以较为清楚的知道代码是否可能存在Bug)。本单元黑盒测试上个人花了很多时间,因为数据有效性相较于第二单元更难保证,所以主动模拟了各个过程保证可以自己控制有效/无效指令的生成,同时也可以通过参数生成制定比例的数据。(具体可查看第三单元博客)
第四单元
第四单元的测试个人反而没有太好的手段,如果能自动生成Uml数据的话可能会有比较好的结果,不过自己手动构造的覆盖率100%的数据已经足够使用了。
小结
回过头来看,测试无疑是OO课程中一个非常非常重要的环节,而个人也在各次作业的中对测试的理解逐渐深入(从简漏的白盒测试到多种手段/度量工具的结合),同时也对测试逐渐重视(从花费几乎所有时间进行基础代码编写以及性能提升,到每次作业几乎花费一半的时间搭建评测机)。
四、课程收获
面向对象课程的最大收获当然是学习到了面向对象的思想(笑)。之前采用面向过程的方法的时候,总是觉得自己的代码不好看、不美观,却没有好的方法去修正,而面向对象思想的学习无疑解决了我的这个难题,也让我意识到这不美观的根源在于我自己代码的耦合度太高。
此外,自动化测试的搭建也让我对软件测试的理解更加深入;设计模式和重构方法的学习让我知道如何编写出高质量代码;JML和UML的学习让我明白如何把自己的设计标准地表述出来。
总之就是收获满满:)
五、改进建议
- 关于自动化测试课程组可以给出参考搭建方案。
- 理论课可以加入一些设计模式的讲解(例如单例模式、工厂模式)。
- 电梯单元中自由竞争策略下可以不用写调度器,导致可能对多线程编程的理解不够深入,可以考虑加一些强限制条件。(例如强制某人坐某个电梯)。
- 第三单元JML和往年有同质化倾向,可以考虑出一些新的规格和方法编写,或者新的背景(工作量可能会比较大)。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/269309.html