OO总结

作业架构设计

第一次作业

我认为第一次作业有两个难点:一方面是对各个UMLElement的理解;另一方面是将读入的UMLElement组织起来并建立关系。

架构设计

下面是这次作业主要部分的UML图:

  • UMLElement的存储:由于输入UMLElement的无序性,我将传入的参数UmlElement[] umlElements先进行了分类,存储至元素管理类MyUmlElementAttay中。
    private HashMap<String, UmlClass> umlClasses = new HashMap<>();
    private ArrayList<UmlAttribute> umlAttributes = new ArrayList<>();
    private ArrayList<UmlOperation> umlOperations = new ArrayList<>();
    private ArrayList<UmlParameter> umlParameters = new ArrayList<>();
    private ArrayList<UmlAssociation> umlAssociations = new ArrayList<>();
    private ArrayList<UmlAssociationEnd> umlAssociationEnds = new ArrayList<>();
    private HashMap<String, UmlInterface> umlInterfaces = new HashMap<>();
    private ArrayList<UmlGeneralization> umlGeneralizations = new ArrayList<>();
    private ArrayList<UmlInterfaceRealization> umlInterfaceRealizations = new ArrayList<>();
  • 为了对类中的Attribute、Operation、Association、Interface进行更方便的管理,我设计了对应的XxSet类。由于需要继承得到父类的属性、父类的关联、父类的接口。我在各个XxSet里编写了update方法。

  • 对于比较难处理的类的继承问题与接口的实现问题:

    //MyClass中类的继承
	public void setFatherInfo() {
        if (isUpdateFather == true) {
            return;
        }
        if (father == null) {
            topFather = this;
            isUpdateFather = true;
            return;
        }
        MyClass nowFather = father;
        while (nowFather != null) {
            attributeSet.update(nowFather.getAttributeSet()); //继承所有父类的属性
            associationSet.update(nowFather.getAssociationSet());//继承所有父类的关联
            interfaceSet.update(nowFather.getInterfaceSet());//继承所有接口
            if (nowFather.isUpdateFather) {
                //如果此时的某一上层父类已经更新,则直接继承此父类所有属性即可,无需继续寻找父类
                topFather = nowFather.topFather;
                isUpdateFather = true;
                return;
            }
            topFather = nowFather;
            nowFather = nowFather.father;
        }
        isUpdateFather = true;
    }
//InterfaceSet根据接口的继承关系设置类所实现的所有接口 
public void setInterfaces() {
        ArrayList<MyInterface> visited = new ArrayList<>(idTointerface.values());
        ArrayList<MyInterface> visit = new ArrayList<>(idTointerface.values());
        while (!visit.isEmpty()) {
            //bfs算法
            MyInterface nowVisit = visit.remove(0);
            visited.add(nowVisit);
            idTointerface.put(nowVisit.getId(), nowVisit);

            for (MyInterface i : nowVisit.getFathers()) {
                if (!visited.contains(i) && !visit.contains(i)) {
                    visit.add(i);
                }
            }
        }
    }

第二次作业

在第一次作业类图的解析的基础上,加入了顺序图与状态图元素,迭代难度不是很大。

第三次作业

引入规则检查,需要进一步考虑重名问题、循环继承问题、重复继承问题、接口重复实现问题、类图元素名是否为空等问题。

比较难以处理的是R002,R003,R004,对于循环继承问题,我采用用了用dfs判断是否一个点是否在环上的方法。而对于重复继承,在继承时判断类或者接口是否已经出现即可。

本学期架构设计与测试演进

一学期OO下来,最大的感想就是,码量真不小,鸭梨也是真的大。但被虐完以后真的浑身舒畅,也感到了编程水平实实在在的提升。

第一单元、第二单元再到第四单元的作业,程序中类和包的数量在明显增加。一方面是代码量的增加导致类的增多,另一方面在设计时我会更多地考虑“高内聚低耦合”,更大程度地简化一个类的工作,把它分给多个独立模块。

第一单元

