面向对象课程总结

面向对象课程总结

1、单元4架构设计

做业1

做业1,我在顶层采用了HashMap将类(接口)与其对应的内容进行一一映射存储,进而将查询操做向下分配给ClassDetails。在对类内方法的参数的存储上,我采起了类似的方法,即便用OperationDetails类存储,并将对方法参数类型的查询分配到该类内部。这是一系列能够用HashMap层层向下找的过程。python

我还设计了一个单例类AllElements,这个类用来存储全部的id与UmlElement的映射关系,这使得程序从任何一个地方均可以根据id获得对应的UmlElement。此外为了方便,我还设计了一个单例类AllMaps,方便在ClassDetails类内部进行DFS操做时能够根据UmlClass或UmlInterface取得对应的Details。git

做业2

做业2中,因为是对做业1进行扩展,即添加了新类型的Uml图,所以我将不一样类型的图放到三个不一样的package中,分别对三个图进行处理。当调用到对应图的方法时,由MyUmlGeneralInteraction类对下层的三个Interaction类方法进行调用。算法

这里沿用做业1的设计。编程

这里是对于顺序图的处理部分。设计模式

这里是对状态图的处理部分。安全

做业3

做业3则是在做业2的基础上添加对错误数据的检查,总体架构没有什么大的变更。关于错误数据的检查,也是层层分配到下一级的类中进行处理,直到分配到与该错误数据密切相关的层级进行真正的处理,并再逐层返回。因为总体架构与做业2一致,就不放UML类图了。多线程

期末时间紧张,就不本身画UML图了,但愿老师理解_(°:з”∠)_架构

2、架构设计与OO方法理解的演进

在上这门课以前,我对OO的理解就是封装、继承、多态。那个时候我觉得,这一门课程就是会把封装、继承、多态的具体实现方式讲清楚。如今来看,我那个时候对OO的理解仍是TOO YOUNG TOO SIMPLE。OO不只仅是封装、继承、多态,还有架构设计、编程方法的相关内容。编程语言

第一单元是层次化设计,其实就已经把封装、继承、多态的核心内容讲清楚了。三次求导做业中,我主要思考的是我须要设置什么样的一个类,这个类是对什么事物的抽象。如何合适地设计一个能够实现要求所需功能的类,这即是我第一单元对架构设计的理解。此外,这个时候我接触到了TDD——Test-Driven Development。在开发代码功能以前,先将单元测试用例写好,这有助于在编程过程当中对总体性的把握,能够避免在编程过程当中的不少疏漏。但这个时候我还不太会用JUnit进行单元测试,所以没有付诸实践。不过,这是我所理解的OO编程方法的一部分。工具

第二单元是线程安全设计,这个单元是对多线程编程进行了一个初步的介绍。三次电梯做业中,我主要思考的是生产者-消费者模式的应用,进而拓展到对设计模式的应用。如何在本身的设计中合理的应用不一样的设计模式,简化本身的代码,这是我第二单元对架构设计的理解。

第三单元是规格化设计,这个单元引入了规格的概念。这个单元中,结合OS课程的“抽象与权衡”的思想,我较为深入的理解了抽象的思想。而规格,就是将编程过程当中的行为抽象出来,将行为从具体的代码实现分离出来的一个表示方式。虽然JML不是很好用,可是将行为与代码实现分离的思想很符合面向对象的设计方法。我能够肯定某个模块的行为,可是其具体实现却能够随意替换,只要能够实现该行为,我能够采用不一样的容器、不一样的算法、乃至不一样的子架构,这对于我以后的编程具备十分积极的影响。

第四单元是模型化设计,即用UML来表示架构设计。UML图很直观,能够表示的场景也不少,果然不愧被称为“统一建模语言”。经过UML语言,即可以将架构设计与代码实现完全地分离开来,我能够不用考虑使用Java仍是C++,可是我却能够把个人程序架构设计出来,这就是UML的奇妙之处。此时我对于架构的理解就再也不依赖于某一种编程语言,架构设计就是一个独立于编程语言的过程。

以上即是我对架构设计与OO方法理解的演进。

3、对测试的理解与实践的演进

测试是保证程序正确性的必要手段。没有人能够保证本身在写程序的时候历来不会写出bug,而测试即是消灭这些bug的重要方法。

