oo第四单元总结

1.本单元三次作业架构设计

​ 本单元主要任务是完成一个UML解析器。且三周的任务为迭代开发,考察点主要为UML图的理解,算法的考察没有上单元那么严格。

1.1 第一次作业

​ 在了解UML的原理以及规则后,难点就在于如何建立各个UMLElement之间的数据结构了。课程组提供的UMLClass与UMLAttribute等元素都是分散的,不适于管理。

​ 于是针对第一次作业,我设计了MyClass、MyOperation、Myinterface类,将关联性很强的元素组合在一起。主要是通过id与name查找的hashmap存储,提高查找速度。还使用了Arraylist容器存储,保证遍历过程速度更快。

oo第四单元总结_第1张图片

​ 可能是写完作业就感觉万事大吉,没有考虑优化的问题。在强测时,一个考察深搜的数据点没过。错误原因是深搜时未标记,导致复杂度大大增加。在之后的作业中便格外小心。

1.2第二次作业

​ 本次作业还加入了顺序图以及状态图的解析。实际上只是增加了两种大的数据类型以及相关操作。根据迭代的思想,我增加了两个类MyStateMachine与MyInteraction,分别管理状态图与顺序图。同时由于数据初始化部分太过冗长,我建立了一个新的Initiator类,专门用来初始化整个UML图。

oo第四单元总结_第2张图片

第二次作业的本质与第一次作业一样,都是解析UML图,且易于迭代。故第二次作业强测未出错误。

1.3第三次作业

​ 第三次作业支持的是UML有效性检查,即检查元素是否违背某些规则。

​ 我们要做的是记录各个元素状态,并进行判断。其中一些设计图操作的方法,我是直接面向过程编程,在MyUmlinteraction类中直接处理。其余一些较易实现的检查状态的直接交给checker类管理。

oo第四单元总结_第3张图片

​ 第三次作业未能做好迭代,只是增加了一些要求的方法,进行各种各样的搜索。鉴于第一次作业的教训,我将check2反复优化,最终保持了较高的速度。可殊不知删除久代码时少删除了一个break,最终得不偿失,错误两个点。可见千里之行的最后一里,仍然要踏踏实实走完。

2.架构设计以及oo理解的演进

2.1 第一单元

​ 第一单元可谓是由面向过程转至面向对象的“阵痛期”。刚开始的两次作业,复杂度不高,加上我急于求成,没有理解面向对象的含义便草草开始。导致可扩展性极低,每次都需要大片大片重构。在第三次作业,那周事情繁重,此时重构也漏洞百出。所以那是我唯一一次无效作业。留下了极其深刻的印象。

​ 在第一单元的总结中,我才逐渐认识到面向对象的优点与精髓。根据功能和数据的相关性凝聚成一个叫“类”的东西。每个类只需管理自己的部分操作与数据。但类之间也会存在许多关系,比如父子类。接口设计也能为面向对象提供许多便利。在第一单元的视频总结中,老师就介绍了各个算术单元的迭代过程。颇有启发。总结一下,面向对象,更多地关注,各个类之间的关系,操作,将之前的过程抽象成类的行为,将迭代的功能或数据结构归纳成类的迭代……抽象思想无处不在。

2.2 第二单元

​ 第二单元我们接触了多线程编程。基本上只要吃透了生产者——消费者模型,就能完成三次作业了。据说部分同学们出现了比如死锁等棘手的问题。可能是我运气好或者是架构较为合理吧,没有出现过此类问题。除了第二次作业没有更新官方包导致强测爆0,痛心疾首。

​ 之后的操作系统理论课,还引入了信号量机制,使我对多线程编程有了更加深刻的认识——注意临界资源的获取与释放。同时第二单元还教会我使用各种工具去解决问题。比如本地搭建评测机,事实证明比手动复线错误靠谱得多。尤其是多线程编程中低概率出现的线程问题,在自动评测中更易出现。

2.3 第三单元

​ 第三单元主要学习JML抽象描述。从前我就很好奇一个软件团队是如何协同工作的。如今有了一份解答。就是通过统一严谨的抽象语言,描述一个行为或者属性,这样即使另一个同事看不懂代码具体实现,也能直接使用。

​ JML是一种规范,也是一种抽象。他将代码的具体实现与实现效果分开。能够让编写规范者专注于功能,程序员专注于代码实现。非常有利于团队合作,极大地提高了工作效率。同时它那极其严谨难懂的类似于离散数学的描述,避免了自然语言可能带来的歧义,更加适合开发。

​ 这一单元的前两次作业基本特别难的点,主要在于理解JML语言以及书写代码时避免非智力因素导致的错误。毕竟JML描述一长,括号一多,眼睛都看花了。但是第三次作业的考察点不仅是对JML的理解能力,还有一定的算法考验。比如我没有使用并查集降低复杂度,导致强测wa了两个点。得出的教训是:死板地照着JML描述实现代码,一定是死路一条。

2.4第四单元

​ 第四单元学习了UML语言描述。可以凭借UML形象地表示出类与类之间的各种关系,状态迁移,以及复杂协作。从另一种抽象的角度讲述面向对象的思想。

​ 这四次作业是通过解析UML元素的方式,让我们自行完成UML解析器,并迭代开发。鉴于这次难点主要在于UML的理解,我就将第一单元的遗憾弥补了一些,尽量使用迭代开发的思想,每个类各司其职。取得了较好的编程体验与效果。

3.测试理解与实践的演进

3.1 第一单元——手搓数据

​ 第一单元的测试数据为手动生成一些具有代表性的数据,然后手动测试。当时苦于对于各个求导规则的组合,便没有考虑如何构建测试样例以及自动评测机。但是自动测试的思想一直都在,比如借助python自动求导库进行测试。

