OO第四单元总结及课程总结


OO第四单元总结博客

一、第四单元架构设计

第一次作业

第一次作业要求实现了UML类图解析器。为了解决输入顺序与UML类图的逻辑解析顺序的不一致,我采用了三层自顶向下依次解析的方法:

第一层第二层第三层
Class, Interface Attribute, Operation, Realization Generalization,Parameter
UML类图

 

 

第二次作业

第二次作业要求在原有基础上新增对时序图和状态图的解析,为了满足需求,这次作业需要进行五层遍历,更新层次表格如下:

状态图:
第一层第二层第三层第四层第五层
State_machine Region State Transition Event
顺序图:
第一层第二层第三层
Interaction Lifeline Message

本次作业中,getStateIsCriticalPoint方法用到了算法,我采用了深度优先搜索加回溯的方式辅助完成了这个方法。其中算法部分代码如下:

private void dfs(MyState myState) {
       if (myState.getType() == 2) {   //当前状态为final状态
           signal = 1;
      }
       for (MyState key : myState.getNextState().keySet()) {
           if (key.getVisit() == 0) {
               key.setVisit(1);
               dfs(key);
               key.setVisit(0);
          }
      }
  }
UML类图

 

 

第三次作业

第三次作业涉及模型的有效性检查,基本架构与第二次完全相同。在九条有效性检查的方法中,R003(查询循环继承)需要用到算法,我采用了dfs算法,新增了DfsClassDfsInterface两个类。

除此之外,我又新增MyEventMyCollaboration两个类。

UML类图

 

 

二、架构设计思维演进

第一单元

第一单元作业需要实现的是对表达式的解析与化简。我分别建立了表达式类、三角函数类和存储三角函数的指数与系数的类,这三个类以关联关系依次存储,从而可以表示出递归任意层的表达式,它们每个类只需要完成自己对应的任务,实现化简、加减乘和乘方运算。由于假期没有进行预习,导致JAVA基础语法知识极度欠缺,这单元的代码我的风格主要还是面向过程的,但是我也在这一单元的作业中还是体会并且运用了OO的封装性,让每个类各司其职,实现代码结构的高内聚、低耦合。

第二单元

第二单元作业实现的是多线程调度的电梯。由于引入了多线程,所以这一单元的作业光是简单的封装是不可以的,如何进行对象之间的交互成为了这一单元作业的一个重要部分。这一单元我采用的是两级生产者—消费者模型,输入线程作为第一级生产者,总请求队列(waitQueue)是第一级托盘,调度器同时是第一级消费者和第二级生产者,并在第三次作业中引入了流水线架构思想,参考实验代码,增加了RequestCounter类。通过这一单元的学习,我意识到OO不仅需要设计好没个类各自的内容,让其各司其职,让它们直接的安全、高效的交互也是至关重要的,一定要保证线程安全。

第三单元

第三单元作业是利用JML规格来增量开发一个多人聊天系统,功能虽然由JML规格已经给定,但重点是如何在满足功能的前提下获得较高的性能,而不应该仅停留在JML字面意思,否则将难以将需求抽象出来,可能造成方法复杂度过高等后果。。因此这单元作业涉及了很多图的相关算法,我运用了并查集、迪杰斯特拉算法和kruskal算法来进行优化。通过这一单元的学习使我对JML规格有了一个较好的掌握,知道了它存在的意义,也知道了JML规格并不是死板的要求而是有很大的灵活性的,从而对OO方法的理解也更上一层楼。

第四单元

第四单元的作业是对UML图进行解析和对模型的有效性检验。架构设计思维的重点就是要分层解析,将对象、对象之间的继承、实现、接受消息、状态转移等关系全部抽象出来,组建成模型。通过这一单元的学习使我更加深入理解了UML类图、UML时序图和UML状态图。对OO方法的层次化处理有了更好的理解。

三、测试理解与实践的演进

在第一单元和第二单元中,主要是通过生成符合条件的数据进行黑盒测试,在第三单元和第四单元中,在黑盒测试的基础上我加入了JUnit单元测试。在互测过程中我主要是通过构造边界数据来进行hack,这是一个找bug效率很高的方法。

四、课程收获

  • 较为熟练地掌握了JAVA语法。

    通过这四个单元的学习,让我完成了对JAVA这一编程语言的各种语法的掌握,较为熟练地掌握了各种容器的使用。

  • 提高了我的写代码能力

OO课之前我的代码量都只是几百,在经过OO课的学习后,我的代码量已经可以上千,并且比之前写的更 有层次感,写代码能力显著增强。

  • 学会了面向对象的编程思想

学会了面向对象的各种特性如:封装性、继承、多态等。

  • 深入学习并理解了UML图的结构,并学会了根据代码画出UML图。

  • 学会了博客的书写。

  • 对之前学习的算法进行了重温,并学习了更优的算法。

  • 学会了git的使用以及IDEA的使用技巧。

  • 学会了JML规格,并掌握了如何用它来书写代码。

五、改进建议

  • 希望对实验课部分进行改进,增加正确性反馈。并且我认为在现有管理方案下实验课比较松散,实验课的分数占比应该减小,不然会有一些不公平。

  • 希望能在第一周的时候先不布置作业,或者减小难度,不然第一周的学习真的太过痛苦,虽然寒假有pre,但还是感到非常的紧,可以说这四个单元作业中,我认为第一单元的作业是最难的、最耗费精力的。我认为第三单元的作业可以缩减一次,因为如果是为了掌握利用JML规格书写代码,两次作业我觉得完全合理。

  • 希望可以在理论课上加上一些对自动化测试的讲解。

posted @ 2022-06-28 22:39  GOOD__BOY  阅读(23)  评论(0编辑  收藏  举报