第四单元 & OO课程总结

第四单元 & OO课程总结

目录

第四单元架构

总体来说除了要比较深刻理解UML的结构之外(直接阅读源码很重要),主要需要注意的就是各种解析或检查时的dfs、bfs了,整体代码架构感觉比JML还简单

第一次作业

解析UML类图,由于对象建立有父子依赖关系,因此需要先解析上层才能解析下层。

采用3次遍历,分别解析:

  • Class,Interface,AssociationEnd
  • Association,Attribute,Operation,Generalization,InterfaceRealization
  • Parameter

其中对AssociationEnd,Class,Interface,Operation单独建类,并将Class,Interface用接口封装

存储均使用HashMap,key适时选用name/id

UML类图

第四单元 & OO课程总结

第二次作业

增加时序图、状态图的解析。

采用5次便遍历,分别解析:

  • Class,Interface,AssociationEnd,Interaction,StateMachine,
  • Association,Attribute,Operation,Generalization,InterfaceRealization,Lifeline,Region
  • Parameter,Message,State
  • Transition
  • Event

新增单独建类Interaction,Lifeline,Region,State,StateMachine,Transition

UML类图

第四单元 & OO课程总结

第三次作业

新增UML有效性检查,架构不变,只在主解析器增加检查方法,并下放到类进行检查。

需要注意一些小坑如除了id完全相同的Generalization

面向对象架构设计的演进

从刻意追求OO,到自然内化OO

单就架构来说,我其实在整个课程中都没有经历过重构,但架构设计确实也占掉了每次作业最多的时间。

  • 第一单元表达式解析是面向对象初体验+java入门,边实现功能边学习语法。比较意外的是效果还不错,当时没有使用常见的递归下降算法(不想重构),而是根据自然的表达式结构进行层次划分,并直接运用大正进行解析,面向对象的感觉很足。虽然第二次作业由于正则表达式不熟悉、测试不到位强测翻了车,但每次的增量开发属实很能让人感受到OO的魅力。
  • 第二单元多线程电梯是难度最大的一单元,多线程+设计模式,在第一次作业时就通过读博客了解到最终的设计目标,并做好预留。作业开放性很大,两级调度器的设计让线程安全和增量开发都变的很容易。在这个单元,抽象、架构设计的能力都得到了很大的锻炼,而且架构设计也是简洁、全面测试的基础。
  • 第三单元JML的代码架构不需要自行设计(虽然也有个别方法需要自行设计辅助方法和属性),我认为是OO感觉最少的一单元,但对JML确实有了比较深的理解。虽然JML可能本身的用处有限,但对于单元测试+面向规格开发的抽象思想,确实也对工程开发中的需求与表达的理解有很大的帮助。
  • 第四单元UML并不像看起来那么简单,虽然有往届博客的帮助,但对于整个解析器的抽象尤其是多层遍历、单独建类这些操作还是很考验OO思想以及抽象能力的。而且对于UML语言本身的理解也是对整个java语言架构的深刻了解,对理解OO本质很有帮助。

关于测试

相对于架构设计的精心构思,同样很重要甚至对代码质量有决定性影响的测试我做的就没有那么好,我才用过的测试方法基本有以下几种(其中黑盒测试部分都可结合JUnit):

  • 黑盒测试
    • python编写测评机,按照自己的理解生成数据,主要测试基础功能(看上去很酷但其实意义不大)
    • 手动生成边缘数据:如表达式解析的多层括号,多线程的密集输入、开始结束,JML的大规模数据等
    • 对拍(主要为JML、UML使用)
  • 静态测试
    • 降低复杂度(虽然不是直接找bug,但这个过程中可能会发现设计缺陷,也便于测试)
    • 确定每个分支都能跑通(每个boolean)
    • 多线程去锁

改进意见

  • 实验课相比作业体验并没那么好,希望有讲解或者简单的答案
  • 互测动力没那么强,只是为了加分的话,如果没有自己的测评机很难有精力读那么多人的代码
  • JML确实可以减少次数,或者放到最后一单元,因为UML还是值得认真的3次作业的,但现在会和考期冲突(6系都在考期前两周考试),但JML相对来说收获并没有那么大。
  • 或许可以将JML、UML融合,比如UML第一次作业自己设计,后两次作业通过JML规格给出要求,而不是像现在两单元都用算法来充内容

总体感受

收获颇丰:OO思想+测试能力+java语言

之前对面向过程没有任何概念,整个课程教会了也让我明白了OO思想,这种根据功能职责划分对象的代码组织结构的高效性、重要性。通过练习,也掌握了面对一个有规模的实际问题,从抽象到架构设计再到具体实现的全过程,是代码能力的进阶。

这其实是我第一次系统、认真地对测试进行思考,也明白了为什么代码测试会成为单独的课程和职业。一学期下来,对基本的测试方法的学习也反过来提升了代码的设计能力,增加了对代码需求的理解。

总体看来,本学期java语法反而是最次要的技能了,因为基于C语言,在组织结构上不产生大的改变,过去的几个月我只需要用到什么现场去查(正则,堆栈、队列容器,::等)效果都很好,这也给了我在学习中应用更多语言的信心。

还有其他边缘但蛮重要的技能:markdown,博客,python脚本...

体验良好:精品课程名副其实

课程制度、内容安排、作业设计、课程环境(网站用起来是所有课里面手感最好的哈哈哈哈)都很棒的一门课,每周写oo心情都很愉悦,虽然强测裂开时候也会难受很久,但回首过去还是很感谢这门课给我全方位的能力提升!

确实是一门很用心的课,从老师到助教到同学们,大家共同营造出一个很好很好的学习环境,从博客的传承到研讨课的分享(记得有次因为比赛拖到周日晚上才完成,弱测有个bug过不去,许多同学纷纷伸出援手,最后极限通关),真的很为能在6系成长感到自豪!

希望OO越来越好!

上一篇:2021年OO助教工作总结


下一篇:第三单元总结