OO_Unit4_blog

OO第四单元博客

1 第四单元架构设计

1.1 实现扩展类

这一次单元作业主要是对Uml类图进行解析,并在此基础上实现查询操作。我先实现了自己的类,并实现了通过UmlElement到MyElement的构造方法,在此基础上模仿官方代码中的继承关系,对Uml图中的类进行扩展。

对于在树状关系中不为底层的类,以及彼此之间存在邻接关系的累,我让它们继承MyElement便于扩展,例如MyClass,MyInterface,MyOperation类,以模拟Uml图中的树状关系。

到最后一次作业,我实现的层次结构如下:

 

1.2 设置字符串容器

这一次作业中,由于每一个元素都有唯一标识的id,因此我将id作为了区别元素唯一标准,规避自己构造的扩展类没有覆写equals方法和HashCode方法带来的问题,使用了大量的HashSet<String>字段代替某一特定类的容器。

在导入所有元素时,对于每一个类,我维护了若干的形如下式的结构体 HashMap<String, ? extends MyElement> ,HashMap<String, ? extends UmlElement> ,将它们设置为public static类型,保证在任意类中可以通过id检索到对应的对象,这样也便于针对某一类遍历操作的实现。

例如所有和状态图有关的类存储在MyStateChart类的字段中如下,并保证各容器在查询开始前均已预处理好:

public class MyStateChart implements UmlStateChartApi { 
public static final HashMap<String, MyRegion> ID_TO_REGION = new HashMap<>();
   public static final HashMap<String, MyState> ID_TO_STATE = new HashMap<>();
   public static final HashMap<String, MyStateMachine> ID_TO_STATE_MACHINE = new HashMap<>();
   public static final HashMap<String, MyTransition> ID_TO_TRANSITION = new HashMap<>();
   public static final HashMap<String, UmlEvent> ID_TO_EVENT = new HashMap<>();
//...
}    
1.3 解析顺序

将预处理好的容器信息转化为图的关系时,我采用自底向顶的顺序进行解析,保证程序正确运行,顺序如下:

  • ClassModel

    • Parameter

    • Operation

    • Attribute

    • Generalization

    • InterfaceRealization

    • AssociationEnd

  • CollaborationDiagram

    • Message

    • Lifeline

    • Interaction

    • Attribute

  • StateChart

    • Event

    • Transition

    • State

    • Region

2 架构设计思维/OO方法理解演进

2.1 第一单元

第一单元的设计是第一次进行如此大代码量的开发,而通过学习第一次上机的代码也让我对层次化的设计有了初步的认识。最终我基于表达式、项、因子的三个层次的结构,对表达式解析程序进行扩展,完成了第一单元的作业。

第一单元让我理解了好的架构在迭代开发中的优势,并且在其中我也通过字符解析器的复用,对面向对象编程中类模式的优点有了更好的感悟。

2.2 第二单元

第二单元是面向多线程的编程,一开始对多线程的理解不到位。对同步块的设计和notifyAll的设计一度影响了面向对象的架构,并且在第五次作业的强测中尝到了苦头。

后来我采用了精细化管理的思想,按照请求电梯种类、请求电梯轨道、请求纵/横向电梯具体楼层/座、请求运行方向四个层次,对乘梯请求进行了精细化的索引管理,重构实现了横向电梯及换乘。

在这个过程中,我的架构设计能力进一步提升。而结合操作系统进程部分的学习,我对线程也渐渐有了完善的理解,对多线程代码设计有了更好的认识。

2.3 第三单元

第三单元主要是契约式编程,架构复杂度比前两单元下降。

这一单元中,我主要学习阅读了JML语言,通过它实现代码的书写。此外我复习了离散数学相关的图论知识,并且对面向对象函数中递归调用有了更深的认识。

2.4 第四单元

第四单元学习了UML图的规范,并且实现层次化的架构设计。而就个人而言,它的代码架构是比前三个单元都要复杂的,到最后一次作业代码增量1700行。在这一过程中,我也学习到了(赶紧补上断头句QAQ)如何阅读他人的源码进行接力开发,以及如何在构造方法有可见性限制的情况下对官方包中已有类进行的扩展。

3 测试理解与实践演进

  • 第一单元主要是手捏极端数据,通过对拍进行测试,效率低下。

  • 第二单元学会了jar包的导出以及命令行运行导出数据,实现了大输出数据的导出。而多线程编程错误具有不可复现性,因此测试中使用了半自动化的手段让jar包重复跑同一组数据。

  • 第三单元尝试过JUnit的简单使用,可惜最后浅尝辄止了。对于基础的操作,我手动构造了若干基础样例进行了基本测试。对于时间复杂度较高的若干方法,通过半自动的方法构造数据进行对拍。

  • 第四单元,由于标准答案唯一,因此用c语言实现了文本对比的程序,实现大量数据的的自动对拍。

4 课程收获

这学期OO课一路走来比较坎坷,学到的包括但不限于:

  • Java核心类的使用

  • 面向对象设计思想与设计模式

  • 多线程编程的设计思想

  • JML/UML规范化源码的阅读理解能力

  • 理解了黑盒测试的重要性

我架构设计能力有了很大的提升,上千行代码程序的独立开发让我对以后大项目的开发流程有了基本的概念。在这一过程中花费充足的时间去思考框架的设计,最后在增加功能时可以做到增量化开发,大大减少重构的频率,可以节约很多时间。

没能独立搭建评测机以及数据生成器,可能是我在OO课中的一个小遗憾,但是四个单元的强测已经让我认识到自己构造数据、自己测试的重要性,也希望自己能利用好暑假的时间弥补OO课程中欠下的精力。

5 改进建议

  • 可以提供python搭建评测机的教程,或者理论课讲解数据生成器的设计思路。

  • 实验课可以反馈评测结果。

  • 理论课内容可以更贴合实验课,以及提供课件思考题的答案。

  • 第四单元(特别是第15次作业)指导书的表述可以更清楚,很多细节要求需要通读讨论区才能知晓。

posted on 2022-06-28 23:04  cccvs  阅读(54)  评论(3编辑  收藏  举报