3.2 第二单元——自动评测机初试

​ 第二单元的多线程错误让人苦不堪言,原因多是多线程bug的随机性,以及idea内部可能的优化掩盖了错误。于是就需要自动评测机了。

​ 事实上,在第三次作业我才开始使用自动评测机,因为前两次作业较为简单。不见棺材不落泪。第三次作业,在同学的指导下,我使用了python运行了电梯程序以及检查正确性程序。还根据各种情况,比如有无换乘,方向同向或相反,同时或随机上电梯等等条件的组合搭配,自动生成测试数据。取得了不错的测试效果。

​ 在第二单元的分享课里。有同学分享了TDD测试开发过程,尽管在当时没怎么听懂,不过在第三单元马上就用上了。

3.3 第三单元——Junit初试

​ 本单元围绕JML展开,一切与规格相关。同时本周课程组推荐JUnit测试工具以及TDD测试开发流程,即先行设计测试样例,再编码。这种方式有利于充分理解题意以及考虑各种边界条件,对于程序边界性测试效果较好。但测试用例仍需自行构建,且花费大量时间,效率不高。

​ Junit的单元测试思想值得借鉴。在第三单元的测试过程中,我利用Junit的自动测试功能测试了自己的代码,以及互测同学的代码,可以说在数据生成后,找bug的效率大大提升。但是Junit的灵活性不如自行编写评测机。

3.4 第四单元——侥幸过关

​ 本单元主要依赖于dmj文件的生成与解析制造测试用例。dmj文件的自动生成感觉比较困难,但或许能够分析umlelement的格式特点,根据类图的规律,直接生成解析数据。但思考到测试用例自动生成程序的复杂度,无异于重写一份uml解析程序(uml解析作业是把umlelement按照一定规则组合起来,而自动数据生成则是根据一定规则生成umlelement,二者顺序相反)。所以,仅仅是手动绘制了一些uml图,确保各个情况都顾及到。

​ 但也可能是因为手动构造图深度以及复杂度不够,在第一次作业,高复杂度的图就产生了cpu超时的现象。这也算是一个小小的失误吧。

4.课程收获

​ 与计算机学院许多其他课程一样,oo教会我最多的是抗打击能力。面对各种突如其来、莫名其妙的错误时,第一时间应该是冷静分析自己为什么会犯错误,如何修改错误,以及之后的作业中如何避免它。在第一单元的第三次作业,我因为代码可迭代性不高,导致代码漏洞百出,以及时间安排不当,沦为无效作业;第二单元第二次作业,我因为早早通过中测,而不去注意讨论区的分享与同学的讨论,而导致官方包未更新,强测直接爆炸;第三单元第三次作业,因为众多有难度的算法消磨光了我的耐心,于是对自己放低了要求,最终因为一个算法的落后而拖累了整个分数。

​ 但是我学到了合理规划作业时间,先将理论吃透再动手实践,正所谓“磨刀不误砍柴工”;与同学们积极讨论,互帮互助,乐于学习同学们的优秀思想成果;面对复杂问题,逐个击破,不断获取信心,不要放低对自己的要求。

​ 具体到oo课程来讲,它教会我的是抽象的思想。大一的c语言,更多的是精确地描述每一个步骤,每一步算法的意义。导致我刚从c转java时极其不适应,因为我迫切的想要知道这个方法,它的底层到底是如何实现的,但当我看到各个类之间复杂的继承关系,以及接口的实现关系时,又产生了无力感。但渐渐地我明白了,或许我们不用太过于关注一个算式它到底是如何拼接组合,一个电梯是如何转载乘客。我只需要关注一个算式它从何继承而来,它实现了何种接口,它继承而来的方法是否需要做出改变,它实现的方法是否与其它类有所不同;一辆电梯也无需关注它的乘客姓甚名谁,他主需关注调度器是否分派了乘客给他,以及是否需要调转方向,是否需要载客卸客,调度器也无需关注乘客被如何送达,他只需要关注将乘客交付给一辆最适合的电梯。抽象,高内聚低耦合……等等思想随着一次次作业不断加深印象,获得了一种截然不同的变成体验,尽管刚开始接受确实有些困难,但一步步走来确实收获颇丰。

5. 三点建议

  • 实验课的开放性填空题目最好能少一点或者公布实验分数。。。毕竟答案多样性加上实验分数不公开,心里有点虚。
  • JML章节,最好能在作业出来之前检查好规格是否正确,写完之后发现规格变了四五次属实难顶
  • 助教团队在讨论区解答问题时,最好能更加“平易近人”,往往提出一个指导书上难懂的概念性问题,助教大大的回答有时比指导书更加难懂。。。专业性固然重要,但最好能照料一下语文本就不好的那些同学hhh。

6. 线上学习体会

​ 不知道是我自己的能力问题还是其他原因,在视频教学的同时穿插提问环节,假设按照课程规定时间观看视频,我是跟不上互动问题的节奏的。我可能碰到一页不懂得ppt会反复思考一会,这造成的时间滞后会使我讨论也慢了一截。

​ 在开学初期,我还能积极参与讨论,后期可能是因为更不上的原因,便直接去观看视频了,基本放弃了讨论,选择课后回看聊天记录。或许少了许多思考的环节吧。

​ 其余线上学习体验较好,给我们提供了很高的自由度,老师和助教人也很好。主要是自己在家学习不够专注,留下了许多遗憾,但也学到了不少东西,也算是一次特殊的经历吧。

你可能感兴趣的:(oo第四单元总结)