一、第四单元作业总结

第四单元有两次作业,第十三次作业是实现一个UML类图解析器,可以通过输入一些查询指令来查询一些类图的信息。程序的主干部分已经提供,我们的任务就是实现给出的接口,过程并不繁琐。第十四次作业在十三次作业的基础上增加了对UML状态图和UML顺序图的解析以及UML模型合法性判断。

1、 第十三次作业

架构思路:

对于需要存储相关信息和参数的UML对象各开一个专门的类来实现,例如UMLClass,UMLInterface,UMLOperation。同时在第一步识别UMLElement时率先存入容器,其他Element在之后进行分类存储。

除了少数功能可以直接查询得到之外,其他的函数大多需要整合计算的过程,因此尽量在查询开始之前进行处理并且把信息保存,避免多次查询多次计算。

类图:

oo第四单元及课程总结-LMLPHP

oo第四单元及课程总结-LMLPHP

图中可以看出构造方法的复杂度最高,原因是大部分的初始操作都在构造方法中,完成,导致在其中有大量的遍历过程和对容器的操作过程。此外还有一些需要遍历图找到父类的操作复杂度也较高。

Bug分析:

此次强测因为未考虑接口可以继承多个接口的情况,强测情况较惨,修复过程不复杂。

2、 第十四次作业

架构分析:

类图部分与上次作业完全相同,不再赘述。

状态图部分,新增了stateMachine类来存储状态图的相关信息和数据。前两个函数较为直观,可以直接查询得到。第三个指令查找可达的状态需要层次查找,我使用了图遍历方法,得到状态的可达矩阵并存储。

顺序图部分,新增了类来存储顺序图的相关信息和数据。三个指令的较为简单直观。

规则检查部分,R001通过简单的比较可以实现。R002我使用弗洛伊德算法得到类和接口的可达矩阵,能够自己到达自己的就是成环。R003可以通过直接遍历所有的类和接口并且比较所有的继承的接口来判断是否有重复继承,但是此方法复杂度较高。

若是把所有的方法和操作都放在一个类里面会造成类的冗余繁杂,因此在设计时把大部分初始操作,存储操作等放在父类中,子类中放置实现的接口函数。

类图:

oo第四单元及课程总结-LMLPHP

oo第四单元及课程总结-LMLPHP

可以看出复杂度主要集中在了父类中。

Bug分析:

强测中没有出现错误。

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

第一单元:在写第一单元的作业是并没有对面向对象方法的概念,程序还是基本按照C程序的写法面向过程,第一次第二次作业因为格式固定要求较低直接莽过去,但是在第三次作业几乎全部推翻重构,花费了许多的时间和精力,但是写法依然不太美观,仍旧是针对作业要求而强行使用类来替代结构体实现了函数。这三次的作业可扩展性都非常差,但是当时我还是没有意识到oo方法的重要性,在互测阶段对比其他同学的清晰优秀的代码感受到了明显的差距。

第二单元:第二单元是电梯系列的作业,要求我们对多线程有了解,编写逻辑和调试难度还有架构方式与第一单元有很大的差别,不能再次通过强行面对过程编写。我更加注重代码的架构,思考如何降低类与类之间的耦合性,以达到方便调试和扩展的目的。我在作业中独立出了乘客,调度器,电梯一个个实体,各司其职,尝到了oo方法的方便之处。这一单元还加深了我对进程同步互斥的理解,对加锁的条件和要求也有了使用经验。

第三单元:第三单元是JML代码规格系列的作业。在这个单元中的作业我们只要考虑根据需求完成每一个函数,但是第三单元的作业有时间限制,所以需要考虑算法结构以免运行超时,对架构设计的需求更高了。经过前两个单元的训练,我每次作业会综合考虑所有接口函数提取出共同需求再进行设计,与之前相比有了长足的进步。

第四单元:第四单元还是对接口函数的实现,与之前的作业相比第四单元作业难度其实有所降低,相对而言完成的比较轻松。但是因为放松了对性能的要求以及临近考试,设计上其实并没有尽力追求,只是写了方便直观的算法以实现作业。但是能够明显感受到自己对于oo方法的适应。

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

第一单元时测试的时候主要想的是两种,一是能否识别出格式错误,二是能否正确求导。我主要思考边界数据和复杂数据,但是总是有所疏漏,自己的思考不够全面,出现的bug总是一些细小的条件未考虑,基本一两行代码就可以补充完整。

第二单元多线程作业,测试难度大大增加,因为线程访问时间和先后的不确定性同样的样例测试结果也可能不同,对bug的定位难度大大增加。需要的是对代码逻辑的仔细思考以找到其中的漏洞,而不是构造各种样例测试。

第三单元和第四单元的因为有整体上的架构需求,一旦出现bug很有可能就需要整体架构的调整,因此bug的修复困难很多。这两单元的测试使用了对拍器,通过与同学结果的对比可以很快地找到bug并且定位。

四、课程收获

1、 对Java语言的熟悉和使用。

2、 对多线程程序设计的经验。

3、 代码风格规范。

4、 面对对象的程序设计思想。

5、 诸多实用工具的使用

五、改进建议

1、 上午讲课的内容下午上机直接开始考,让人难以适应。

2、 上课时能够多讲点作业架构设计的方向。

3、 希望能有课上讲讲优秀的架构设计以供学习。

05-19 05:43