OO第四单元反思与总结暨期末总结

零、前言

认识辩证运动的全过程是“实践、认识、再实践、再认识,这种形式循环往复以至无穷。”(《毛选》第1卷,第273页)

OO的学习与实践是辩证统一的:我们对OO的学习需要我们有对工程结构的实践之中,同时我们的认识行为又会反作用于我们下一次的工程实践之中。如此往复,我们的软件工程能力就在这个实践与认识的辩证运动之中螺旋上升。

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

4.1. 第一次UML架构设计

这一次要解决的问题很简单,并且被完全包含在了下一次架构的解决方案里,所以我们重点讨论下一个架构。

4.2. 第二次UML架构设计

4.2.1. 实现难点分析

  这次问题更加体现UML单元的难点和问题所在:

  首先是对UML类图、顺序图和状态图的精准理解,了解题目意图所指,加上阅读所有继承了UMLElement抽象类的方法接口,明白自己有哪些可利用的资源、要利用哪些资源以及这些资源的工程含义。

  第一个难点在于广度,一方面在于UMLElement的数量之多,另一方面在于需求指令的进一步增长(20个左右,这里将checkForAllRules()也考虑进来)。

  第二个难点是深度,指一部分需求需要二次索引,因此需要我们有分级的措施。再由各个服务类

4.2.2. 集中应用分布化处理

  架构第一点在于将集中的需求分布化,因为一个很现实的问题是20个需求全放一个类里实现会爆CheckStyle,我个人的做法是设计了一个顶层的交互类用来确定实现需求的“服务类”,然后再由各个服务类实现具体需求。

    //top serve
    @Override
    public int getClassAssociationCount(String s) throws
        ClassNotFoundException, ClassDuplicatedException {
        return topServe.getClassAssociationCount(s);
    }
​
    //sequence serve
    @Override
    public int getIncomingMessageCount(String s, String s1) throws
        InteractionNotFoundException, InteractionDuplicatedException,
        LifelineNotFoundException, LifelineDuplicatedException {
        return sequenceServe.getIncomingMessageCount(s, s1);
    }
如代码所示是顶级类Model将不同的需求交与不同的服务类来实现。
4.2.3. 分类分级处理

  本次作业主要有四种指令三种图的查询(SequenceGraphClassGraphStatechartGraph),这就需要我们将所有UmlElement分成三个大类处理,同时不同的UmlElement之间有明显的分级关系,即UmlClass必须在UmlOption上级并且从属、处理先后关系显著。

  我的实现是首先将传入的UmlElement分组,然后再将各组分级分类处理:

  

    public SequenceServe(List<UmlInteraction> itas,
                         List<UmlLifeline> objs, List<UmlMessage> msgs) {
        itaList = new Interaction[itas.size()];
        for (UmlInteraction ita : itas) {
            int id = itaNum++;
            itaIdStr2id.put(ita.getId(), id);
            if (itaName2id.containsKey(ita.getName())) {
                itaName2id.put(ita.getName(), -1);
            } else {
                itaName2id.put(ita.getName(), id);
            }
            itaList[id] = new Interaction(ita.getName());
        }
        for (UmlLifeline obj : objs) {
            int itaId = itaIdStr2id.get(obj.getParentId());
            itaList[itaId].addObject(obj);
        }
        for (UmlMessage msg : msgs) {
            int itaId = itaIdStr2id.get(msg.getParentId());
            itaList[itaId].addMsg(msg);
        }
    }

  这个是我其中一个服务类的构造函数,表现了这种从属关系和处理的先后关系。

二、架构设计及OO方法理解演进

“从无到有。”

这个学期我对OO的理解从一开始的没有架构设计甚至连IDEAJava语言特性都没有搞清楚,到后期不仅有了各种继承封装,还有时候会不自主的用到一些设计模式。从开始还是单纯的基于断点的动态调试,到后期的Junit的单元测试。

OO对我来说不仅限于OO,在我这里他更像是软件工程的先导,为我们展现软件工程美丽的世界,培养了我软件工程的先导思维和方法论。

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

测试是保证正确性的重要手段。

我进行的测试有两种,一种基于形式验证,通过Junit进行单元测试实现,这个主要是确定我程序的逻辑功能与实际功能的统一。另一种是基于随机概率,通过数据生成器来实现覆盖性的测试。

我的对拍器主要有datamakerjudge两个部分,前者是对拍的核心,后者是正确性的保障。个人喜欢用java或者python来写datamaker,取决于对拍器只是生成就好还是有一定的结构。

四、课程收获总结

这个学期收获我认为主要是对软件工程有了初步的认识与实践,以及对一些面向对象编程概念的认识与实践。

五、给课程的改进建议

(1)在繁重的课业负担下,停留在口头上的“建议同学们去学”往往等同空话,而且忽视了课程的指导作用,希望老师能在这些领域设置实验或作业。

(2)课上实验目的不明,感觉课上实验只是限制了时间的课下作业。

(3)最后烤漆的任务量较重(虽然我知道课程组已经尽量去降低损失了但是烤漆体验还是很糟糕quq)

猜你喜欢

转载自www.cnblogs.com/Eaglebu/p/11076621.html