一、第四单元两次作业的架构设计
(一)UML第一次作业
任务:实现一个UML类图解析器。
类图:
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顺序图和UML状态图的解析,并能够支持几个基本规则的验证。
类图:
ClassModelInteraction:和第一次作业相同,用于类图的解析;
CollaborationInteraction:用于顺序图的解析;
StateChartInteraction:用于状态图的解析;
StandardPreCheck:用于规则检查;
MyUmlGeneralInteraction:在该类中实例化上述四个类,相关方法调用相应类中的相应方法;
代码整体架构和上次作业基本相同,也是把相关信息存在hashmap中。
需要注意的问题:
1.对hashmap调用get方法之前要确保contains(key)为true,否则可能抛出exception。
2.UmlElement的name可能为null,需要特别处理,不然也会exception。
二、架构设计及OO方法理解的演进
第一单元:第一次接触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
学习了java的基本语法,了解了其作为一种面向对象的程序设计语言的优势。
- 接触并深入理解了OO思想
学习了OO思想,明白了其与之前学习的面向过程之间的区别,对工程设计的架构和模式有了很深的理解。
- 对工程测试有了一定的了解
接触了一些新的测试方法和测试工具。
- 对多线程、JML、UML有了一定的了解
学习了多线程、编写了多线程程序、知道了如何去保证线程安全。
学习了JML,能根据规格读懂代码、编写代码,根据代码编写规格。
学习了UML的三种图:类图、顺序图、状态图,以及三者之间的联系和统一性,掌握了各模型元素之间的层次关系。
五、具体改进建议
- 希望调整一下上课和上机的相对时间,以便于我们学生能在上机之前有足够时间回顾所学知识。
- 希望能在课前下发PPT,这样在课堂上的听课效率相对会高一些。
- 希望课上老师的讲解更加详细具体一些,例如一些设计模式、原则、思想,可以举一些例子来详细说明下,不要那么抽象。