任务:实现一个UML类图解析器。java
类图:算法
SortUmlElement类:对传入的UMLElement按type提取相关信息,并存储在hashmap中;设计模式
MyUmlInteraction类:实现接口的方法,主要经过在hashmap之间寻找相关信息;安全
例如:数据结构
/*
implemention:key存UmlClass的id,value存该类实现的接口的id
interGeneralize:key存UmlInterface的id,value存该接口继承的接口的id
*/
private Map<String, ArrayList<String>> implemention;
private Map<String, ArrayList<String>> interGeneralize;
对于指令“类实现的所有接口”,在类的继承链上进行dfs搜索便可。多线程
任务:在第一次做业基础上,扩展解析器,使得可以支持对UML顺序图和UML状态图的解析,并可以支持几个基本规则的验证。架构
类图:并发
ClassModelInteraction:和第一次做业相同,用于类图的解析;工具
CollaborationInteraction:用于顺序图的解析;性能
StateChartInteraction:用于状态图的解析;
StandardPreCheck:用于规则检查;
MyUmlGeneralInteraction:在该类中实例化上述四个类,相关方法调用相应类中的相应方法;
代码总体架构和上次做业基本相同,也是把相关信息存在hashmap中。
须要注意的问题:
1.对hashmap调用get方法以前要确保contains(key)为true,不然可能抛出exception。
2.UmlElement的name可能为null,须要特别处理,否则也会exception。
第一单元:第一次接触java,也是第一次接触OO思想,致使写出的代码解耦程度不高,特别是这单元的第三次做业,因为多项式求导中涉及到了嵌套求导,基本就靠递归莽出来的,几乎没有体现OO思想,因此代码的架构也不合理,可拓展性可维护性不强,三次做业每次都得重构。因为没有构造较好的抽象层次,后两次的做业中优化的部分也没有写好,因此也是没有拿到多少性能分。
第二单元:这单元是多线程,入门比较难,特别是对并发安全的控制很复杂,也很容易出错。三次做业调度算法不一样,可是总体架构基本没有变化,都采用了单例模式,即实例化一个调度器对象,使其做为临界资源,同时与输入处理线程和电梯运行线程关联。在大的架构上基本符合面向对象的思想,作到了各个对象只管本身的事情,可是在一些小的细节上还能够进行解耦分离。这个单元学到了SOLID设计原则,能够用这个原则来检查本身代码是否符合OO思想。
第三单元:这单元是JML规格的学习。每次做业都有CPU时间的限制,为了适应性能,我采用合适的数据结构,并对数据抽象和分层:在图数据结构和图模型之间创建层次;在数据之间创建映射关系,而不仅是简单的关联关系;逐层构造,顶层实现规定的接口和相应的规格。代码的性能和结构设计有了很紧密的联系,若是没有一个好的架构,那么性能也将很低。
第四单元:这单元是UML的学习。在两次做业中我采用的是在一个类中hashmap硬莽,数据层次没有分好。若是能对数据模型进一步抽象处理,进一步层次化管理,应该会有很大的架构设计方面的改善。
第一单元:一开始不知道有什么有效的测试方法,靠本身手动构造一些边缘数据,而后手动debug,后来经过讨论区的学习知道了能够写对拍器程序来自动生成随机数据并自动测试,这给我多项式求导的第三次做业中的互测带来了很大的便利。
第二单元:多线程的测试真的很让人头疼,输出不肯定,并且调试debug也很不方便,并且还有不少隐藏、难复现的bug。尤为是多部电梯那次,若是没有对拍器,即便有测试数据可是仅靠肉眼观察输出的正确性是很困难的(各线程的输出相互交错),此次做业没有充分测试致使强测翻车了,这让我意识到测试是代码工程中的一个极其重要的环节。
第三单元:学到了不少测试方法,经过JUnit对每一个方法进行正确性测试,尝试了使用JMLUnitNG来自动生成测试数据并自动测试。但在这单元第三次做业中没有测试边缘数据(数据比较大的Integer),致使强测由于一个equals和“==”的区别翻车。
第四单元:自动生成一个UML图太困难了,因此我选择在starUML中画图,利用课程组下发的官方jar包来解析,从而生成测试数据。对结果的检验很简单,对照我画的UML图检查就好了。可是UML涉及到不少细节的知识点,因此须要大量的测试才能覆盖到,我由于没有考虑到顺序图中Message的target不是lifeLine这种状况而在强测中挂了一个点。
学习了java的基本语法,了解了其做为一种面向对象的程序设计语言的优点。
学习了OO思想,明白了其与以前学习的面向过程之间的区别,对工程设计的架构和模式有了很深的理解。
接触了一些新的测试方法和测试工具。
学习了多线程、编写了多线程程序、知道了如何去保证线程安全。
学习了JML,能根据规格读懂代码、编写代码,根据代码编写规格。
学习了UML的三种图:类图、顺序图、状态图,以及三者之间的联系和统一性,掌握了各模型元素之间的层次关系。