zoukankan      html  css  js  c++  java
  • BUAA_OO_2020_Unit4_Wandy

    BUAA_OO_2020_Unit4_Wandy

    总结本单元三次作业的架构设计

    除实现了MyUmlInteraction之外

    第一单元

    新增了MyElement用来管理类,详情如下:

    private UmlElement umlElement;	//用来存放此Element的UmlElement,似乎是叫适配器模式
    private MyElement parent;		//它的父类,没有则为null
    private HashSet<MyElement> myInterfaces;	//接口
    private HashSet<MyElement> myAttribute;		//属性
    private HashSet<MyElement> myOperation;		//Operation
    
    //operation
    private int inParam;						//in 方向的 Parameter
    private int reParam;						//return 方向的
    private HashSet<MyElement> myParameter;	 	  
    
    private int assoCount;						//与之关联的数量
    private boolean freshAsso;					//标记位,用于缓存法
    private boolean freshImp;					//同上
    private HashSet<MyElement> myAssociated;	 //相关联的MyElement
    private HashSet<UmlElement> ends;			//相关联的UmlElement
    

    由于觉得还没复杂到使用继承,因此没有将其按照ElementType分类,仅采用了一下的构造函数来节省不必要的空间,扩展性不高但实现简单,请勿模仿。

    public MyElement(UmlElement umlElement) {
        this.umlElement = umlElement;
        parent = null;
        myInterfaces = null;
        myAttribute = null;
        myOperation = null;
        myParameter = null;
        myAssociated = null;
        ends = null;
    
        switch (umlElement.getElementType()) {
            case UML_CLASS:
                myInterfaces = new HashSet<MyElement>();
                myOperation = new HashSet<MyElement>();
                myAssociated = new HashSet<MyElement>();
                myAttribute = new HashSet<MyElement>();
                assoCount = 0;
                freshAsso = false;
                freshImp = false;
                ends = new HashSet<UmlElement>();
                break;
            case UML_INTERFACE:
                freshImp = false;
                myInterfaces = new HashSet<MyElement>();
                myAttribute = new HashSet<>();
                checked = false;
                checkAns = false;
                break;
            case UML_OPERATION:
                inParam = -1;
                reParam = -1;
                myParameter = new HashSet<MyElement>();
                break;
            default:
                break;
        }
    }
    

    所有函数几乎都已封装到了MyElement,实现Interaction仅起到调用功能。印象中有点麻烦的函数用了dfs缓存法,比较常规。

    image-20200615150809438

    第二单元

    新增了 MyFlow 和 MyState 两个类与之对应,

    //MyState
    private UmlElement umlElement;			//本体
    private ArrayList<MyState> states;		//本 State_Machine 的状态们
    private HashSet<MyState> nexts;			//后继状态们
    private HashSet<MyState> subSequent;	//后续序列
    private int transNumber;			   //transition的数量
    private boolean freshSub;			   //缓存法的标记位
    //MyFlow
    private UmlElement flowElement;			//本尊
    private ArrayList<MyFlow> lifelines;	//本 Interaction 的生命线们
    private int incomings;				   //incoming 的数量
    private int messageNumber;				//Message 总数
    

    同样,各种函数已被封装好了。

    image-20200615152822094

    image-20200615153132905

    第三次作业

    新增了 MyShrift 类,为了解决 MyUmlGeneralInteraction.java 过大,将其初始化程序重构到 MyShrift 类而且将 check 函数的所有具体细节封装到 MyShrift 的静态方法,缩减为406行。

    image-20200615153721061

    所用算法有 缓存法 和 tarjan。

    四个单元中架构设计及OO方法理解的演进

    四个单元,变态求导,蜜汁多线程,划水JML,摸鱼UML

    ​ 也许是难度逐渐降低,或许是我对OO和java逐渐熟悉,每周OO所需要的时间越来越少(被OS代替)。架构设计也越来越得心应手,从对于一些原则的强行遵循到可以自由的做出取舍,也能独立想出一些已经被设计模式起了名字的架构,更好平衡了时间和空间消耗。

    四个单元中测试理解与实践的演进

    从整体测试到局部功能测试,从 py 到 Junit。说到测试就不得不提每次试验的bug,正好在此总结一下:

    • 第一单元
      • 第三次
        • 互测中有一个,原因为 Factor.toString() 要对括号里的 para 进行判断是否可以当作因子,因为这样可以少输出一个括号,但是我用了字符串自带的 matches() 方法,我以为它是整体匹配的,没想到只是从头匹配。
        • 强测也有bug,是完全将sin()括号里当作 Poly 处理了,忘了表达式因子必须带(),所以sin(1-x)在我这里是合法的。
      • 分析:大意了,还是测试的不够完全,没有测试这种格式错误的,自己搭的评测机又测不出来带不带括号,还是测试不够充分(测自己的热情远不如测别人),写代码时粗心大意了。
    • 第二单元(损失最为惨重的一个单元)
      • 第一次
        • 多线程问题,有个地方没加锁
      • 第二次
        • 多线程问题,导致有时候判断不出来人满
      • 第三次
        • 写了个评测机,但因为测不出来cpu时间,还是TLE了,两个破绽:一个是由于电梯选择策略是static块的初始化,导致第一次用的时候才开始初始化,不在一个线程容易出事。还有一个是在一个人所有策略都行不通时,会标记而且把它放在队尾,让下一个人上,即 remove 后 offer,可惜,我用的是 PriorityBlockingQueue,会自动排序,导致一直轮询
    • 第三单元
      • 第三次
        • dijsktra求最短路径,初始值本应该为较大整数,但一时脑抽 初始化为2000,导致无法出现长于2000的路径,错了三个点。
    • 第四单元
      • 第三次
        • 有多个 initial_state 时,将它们迁出状态的数量算到了一起,因此会导致正确的情况下也会出现008错误。
    • 前两个单元都是搭了评测机的,帮我测了不少bug,但是还是有不少问题,后两个单元到是没怎么测试,但bug更少,可见难度还是逐渐降低了。

    课程收获

    ​ 理解了部分OO的思想,更加熟悉了 Java 这门语言,对多线程运作更加了解了,有一个好的设计可以减少很多需要用锁的地方,不要暴力,Jml,Uml,学了一点相关的算法,感觉手速更快了。

    ​ JML使得每个方法仅关注自己的事情,且由明确的表述使得验证起来更为容易,不容易出现差错,极大提高了编写代码的速度,而且调理清晰出错率低,但是感觉不够简明,光是写JML规格都是一项大工程了,可能这也是其无法流行起来的原因吧。但是确实好处很大,在团队合作中,这种规格,在提升团队协作效率和正确性可以产生巨大的优势。感谢 JML,使得我在 OS 的折磨时期,免受 OO 的侵袭。

    ​ UML作为一种统一的软件建模语言具有广泛的建模能力。UML是在消化、吸收、提炼至今存在的所有软件建模语言的基础上提出的,集百家之所长,它是软件建模语言的集大成者。UML还突破了软件的限制,广泛吸收了其他领域的建模方法,并根据建模的一般原理,结合了软件的特点,因此具有坚实的理论基础和广泛性。UML不仅可以用于软件建模,还可以用于其他领域的建模工作。

    ​ 总而言之,OO的思想对于我的影响还是很大的,相信对于以后的工作学习,都会产生不小的积极影响。

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

    这么完美的课程哪儿来三个建议

    image-20200615153721061

    线上学习oo课程的体会

    OO课程是舍友同学们谈论最多的话题,增强了大家的友谊,是大学生活一笔重要的财富,我的OO老师纪老师年轻,有活力,热情饱满,敬业爱岗,给我留下了深刻的印象。同学们讨论区的参与度也非常高,助教对于实验平台的维护和更新也十分的及时,讨论课的主持也很热情,起到了很大的作用。总而言之,这是一门不可多得的好课,是很多人的很大付出才能构建出的一门课,体验极佳,希望以后还能上到质量这么高的好课。

  • 相关阅读:
    HDU1074 Doing Homework(状压dp)
    HDU1069 Monkey and Banana(dp)
    HDU1024 Max Sum Plus Plus(dp)
    codeforces 1288E. Messenger Simulator(树状数组)
    codeforces 1288D. Minimax Problem(二分)
    geotrellis使用(三十二)大量GeoTiff文件实时发布TMS服务
    geotrellis使用(三十一)使用geotrellis直接将GeoTiff发布为TMS服务
    OpenStack(企业私有云)万里长征第六步——OpenStack网络及虚拟机存储位置
    geotrellis使用(三十)使用geotrellis读取PostGIS空间数据
    Docker Swarm——集群管理
  • 原文地址:https://www.cnblogs.com/Wandy666/p/13160517.html
Copyright © 2011-2022 走看看