寒假预习与第一单元更像是我的Java入门课。当时的自己对Java还不太了解,处于使用容器仍然需要百度一下的阶段。我在这一单元学会了正则表达式的使用。

在这一单元主要是面向过程的编程思想向面向对象的编程思想的改变。更重要的是,第一单元层层递进的迭代要求,暴露出我面向过程时期写完一次作业算一次思想的弊端,三次作业次次重构,实在非常痛苦。因此从第二次作业开始,我在动手写代码之前会花出更长时间进行架构设计、考虑可能增加的需求。

在这一单元一开始,我还会出现checkstyle提示一个方法过长的不良现象,在以后几个单元的作业中,再也没有出现过这个报错。

这一单元对于架构的另一个重要方面是抽象与继承,并且在这一单元我接触到了工厂模式的学习。

第二单元

第二单元引入多线程,我觉得这是本学期最困难的一个Part,无论是编程还是测试都经历了很多不熟悉。

我觉得这一单元最主要的是理解了多线程的思想,线程如何独立工作,多个线程之间如何协作。第二个单元我将电梯的运行与控制分离,各个类各司其职。不足的是,对于线程的控制我并不是完全清楚,没有使用过lock,在这一单元线程不安全的问题也时常困扰着我。

第三单元

第三单元则是契约式设计,我在这一单元贡献出了我的强测历史最低分5分,由于没有充分理解规格,导致了较大的bug。本单元重点为规格的编写及阅读,面向对象编程适合团队合作完成,规格保证团队的每个人能够实现一定的功能且保证了接口一致,优化代码风格。

第四单元

第四单元主要学习UML图与模型设计,难点在于将众多的数据有序组织起来并提取信息。经过一个学期的历练,面对杂乱无章的数据能够更好地考虑用什么样的类、怎样的数据结构进行组织。同时在这一单元我也完成了对UML图本身语法的学习。

本学期测试演进

回顾一学期的bug与测试,我主要有如下感想:

  • 测试的必要性:心大到过了中测就不管是会受到强测教育的。

  • 大量自动化基础测试不能替代边界测试:曾经出现过和同学对拍了n条数据后,但边界情况出错没有考虑造成的崩盘。

  • 正确性测试不能够替代边界压力测试,对于测试不能存在侥幸心理。

  • Junit测试:我觉得Junit测试更加适合于对某一要求清晰的方法进行测试,体验感很好,但如果针对全局的方法进行测试还是过于繁琐。

  • 测试不能本质解决代码质量的提升,代码的质量取决于架构设计。

课程收获

一学期的课程下来,被虐完之后觉得非常快乐,说是这学期我最喜欢的一门课程也不为过。

虽然这门课程压力比较大,也有几次作业和别的科目的ddl堆在一起,不争气地哭着敲完几百行代码。但是一学期下来收获颇丰,感谢老师的付出。总的来说,我在这门课上收获了:

  • 新学会了一门语言

  • 面向对象程序的思维与方法

  • 第一次从实际需求到设计到实现的快乐

  • 架构设计水平的提升

  • 代码能力与代码风格的进步

  • 提高了对图等数据结构的理解

  • 学会了使用测试辅助工具

  • 和同学合作进行思考和测试的经历

改进建议

  • 希望所有作业的指导书都像第一单元一样详尽易懂,具体来说,第四单元的指导书,或许是因为助教大大们也快要考试了,感觉有些地方叙述不是很清晰。

  • 实验课公布正确答案与成绩,希望做完以后能够知道对错,学到知识。

  • 对于课程一开始Java语言的适应,可以考虑在寒假早一些时间发出预习内容,让大家多一些时间进行Java语言的准备。

  • 希望研讨课能够更多地照顾一下能力一般的同学,听课的同学真的很努力在听了,但有很多时候并不能听懂,听着听着就放弃了,演变成一到研讨课就自我检讨为啥自己跟别人差这么多的思政课。

原文地址:https://www.cnblogs.com/houqingying/p/13166140.html