一、本单元两次作业的架构设计
1、第一次作业
整体思路:以class为核心,建立MyInterface、MyAttribute、MyOperation、MyAssociation四个类分别储存每个类的接口、属性、方法、关联的信息,并提供相应的获得基础信息的方法。
架构设计:在MyUmlInteraction中,建立多个hashmap储存每个class的name与id的对应关系、class的可见性、继承关系等,并分别建立每个class与上述四个类对应的hashmap。在需要获取某个class的信息时,通过id为key获得class对应的上述某个类,调用类中的方法以获得相关信息。
具体实现:求关于class个数、class的操作相关信息容易实现,因为不用考虑继承关系;找顶级父类、class的属性的相关信息、class的关联的相关信息时,需要通过储存继承信息的hashmap逐层调用class对应的某个类的方法,最后统一处理;获得class实现接口的列表时,由于接口可以多继承,我写了一个递归方法获取某个class实现的所有接口,然后还是根据继承关系的hashmap逐层调用,以获取class实现的所有接口,最后去除重复id的接口。
2、第二次作业
整体思路:沿用第一次作业的思路,多建立MyStateMachine和MyInteraction分别储存状态图和顺序图的相关信息及提供获取信息的方法。
架构设计:在第一次作业的基础上,将除了获取状态图及顺序图信息的方法的其他方法移到单独一个MyUmlSearch中(主要是行数超了),在MyUmlGeneralInteraction类中建立状态机id与状态机类、顺序图id与顺序图类对应关系的hashmap。检查各项有效性的方法在MyUmlSearch中实现。
具体实现:获取参与对象数量即lifeline的数量,信息数量即message的数量,incomingMessage的数量即target为lifelinename的message的数量;状态机的数量和transtion的数量都容易实现,获取状态的后继状态个数我是用递归实现的;检查有效性,002容易实现,008还是使用递归实现,同时还能得到所有class的顶级父类,将信息储存起来,009使用了第一次作业获取class实现的所有接口的方法,如果获得的列表中有id重复的情况,则就出现了重复继承的情况。
二、自己在四个单元中架构设计及OO方法理解的演进
第一单元
第一单元第一次作业是真的面向过程,只有两个类,那时候对于类的建立与使用还是很陌生。第二三次作业就好起来了,对于每种因子、多项式的求导都建立了单独一个类。
第三次作业当周的课好像讲了父类子类以及继承的一些知识,但是写第三次作业时还没有完全理解,最后摆了一个只有两个空方法的父类在那里,相当于没有使用继承来写代码。在以后的单元里才慢慢熟悉继承的使用。
第二单元
第二单元虽然是第一次接触多线程,但整体还是比较顺利的,因为第一次作业时,在课程ppt里给出了一个很相似的生产消费模式的写法,第一次作业直接沿用了ppt里的方法,而且在对这一模式的深入理解后,第二三次作业也就好写很多。
这一单元还有一点让我印象深刻,我在第一次作业时,并没有发现官方jar包提供的类以及方法,导致我还在手动拆分输入请求。直到第二次作业在跟室友交流时才发现了可以直接调用官方jar包中的方法,而且官方jar包的使用在以后的每一次作业中都用到了。
第三单元
第三单元感觉主要是算法单元了。给出的JML规格不是难点,难点在于算法的实现。后两次作业我都是用floyd算法实现的,印象最深刻的是最后一次作业在讨论区学到了大佬的巧妙处理方法。同时这一单元还让我进一步熟练了hashmap的使用。
第四单元
第四单元的架构在上面也分析过了,这一单元在理论课以及讨论区的学习中,学到了UML中各种元素的组成及每部分的意义。UML对于以后的代码设计及理解还是用处很大的。这一单元我还写了很多递归方法,遥想一年前,那时我对递归的的理解还是处于很低的层次,想要独立写出递归的函数更是难上加难,而现在这对我来说已经容易很多了。
三、自己在四个单元中测试理解与实践的演进
在大一学C语言时,那时自己写的代码很少充分测试,基本都是测试完样例就交,然后面向评测机编程。而这学期的OO,中弱测的一些较难过的点都不公开数据,而强测更是只有一次机会,这时本地测试就尤为重要了。而且几次强测结果出现的我没有预想到的BUG也让我更加重视对代码的自我测试。
这学期的互测,除了第一单元代码量较小,可以阅读代码寻找BUG外,其他单元的作业我基本都是构造易错数据来对屋内其他人的代码进行测试。另外在研讨课上,我也学到了不用python写对拍器,也可以用JAVA写出自动生成数据以及自动测试的方法。
四、自己的课程收获
最基本的收获就是JAVA语言和面向对象的思想了。课程虽然不主要讲解JAVA语言,但是通过自学已经掌握了基本的JAVA语法。对于面向对象的思想,从寒假pre和第一次作业时的懵懂,到现在也逐渐熟练。
还有就是对于本地测试的重视程度的提升。对于自己写的代码,都要进行充分的测试以提高正确性。
五、立足于自己的体会给课程提三个具体改进建议
1、实验课还是希望不要安排在每周理论课当天的下午,虽然实验课不是考试,但是对于刚学的知识没有先实践过,上机的时候还是有些吃力。
2、我们这学期有JML单元和UML单元,我觉得也可以给JUNIT或者其他代码测试的工具也开一个单元。
3、稍微提升一下中测点的难度。