OO第四单元作业总结

一、本单元两次作业的架构设计

OO第四单元作业总结

本次作业的架构采用了讨论区杨嘉成同学的建议,构造了MyClass, MyInterface, MyStateMachine, MyInteraction四个一级类用来包装相应的数据,同时构造了二级类MyOperation, MyAssociation。

MyClass

OO第四单元作业总结

 

MyInterface

OO第四单元作业总结

 

MyStateMachine

OO第四单元作业总结

 

MyInteraction

OO第四单元作业总结

 

在构造实例时,遍历三次,第一次提取所有的一级对象(UmlClass, UmlInterface, UmlInteraction, UmlMachine),第二次提取二级对象(UmlOperation, UmlAttribute, umlAssociation, umlGeneralization, UmlInterafaceRealization, UmlLifeline, UmlMessage, UmlState, UmlTransition, Umlfinalstate, UmlPseudostate),第三次提取三级对象(UmlParameter, UmlAssociationEnd)。每次将第一级对象利用add()方法填装到上一级对象中。同时为了寻找parent方便,用HashMap存储,键为Id。

第二次作业中的规则检查:

R001:对Myclass中的属性和关联端搜索即可。

R002:利用Tarjin算法求有向图的强连通分量,若一个分量中成员大于1个则构成了循环。

R003:利用队结构列出所有类(或接口)继承的类(或接口),有重复则重复继承。

二、在四个单元中架构设计及OO方法理解的演进

第一单元学习了面向对象基本的数据封装和继承,设计专门的类处理输入达到职责的划分,解决多项式递归分析时使用了递归下降分析法,并学习了助教提出的面向对象式实现,体会了类之间的交互协作。

第二单元学习了多线程设计,基于多线程提高程序的效率,但要格外关注数据的共享和并发访问,做好线程安全防护。

第三单元课程组给出的框架已经实现了大部分内容,只需要依据规格补充相应的方法即可。通过这种方式,我体会到了规格设计的好处,首先是对过程进行了抽象,在设计阶段不必拘泥于具体实现,即将过程式的思考推迟到最后,而更多关注对象之间的交互和整体框架的设计。其次这种方式非常便于测试,想要写出规格需要对方法进行提前的约束,简化了每个方法的职责,同时在实现之后可以基于规格进行测试。

第四单元学习了uml,一种建模语言可以对系统进行描述,用例图类图状态图顺序图等,无关具体的语言,在需求分析、设计阶段都有广泛的应用。

三、在四个单元中测试理解与实践的演进

在课程过程中对测试实践的不够充分,过度依赖于评测结果,也出现了轻松过中测结果强测翻车的情况。在第一单元时,面对多人的作业,尝试通过脚本进行简单的批量化测试,但是第二单元由于多线程又回到了人工测试的方式。在讨论课中学习到了其他同学关于测试驱动编程的思想,在作业的设计阶段阅读指导书时就注意分析一些易错点,构造测试数据,以此规避调一些问题。在第三单元中学习了使用Juint进行单元测试,以及基于jml的验证,我认识到了bug应该防患于未然,通过设计以及简化实现来规避。

四、课程收获

(1)面向对象的分析设计方法。除了面向过程的思维方法,还学会了使用面向对象的思想思考解决问题。在面对需求时,先分析其中的交互关系,确定对象的边界和基本功能,然后进入对象内部设计数据的表示和管理,同时注意对象之间职责的划分,协同控制以及空间性能的平衡,最后进行设计原则的检查。在程序中加入一些数据结构时也可以使用面向对象思想,将他们单独封装起来,形成一个相对独立的部分,比如地铁中计算最短路径的Floyd算法,uml中识别循环使用的Tarjin算法。

(2)设计原则。学习到了一些基本的设计思想,比如依赖倒置原则,依赖于抽象而不是具体,善用接口,提高系统的可扩展性。同时在学习设计模式中发现给出的类图中很多都使用了接口,使模型的通用性增强了不少。

(3)学习并使用了一些设计模式。在多线程单元使用最多的便是生产者消费者模型,解决请求的简单调度。在多电梯的调度中,尝试使用观察者模式,当调度器接受到请求时分发给电梯执行。在电梯换乘借鉴了Worker Thread模式,将一个请求的处理方法作为说明书传递给调度器,再由电梯执行。同时还了解了其他设计模式,比如单例模式,不可变对象模式,线程池模式等。

(4)了解了基于规格的设计方法,利用Junit对方法进行单元测试、使用UML对系统建模。

五、课程建议

(1)建议实验课可以和对应的理论课错开一些,或是提前发布预习任务。上午上完理论课内容还没有吸收,课件也没有下发便进行实验效果不太理想。

(2)建议实验课在考完以后也有一个处理,而不是交了就可以了,不知道自己哪里做错了,如何改进。可以考后下发标程。

(3)建议课前可以下发PPT,PPT上部分内容字体太小看不太清,课上有些费劲。

(4)建议强化自测,感觉自己对于评测机比较依赖,习惯于提交看结果而不是自己构造。