OO第四单元总结——夏至

一、总结本单元三次作业的架构设计

第一次作业

类图:

第一次作业的时候,我正在准备复习os考试,没时间研究架构,所以架构设计的非常烂orz。

没有把每一个UmlElement都抽象到具体的Class、Interaction、Operation,只是把他们全部都处理成了有儿子节点的TreeNode。这种写法实现起来很简单,建立树状结构很方便,而且层数很少,但是导致每次查询的复杂度都很高。每次查询,比如查询类的私有方法,我需要从一个HashMap里先用name查到这个类的id,在用id查到这个类的树节点,再查他的儿子节点。这样的查询方式就不如“一开始解析的过程就缓存好类的私有方法”的时间复杂度低了。

第二次作业

类图:

第二次作业加入了顺序图、状态图。如果还按照第一次作业那样不加区分地建树,查询会非常麻烦,而且也不符合面向对象的思想。

第二次作业吸取了第一次作业架构的优点,也弥补了缺陷:

  • 我把各种重要的Uml元素(比如class、region、stateMachine)单独建立了一个类作为适配器,然而他们其实都有相同的特征:都有自己的子节点,所以我就让他们都继承自第一次作业的TreeNode,这样很好的保留了第一次作业的优点,也解决了没有专用适配器的问题。
  • 并且让顶层的类继承自第一次作业的类,这样就可以保留第一次的代码了。

第三次作业

类图:

第三次作业与第二次的架构基本一样。我第三次作业仅仅增加了检查规则的部分代码,总体是沿用第二次作业的架构

由于本次作业的时间复杂度要求不高,所以采用了暴力的对每个点都bfs的方法来查找环路,后来测试没有炸,说明助教对这种设计还是比较仁慈的。

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

第一单元

  • 架构设计: 回看最开始第一次作业我写的程序忍不住发出笑声——input一个类,main一个类,output一个类。完全是面向过程的思路。所以第一单元是经历了一次重构的,设计了表达式-项-因子的层次,搭建了递归使用parser的架构。
  • oo方法:
    • 工厂模式:第一单元重点学习了工厂模式,即一个工厂负责生产各种对象。不过实际上我使用的只是处理输入解析的那种简单工厂模式,可能还有抽象工厂模式静态工厂方法模式等没有尝试过,暑假尝试一下
    • 异常处理:由于第一单元对于输入的解析会要求不对格式的输入要直接输出"Wrong Format",这种需求可以用抛出异常,在顶层接收异常并打印信息的方式来很好地解决。于是我自己定义了一个IllegalInputException来处理。

第二单元

  • 架构设计: 吸取了第一单元重构的教训,我从第一次作业开始就思考如何搭建一个能延续三次作业的架构。后来就是按照调度器和电梯的角度构建程序的,划分的职责是电梯负责送人,用look算法决定在哪一层停留,而调度器只管分派乘客的请求。这种职责划分延续了3次作业,还是很方便的。
  • oo方法:
    • 生产者-消费者模式:第二单元重点学习的是多线程的同步和互斥。而最经典的模型就是生产者-消费者模式了,采用wait、signalAll的方法保持线程安全。我实际上没有去自己写一个传送带类,而是直接采用java里面自带的线程安全容器。

第三单元

  • 架构设计:第三单元的架构,我其实谈不上是设计过的,只是按照官方给的接口去实现的,当代码多了或者有一个单独功能的模块(比如并查集和迪杰斯特拉算法)就单独开了一个类去实现。具体实现过程中,由于cpu时间的要求很紧张,我学习到了很多省时间的架构方法:
    • 比如在实例化一个hashMap或者hashSet的时候,先规定一个很大的容量,来减小之后扩容的时间损失,是空间换时间
    • 在查询的时候,可以缓存查询的信息,再下次查询的时候,如果没有更新,就可以直接把缓存的结果当成查询结果。
  • oo方法:
    • jml语言:jml是第三单元学习的重点,它帮助我们与产品经理沟通,更好的理解需求。同时也是一种契约,通过不变式、前置条件来约束代码实现的过程。

第四单元

  • 架构设计:第四单元的架构设计我是在边写的过程中边感悟出来的,第一次作业是懒人写法,一个TreeNode记录每个元素的子节点就完事了,这实际上是实现了一个功能最少的适配器(我当时没有意识到自己写了一个适配器)。第二单元重构的时候,突然领悟到可以让各种class、attribute、operation都继承这个TreeNode类,因为他们都有子节点,但是各个子类可以增加独有的方法。这样就实现了合理的层次划分。
  • oo方法:
    • uml语言:与jml一样,是一种建模语言,不过它更加直观,可以通过UML图的方式来展示各个建模对象之间的关系,帮助我们与产品经理沟通。我们学习了类图、状态图、顺序图。在starUML里面画图,可以真正的面向对象来建模了,有一种从码农升级为产品经理的感觉。
    • 适配器模式:这单元还重点学习了适配器模式,不过我感觉自己没有真正的理解,只是记得实验课给了2种实现方式,一种是通过接口,一种是通过实例化对象做属性。我一般还是采用后面这种的写法。

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

