第四单元总结及面向对象课程总结

(1)总结本单元两次作业的架构设计

第一次作业

第一次作业设计Uml类图的构建和查询,单独构建了ClassGraph类进行管理,由于涉及类和接口的查询和构建内容比较多,因此设计了ClassInfo和InterFaceInfo两个类分别进行类和接口的管理,并作为构建ClassGraph的组成部分。

考虑到输入的乱序性,比如AssociationEnd可能先于Association出现,设计了分批次处理数据,就是读入UmlElement数组之后,扫描第一遍只处理一部分,另一部分做记录,留着作为第二批处理,这样写程序的时候可以减少对parentId对应的元素是否已构建的判定,减少复杂度;

查询的时候会调用ClassGraph的函数,判断是否查询条件有误(不存在或者重名),之后找到相应的类,调用ClassInfo的内部函数。涉及接口查询的时候,同样先找到类对应的ClassInfo,ClassInfo里面会记录自己实现的接口的InterFaceInfo和自己的父类,InterFaceInfo内部会记录自己的父接口们,汇总之后得到结果。

第二次作业

第二次作业增加了状态图和顺序图,这两个和类图是独立的,因此单独构建了StateGraph和SeqGraph分别进行处理。由于状态图定义在StateMachine画布上,顺序图定义在Interaction画布上,因此设计了StateMachineInfo和InteractionInfo类,StateGraph存储状态机对应的StateMachineInfo,Interaction同理。StateMachineInfo和InteractionInfo内部存储在各自画布上的状态图和时序图,以及对图中元素的查询函数。

输入同样进行分批次处理;

查询时,类图查询同第一次作业,状态图和顺序图查询类似类图的结构,先进入xxxGraph判断查询条件,然后找到对应的xxxInfo进行查询;

此外本次作业增加了Rule的检查,第一个Rule遍历所有类检查即可;第二个需要在输入处理的时候分别构建好Class和InterFace的继承关系有向图,查询两个图里是否有环,TarJan算法即可;第三个Rule遍历类和接口查询是否父类有问题、实现的接口有问题或者自己是否有问题;

第二次作业用到的类的关系图示:

1223355-20190621151642948-1798359761.png

(2)总结自己在四个单元中架构设计及OO方法理解的演进

第一单元

初步接触Java,学习Java语法,学会使用正则表达式,初步接触容器的使用。一开始对面向对象没有概念,三次作业的递进让我也开始用面向对象的方式思考代码结构,解决问题;

架构方面,第一次作业仅用了一个文件一个类,用"x"和幂组成的字符串构建HashMap合并同类项,第二次引入三角函数之后延续第一次的思路,第三次引入嵌套之后重构了代码,按照Factor、Term、Expression分层,初次使用了类的继承;

第二单元

主要是多线程程序的编写,在第一单元的基础上,一开始就重视对架构的设计,且这次作业开始重视解耦的思想;

前两次作业只有一个电梯,因此使用了一个调度器类和一个电梯类,将调度算法和电梯运行进行解耦;第三次作业有三个电梯,因此对调度器进行了层次化,有一个总调度器,协调三个子调度器,子调度器和电梯进行交互,总调度器给子调度器分配任务;

这次作业重视多线程因此涉及类的继承和接口的部分不多;

第三单元

本次作业主要是对规格的理解,尝试了更多数据结构(HashMap、HashSet、Queue),以及一些算法(BFS、单源最短路径)。因为作业涉及各种图结构的查询,因此架构设计尤为重要。前两次作业比较简单,结构比较扁平,只包括MyPath和MyGraph两个类。第三次作业涉及的查询种类较多,MyRailwaySystem中的图结构专门分离出来,由GraphRelated类管理,票价、换乘、拥挤程度三种查询分别由三个类管理,这三个类由很多共同点,实际上可以进一步优化成一个类管理三种不同的权重。第三单元对架构的设计技能相比前两个单元提升了很多。

第四单元

本次作业主要是对UML图的理解,搞清楚不同UmlElement的意义、相互依赖关系之后并不是很难。由于查询的简化,类图、状态图、顺序图这三个模块互相不影响,因此用三个类分别进行管理(ClassGraph, StateGraph, SeqGraph),类图由于既要考虑类也要考虑接口,因此ClassGraph使用ClassInfo和InterFaceInfo两个类分别进行类和接口的管理。这个单元进一步锻炼了架构设计能力,由于作业内容是对UML图的解析,因此对面向对象的要素:类、接口、继承、接口实现,以及状态图、顺序图、关联关系等有了更加深入的理解。

(3)总结自己在四个单元中测试理解与实践的演进

第一单元主要是对表达式进行处理,构造方法比较简单,不过要想实现测试样例的充分覆盖还是有困难的,当时是样例测试和程序逻辑验证结合进行检查,但是当程序复杂度比较高的时候(比如第三次作业)就很难准确地进行逻辑验证;

第二单元多线程程序由于构造输入、按照时间顺序给定输入比较困难,因此正确性验证主要是通过代码逻辑检查,死锁检查,这时候架构的设计很重要,如果架构设计好,逻辑检查会省不少力;

第三单元引入了Junit协助测试,可以很好的验证程序的正确性;

第四单元主要是通过手动构建UML图样例进行测试,通过构建一些特殊情况、极端情况进行测试,同时也有程序逻辑检查;

(4)总结自己的课程收获

【1】对Java语言的学习,包括基本语法,多线程程序编写,容器的使用等;

【2】面向对象思想,使用面向对象语言写程序实现需求,使用面向对象语言的特色(类、继承、接口)优化架构,提升代码质量;

【3】代码能力,工程能力,一学期下来积累了一定的代码量,de了不少bug,掌握了一些设计测试样例的方法;

【4】能够更加乐观的面对生活;

(5)立足于自己的体会给课程提三个具体改进建议

【1】建议公开所有中测样例,或者允许中测只有一个(或者少量)错误情况下参加强测,毕竟强测占很大一部分成绩。最后一次作业因为中测没有公开的样例差点没有进入强测,因为一个小细节过不了中测的某一个测试点,无法参加强测分数损失会很大,而且不一定中测的的bug会影响强测所有测试点的拿分,因此个人感觉目前的分数设置不太合理;

【2】建议作业发布时间更加准时一些,以及如果作业要延期,建议采用仅仅延后提交ddl的方式,而不是同时将发布时间也推迟,因为每个人有空写作业的时间都不一样,留更多的时间出来可以让我们安排更灵活;

【3】建议指导书、库的发布前多修订几次,或者至少细节部分发布前要统一,否则一边写作业一边改需求会比较麻烦,写作业的时候还需要踩很多可以避免的坑;

以上建议仅仅是理想的目标作为参考,毕竟老师和助教平时也很忙。实际上课程组已经做的很好了,本学期上这门课的体验极佳,每个单元、每次作业都设计的很精妙,环环相扣,层层递进,一套流程下来,收获颇丰。感谢为这门课付出的老师和助教们,比起写作业的我们,留作业的你们更辛苦;感谢讨论区分享自己经验的大佬们,你们摸着石头过河,我摸着你们过河。

最后祝OO这门课越办越好!

转载于:https://www.cnblogs.com/Ggalaxy/p/11064747.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值