BUAA-OO-Unit4总结及课程总结

BUAA-OO-Unit4总结及课程总结

一、总结第四单元作业架构设计

第四单元的作业主要是实现UML类图、顺序图、状态图的解析,需要理清层次,不需要特别关心架构方面,总体难度不大,但需要注意细节和对UML模型的理解。

项目结构

src
    ├─element
    │  ├─classmodel
    │  |  ├─ClassNode.java
    │  |  ├─InterfaceNode.java
    │  |  └─OperationNode.java
    │  ├─sequence
    │  |  ├─InteractionNode.java
    │  |  └─LifeLine.java
    │  └─state
    │     ├─RegionNode.java
    │     ├─StateMachineNode.java
    │     ├─StateNode.java
    │     └─Transitionode.java
    ├─handle
    │  ├─HandleStructure.java
    │  └─UmlType.java
    ├─main
    │  ├─MainClass.java
    │  └─MyImplementation.java
    └─validitycheck
       ├─CheckUml001.java
       ├─CheckUml002.java
       ├─CheckUml003.java
       ├─CheckUml004.java
       └─CheckUml006.java

总体思路

首先通过HandleStructure类对模型的结构按层次进行分类解析,建立起elemenMap图来对UmlElement进行分类,然后建立起模型的结构。

解析过程中会用到自己定义的类来包装官方包中的UmlElement,来增加官方包中的UmlElement中不具有的属性、方法,总而建立起层次化的结构,来实现题目中的各种问题。如通过ClassNode来包装UmlClass,在ClassNode中保存父类、子类、实现接口等信息,并对外提供getRealizationInterfaceName()方法,来解决getClassImplementInterfaceList()这个问题。同时,在ClassNode中还保存UMLAttribute和OperationNode,在OperationNode中保存了UmlParameter,从而实现了层次化的建模,为后续的问题处理带来了很大的方便。

bug情况分析

第一次作业没有bug。

第二次作业没有bug。

第三次作业在对UmlParameter进行检查时遗漏了下面if中的"!",导致检查对象出错。

for (UmlElement element : handleStructure.getElementsMap().get(UmlType.UML_PARAMETER)) {
            if (!((UmlParameter) element).getDirection().equals(Direction.RETURN)
                    && nameIsBlank(element.getName())) {
                throw new UmlRule001Exception();
            }
        }

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

第一单元 表达式解析

第一单元主要是让大家初面面向对象,通过对表达式的解析来让大家学习层次化的结构,来学习面向对象的思维方式。表达式包含表达式、项、因子等层次化的关系,通过递归下降法来进行自顶向下的层次化解析,体现面向对象的特点,来让大家逐渐熟悉面向对象的思维方法。

第二单元 多线程电梯

第二单元主要是让大家学习多线程的知识,通过实时电梯系统来模拟多线程,来学习多线程的创建、运行、同步互斥访问,这次作业的难度就比第一次增加了很多,需要时刻关注线程安全,即锁的合理使用,不能少也不能多。这个单元的主体框架是生产者-消费者模型,虽然这个模型可以很好的实现需求,但是需要对调度器有很高的要求,调度器是性能的主要决定因素。到最后才发现,自己设计的调度器还不如最“懒”的方法(自由竞争)性能好,有时候简单却又有效。

第三单元 JML契约式编程

第三单元主要是让大家学习契约式编程,通过具体的JML语言来学习契约式编程。这一单元只需要根据官方提供的jml来实现对应的接口来完成接口中定义的函数,而不需要花费精力在架构的设计上。jml语言利用前置条件、后置条件、不变式等语法描述Java程序的数据、方法、类的规格,只关注方法的执行效果和对其他产生的影响而不需要关注方法本身是如何实现的。

第四单元 UML类图解析

第四单元主要是让大家学习UML模型,通过对UML类图的解析来进一步学习层次化设计。这一单元的设计模式和第三单元类似,都设计有缓存计算层,实现接口功能的应用层来更好地实现了用户需求与数据的交互,而且不会影响数据结构层。

三、总结自己在四个单元中测试理解与实践的演进

刚开始测试时使用随机构造的数据检验基本功能是否正常,然后根据边界条件来构造特殊的数据来进行边界测试,后来开始建立随机数据生成器,通过和同伴的对拍来进行大数据轰炸,与此同时构造部分随机数据生成器不容易覆盖的数据进行测试,但是发现随机生成的数据的覆盖率并不会很高。其中,第三单元的JMl可以使用JUnit工具来进行黑盒测试。

四、总结自己的课程收获

学期还没开始的预习作业让我第一次接触到面向对象的思维方式,通过一个学期的学习,我从一个无知少年到现在的对面向对象思想、架构设计、多线程、层次化设计等方面有了一定程度的理解。主要收获如下:

1、熟练使用了Java语言和IDEA。这学期开始之前我只是非常浅薄的了解Java语言,更谈不上熟练应用,而且只使用过vscode进行过Java的编写,vscode是一款好的编译器但我认为还是不如IDEA这种专门用于Java的编译器。通过一个学期的摸索已经能较为熟练地使用IDEA和Java语言了。

2、养成了好的代码风格。学习OO之前根本就没有所谓的代码风格所言,完全按照自己想法进行编程,现在已经根据课程的要求形成了代码风格的习惯。

3、学到了面向对象的思维方式。

4、复习了图论的一些算法,最短路径、最小生成树等算法。

5、学习到了JML契约式编程和UML建模语言。

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

1、希望加强中测,希望能加强一下中测的强度,或增加一下中测的梯度,有时候中测随随便便过,但强测直接被hack烂。

2、希望研讨课提供开放性强一点的问题,而不是针对作业的思路框架进行研讨。根据自身研讨课感受,大家作业的基本思路和框架都是大同小异的,好多都是我也是__这样做的。

3、课程组提供评测机搭建的一些思路和教程,我也尝试过搭建评测机,但往往是测试的强度和覆盖率不够,用处并不是很大。

posted @ 2022-06-28 16:07  Xbuluo  阅读(31)  评论(0编辑  收藏  举报