OO第四单元总结
本单元两次作业的架构设计
这一单元有两次作业,第一次是UML类图的架构设计,第二次是对于UML顺序图与状态图的架构设计。因为时间关系,大四毕业匆忙,我非常遗憾没有很好地完成第二次作业,在此我先表达歉意。但是架构设计对于这两次作业而言可谓是举足轻重,对于UML类图而言,我的设计是读取输入然后用一个由HashMap组成的ArrayList去存储这些UML类图的键值对,每一个HashMap对应一个节点,有唯一的Id。对于每一个函数,都遍历这个ArrayList去查找到响应的HashMap,然后执行相关的操作。
对于这一单元作业的架构设计,我将采用以下方法进行分析:
Complexity Metrics(复杂度分析)
这部分我们需要使用的主要是方法和类的复杂度分析。
方法的复杂度分析主要基于循环复杂度的计算。循环复杂度是一种表示程序复杂度的软件度量,由程序流程图中的“基础路径”数量得来。
- ev(G):即Essentail Complexity,用来表示一个方法的结构化程度,范围在[1,v(G)]之间,值越大则程序的结构越“病态”,其计算过程和图的“缩点”有关。
- iv(G):即Design Complexity,用来表示一个方法和他所调用的其他方法的紧密程度,范围也在[1,v(G)]之间,值越大联系越紧密。
- v(G):即循环复杂度,可以理解为穷尽程序流程每一条路径所需要的试验次数。
对于类,有OCavg和WMC两个项目。
- OCavg:类的方法的平均循环复杂度。
- WNC:类的方法的总循环复杂度。
Dependency Metrics(依赖度分析)
- Cyclic:指和类直接或间接相互依赖的类的数量。这样的相互依赖可能导致代码难以理解和测试。
- Dcy和Dcy:计算了该类直接依赖的类的数量,带表示包括了间接依赖的类。
- Dpt和Dpt:计算了直接依赖该类的类的数量,带表示包括了间接依赖的类。
整体的架构如下图所示:
度量表如下所示:
在四个单元中架构设计及OO方法理解的演进
这四个单元的OO作业各有其侧重点,却层层递进。
- 第一个单元处于熟悉java语言的阶段, 为了让我们理解面向对象的思想, 更多的是通过封装的方式实现高内聚低耦合, 用层次化结构设计降低代码错误的方式。
- 到了第二单元, 有一些设计模式的东西在里面, 通过对生产者消费者模型的理解, 实现了多线程电梯, 理解了多线程结构的设计原则。
- 第三单元, 我体会到的是一个软件的由最初逐步迭代, 最终变的很复杂的过程。 这需要把每一个功能抽象出来,实现软件的可扩展性。
- 最后一个单元UML,是对前面所有单元的综合, 虽然只有两次, 但是前面所用的技能都有体现。
在四个单元中测试理解与实践的演进
在进行作业完成的同时,需要同时对代码进行测试,我由最初的手动调试,想边界测试点,到最后的自主测试处理,产生了很大的进步。主要是从自动生成实例,进行输入测试与比对,到人为生成复杂实例,针对特别功能进行针对性测试,再到最后的完全自动化,使用Junit进行测试,自动检测出相应错误。
自己的课程收获
我感觉自己从对面向对象思想和Java语言什么都不懂的小白,变成了理解Java,熟悉面向对象思想,多线程编程和软件架构设计的编程者。这其中,老师和助教们对我起到了莫大的帮助。相对于助教和老师们的工作,我们做的真的很少了。我通过这门课,对java语言掌握更熟练,对多线程掌握更熟练,学会了软件测试的方法,对设计模式有了一定的了解,对UML的类图,状态图和顺序图有了更深的理解。感谢这门课给我带来的收获!
给课程提三个具体改进建议
先凑齐三点小建议吧:
- 希望作业的发布能够尽可能的再准时一些吧。
- 希望指导书能够尽可能的完善,减小之后修改指导书的次数。
- 希望能够更多地增加讨论环节,增加互动,让我们能够得到更多的历练。
最后还是要感谢课程组,改写OO这门课,虽然我没有完美地完成所有作业,但是我还是学到了很多,希望这门课越开越好!