OO第四单元总结反思&&学期总结
-
本单元作业的架构设计
本单元中的架构设计缺少了“面向对象”的思想,并不是从搭建起一个类图、时序图、状态图出发,而是针对每一条需要要实现的接口,根据指令的要求去设计实现该指令相关的成员的存储容器,和相关的实现方法。最终,导致我的MyImplementation非常的拥挤并且没有合适的封装方式。QAQ
相关存储示例:
类图 private HashMap<String, ArrayList<UmlElement>> classs = new HashMap<>(); //Id -> 类 private HashMap<String, ArrayList<UmlElement>> interface = new HashMap<>(); //Id -> 元素 private HashMap<String, ArrayList<UmlElement>> attribution = new HashMap<>(); //parentID -> 属性 private HashMap<String, ArrayList<String>> interfaceRealization = new HashMap<>(); //source-target private HashMap<String, ArrayList<String>> generalization = new HashMap<>(); // 子 -> 父 private HashMap<String, HashMap<NameableType,Integer>> operaPara = new HashMap<>();//比较 private HashMap<String, ArrayList<UmlElement>> isTrue = new HashMap<>();//判断对错 private HashMap<String, String> interfaceName = new HashMap<>(); //name - id
状态图 private HashMap<String, String> region = new HashMap<>(); // machineid - regionid private HashMap<String, ArrayList<UmlElement>> finalstate = new HashMap<>(); private HashMap<String, ArrayList<UmlElement>> initialstate = new HashMap<>(); private HashMap<String, HashMap<String, HashMap<String, ArrayList<UmlElement>>>> transiztion = new HashMap<>(); // regionid - (sorce - (target - tranzition)) private HashMap<String, ArrayList<String>> state = new HashMap<>(); private HashMap<String, ArrayList<UmlElement>> state = new HashMap<>(); private HashMap<String, ArrayList<String>> event = new HashMap<>(); private HashMap<String, ArrayList<UmlElement>> interaction = new HashMap<>();
顺序图 private HashMap<String, UmlElement> lifeline = new HashMap<>(); // 储存所有的顺序图参与对象 private HashMap<String, ArrayList<UmlElement>> cloa = new HashMap<>(); private HashMap<String, ArrayList<String>> message = new HashMap<>(); // target - source private HashMap<String, ArrayList<String>> send = new HashMap<>(); // source - target private HashMap<String, ArrayList<String>> create = new HashMap<>(); private ArrayList<String> endpoint = new ArrayList<>(); private HashMap<String, String> collaboration = new HashMap<>(); // InteractionId - collaborationId private HashMap<String, String> att = new HashMap<>(); // attributeId - parentId private HashSet<String> dele = new HashSet<>();
-
架构设计思维及OO方法理解的演进
-
第一单元的内容是表达式的解析和化简,主要采用递归下降的方法,是同OO的初接触。对于OO方法的理解主要是将一个表达式当作一个对象,将其值作为属性,体会封装属性改变属性而不是去算值。此外,这一单元中除了递归下降这一个分析结构,对于容器进行了初步且充分的了解。各个容器的特性以及对每个对象属性的存储容器的选择,也是这一单元充分体会到的。
-
第二单元就是电梯调度,主要是训练多线程。在这一单元中,需要充分考虑线程交互中关于线程安全的交互。对于OO方法的理解主要是关于工厂模式等设计模式的理解应用。线程间交互主要采用生产者消费者模式,还要注意对“锁”的使用,避免死锁和线程不安全。架构设计就是电梯、调度器这两个对象,及属性进行操作。
-
第三、四单元的主要内容是对JML语言和UML的相关理解,对于面向对象的一些规范性工具的理解和记忆更加深入,对于“面向对象“的思想的理解可能体现在规定的指令的实现方式中,第四单元中,如果采用面向对象的方式,以图为对象,分封包装成相关的类,可以使得代码美观的多。
-
-
测试理解与实践的演进
-
第一单元是多项式的运算与化简,数据需要具有一定的针对性、代表性,测试到自己代码的功能是否合理即可。
-
第二单元是多线程,多线程的bug主要在于线程是否安全,测试数据针对调度算法检验正确性和性能,但是对于线程安全,需要多次尝试才能发现bug,有时线程不安全的bug同一个代码可能复现的概率很小,所以需要课下多测试几组随机数据。
-
第三单元和第四单元是以JML和UML为题目背景展开的题目,由于是作业是指定指令来实现,这两个单元引入了单元测试,逐个单元的测试可以使得满足本次作业的要求。同时对每条指令的随机数据也可以测试此次作业的正确性。
-
-
课程收获
-
每次作业的代码的训练量让我熟练的掌握了java的基础语法熟悉了java提供的容器以及各个容器的特性。
-
面向对象这一思想和相关设计模式。面向对象的思想和设计模式是相对比较抽象的知识,是在写代码中逐步训练理解到的,这些较为规范的思想能够帮助我们在日后的编程中事半功倍。
-
养成了一个比较好的代码风格。不得不说checkstyle使我养成了写代码注意空格和缩进的好习惯,使代码更美观。
-
接触到了不同于以往的编程方式——多线程。多线程可以大幅提高代码的性能,我们对于多线程最重要的部分——线程安全在第二单元中得到了充分训练。
-
-
改进建议
-
希望能够在每次作业测试完全结束后能够给一份推荐代码。
个人感觉看别人写的代码是很重要且有效的学习途径,尤其是对细节的处理,很多同学都会有值得借鉴之处,仅仅是写博客,可能大家只是按照要求把内容要求写了,但是,感觉不如阅读一份优质代码学到的多。 -
希望能开放一个不算分的pre是关于自动化测试的。
关于评测机,迟迟不肯学,懒肯定是很重要的因素,但是,在pre的时候开放一个关于自动化测试的pre,大家的学习积极性估计会大幅增加。 -
个人感觉第四单元的内容有点像是为了面向对象而硬凹出来的题QAQ。
确实是对类图等相关的知识加深了理解,但是,总感觉最难的部分不是对类图的理解,而是一些算法或者一些小细节,感觉面向对象这门课或许还有其他的比第四单元更加神奇的内容可以以这些手册的知识作为背景进行拓展。
-