第一单元,我看到有不少同窗使用python和cmd搭建数据生成与自动对拍脚本,因而我也尝试搭建了一个。虽然数据是随机生成的,但说实话效果还真不错,个人第二次做业就在提交前一个多小时被发现了一个“敲错了一个字符”致使的bug,并且还帮助我在互测中收获了一些成果。这里的自动对拍脚本优势是能够自行进行测试,省去了人工测试的成本。缺点1是数据彻底是随机生成的,没有针对性,须要补充人工构造的特殊样例,此外还有缺点2是搭建须要消耗较多精力,若是有新的项目,甚至于对老项目进行迭代,都须要对评测脚本进行修改,评测脚本的可移植性极差。

第二单元,因为是多线程,须要依照时间进行输入,我使用python的subprocess模块进行数据的处理与定时输入。这个单元我没有进行数据自动生成的工做。多线程bug的出现是偶然性居多,一样的测试数据运行不一样次,结果可能都不同,所以生成随机数据的意义就不是很大了。这一单元我主要采用手动构造测试数据,并使用python帮助我进行特定时间点的输入,所以在测试上是比较朴素的。

第三单元,我接触到了JUnit。JUnit与规格的搭配简直是绝配,我根据每一个方法的规格,对这些方法的行为进行了大量的测试,效果很是好。从第一次做业的JUnit样例能够一直沿用到第三次做业,所以当我为了改善性能而对程序代码进行大批量修改时,就能够在修改完毕后再运行一次单元测试,这样即可以知道有没有改出问题来。第三单元我彻底没有经过输入输出进行对拍测试,而彻底将测试转移到对方法行为的检验上,感受效果很好,用起来很舒服。

第四单元,因为临近期末,时间较为紧张,个人测试作的比较少。本单元的测试主要仍是依赖于我对于极端状况输入数据的构造上,对与JUnit的使用不是不少。因为我比较仔细地构造了较多状况的样例,最后的强测结果还算能够。

4、课程收获

  • 简单理解了面向对象的哲学思想(并不算深入理解,还需在往后的学习中继续感悟)。
  • 大体熟悉了Java语言的使用。
  • 了解了git、Typora(MarkDown)、StarUML等一系列工具链的使用。
  • 规范了本身的代码风格。

5、一点建议

  • 但愿上机实验能够有一些结果反馈。一样也但愿每次上机实验的内容能再完善一些,尽可能把一些使人疑惑与迷惑的内容都讲清楚。//(我知道上机实验是助教们根据教学过程当中的需求,在开始实验前不久才肯定下来的内容。这样的好处是题目的灵活性较强,能够随时根据教学状况进行调整。可是感受有些时候实验题的严谨性还有一些值得商榷的地方。所以我想的是,是否能够将一些严谨性较佳的实验固定下来,在每一年延续下去,使得部分实验在经历了不断地迭代以后,成为OO课程每一年的「精选实验」。)
  • JML单元最后的难度所有集中到了算法上来,对JML的学习反而是弱化了,因此感受JML单元的内容能够再调整一下,减小一点关于算法的考察。//(光是Tarjan算法我就研究了一天半,结果最后仍是出了点小错误,哭)
  • 我不是很了解最后的总评成绩是如何计算的,不过感受能够在总评成绩计算的时候能够考虑「去掉一个强测最低分」,由于感受OO这么屡次做业,即使是很是优秀的同窗,也不免会出现「翻车」的状况。一次偶然的失误不该当对最后的总评成绩形成重大的影响,所以感受去掉一个强测最低分是合理的。//(最高分就不要去掉了哈哈哈)

6、线上OO体会

我的感受,OO是本学期线上课程中所受影响最小的一门课了。不须要现场上机(OS课设每周上机考试取消了),不须要期末考试(OS理论课期末考试线上开卷了),只须要按时完成每周的任务,实验课按时进行实验就行了。

对于我来讲,我以为线上的OO虽然少了许多和同窗面对面的机会,却可使我更加独立地思考如何去作每一次的做业、如何设计架构,对于OO的学习反而是更有帮助的。

此外在最后一次实验课上,我家里停电了,这应该算做我在线上OO受到的最大影响了吧。电力因素的不稳定,可能会对线上课程形成很大的影响。虽然几率很低,咋就刚好让我给碰上了呢?【无奈】

最后,感谢老师和助教这一学期的辛勤付出,正是由于大家的付出,才让咱们的线上课程得以开展下去。也感谢一直在和我探讨问题的同窗,正是在交流的过程当中我解决了不少个bug,也正是在交流的过程当中咱们可以共同进步。

看上去OO课程已经结束了,但其实关于OO的一切才刚刚开始。加油吧!

相关文章
相关标签/搜索