第一单元

主要是采用黑箱测试:

用python的xeger包自动生成表达式,并且用sympy.diff对生成的表达式求导,再把同学的java程序的求导结果输入judge.py程序进行一定范围内逐个数据点的比较,错误的时候就把原表达式写入一个WA.txt文件。

第二单元

由于第二单元我参加了研讨课,题目就是"如何进行有效测试",助教让我学习了一下JUnit。

我从这开始才明白了,测试分为黑盒测试白盒测试

所以我第二单元我有黑盒测试:用自己的定时投放的评测机进行了本地测试。

也有白盒测试:

  • JProfiler的CPU Views功能,选择Thread status为All status,可以看到所有方法占用的CPU时间,它显示的是调用树,能发现哪个方法CPU时间太长来检测自己是否暴力轮询了。
  • 写了一点JUnit代码,测试了第三次作业加进去的一些类。

第三单元

这个单元重点学的就是JUnit单元测试。

所以从第一次作业开始,我就很注重采用JUnit进行测试。每次作业留下的JUnit代码都可以用到下一次作业里,看新作业改动之后是否满足之前作业的功能,是很好的测试方法。

我第三单元的3次作业都实现了接近100%的覆盖率测试。虽然说JUnit覆盖率大的测试并不代表没有错误,但是我还是尽量能测到的地方都测试了,以此来减少错误的发生。

第四单元

与第一第二单元可以全部由python很方便地实现正确性检查不同,第四单元比较适合随机生成数据,再和同学对拍,来检查是否有bug。

所以我采用了对拍器,和同学对拍。

四、课程收获

我是一个很内向的人。但是oo课程中我能够很自然地和其他同学讨论、在班级里回答老师的问题、参加研讨课。这都帮助我走出自己的小世界,学会和他人交流

  • 第一次在讨论区发帖
    • 上学期的计算机组成课也有讨论区,但是由于高工二选,我是大一的暑假才开始自学c语言。大二上学期我是一个刚接触编程2个月的菜鸡,啥也不懂,错过了很多参与讨论的机会。
    • 这学期的oo课程我阅读了很多前人的博客,发现很多有趣的idea,于是总结他们的经验,形成自己的看法,能够在第三次作业的求导简化程序的性能上取得提升,这种惊喜我便想在讨论区和大家分享。于是自然而然的发了第一篇讨论贴,没想到能够收到2位同学的回复,还是很开心的
  • 第一次参加研讨课
    • 当时其实是为了研讨课的分数而参加的,不过参与的过程中,我自己的能力得到了提升。一开始我只是想讲一下自己的评测机,后来友好的助教给了我很多建议,非常感谢助教_。我被迫学习了很多JUnit相关的知识。于是我的题目改成了"如何进行有效测试",分成了黑盒和白盒测试2部分,在2单元研讨课讲的,算是帮助大家预习一下JUnit了。

五、立足于自己的体会给课程提三个具体改进建议

  • 增加助教的人手
    • 一个班有60个左右的学生,由一个助教负责。然而助教一般都是大三下学期的学长学姐,他们有计网、软件工程等课的负担,平常还要负责和这么多同学、老师打交道,可以说是很忙、很辛苦的。如果能够增加助教的人手,配置到一个班2~3个助教,会不会减轻一些助教的工作负担呢?
    • 不光是助教的负担减轻了,助教:学生的比例增大,也符合现在的小班化教学的教育趋势。
  • 提高实验课服务器的能力
    • 虽然我目前还不清楚咱们的实验课是怎么实现收作业,改作业的。但是每次实验,我们都比较害怕会出现服务器崩溃的情况,所以希望能够把这个实验课的服务器的功能开发的更完善一些,能够保持安全稳定的运行是最好的了。
  • 老师可以露个脸吗
    • 我只是好奇心太多想感受课堂气氛,见不到老师的尊容,上课对着个电脑很容易发呆走神哈哈哈。
    • 要是在教室里上课,老师目光一扫过我,我飘散的思绪就会被打断,及时回到课堂上来。

六、谈一谈线上学习oo课程的体会

感觉和在学校里学习差别不大,反正计算机的课程只要有个电脑大概就行了。

不过,由于现场课改成了网课,我还是觉得有点区别,网课可以随时看,随时暂停,回放。但是现场课可以面对面和老师交流,体会老师的风采,也更能集中精力听讲课。所以是各有优点和缺点吧。

总之,一学期的oo课程我学习到了很多java、设计模式、软件测试相关的知识,认识了优秀的老师、助教、同学。

感谢oo课程组的辛勤付出!

posted @ 2020-06-19 15:37  18374162  阅读(231)  评论(0)    收藏  举报