第四单元聚焦于UML的建模、信息查询和正确性检查。本单元作业代码的架构即是基于UML三种图的组成层次设计的。
类图建模
类图的组织层次如下:
代码即按照上图构建,对于父元素中的每个子元素,设置HashMap<ID,Element>
进行存储。
需要注意的是,Association
作为Class
的子元素出现时,其对应的父亲Class
可能尚未被建立,故先在顶层设置一个缓冲,将解析到的Association
暂存在顶层,待其他元素全部解析完成,再对Association
进行分配。
协作图建模
协作图组织层次如下:
需要注意的是,协作图中的Attribute
与Class
的Attribute
是相同的类生成的对象,但应当有具体的Represent
所指。故应当设立一个缓冲,将解析到的Attribute
暂存,在其他元素解析完成后判断那些Attribute
属于本协作图。
状态转移图建模
状态转移图层次结构如下:
本作业限定StateMachine
和Region
有且仅有一个,实际可以省略这两个层次的实现。但笔者仍按一般情况完成了冗余设计。同时为了防止无序的元素解析顺序导致程序出错,笔者在顶层增加了大量缓存,在全部元素解析完成后,再按层次搭建状态转移图。
在过去一年半的时间里完成的代码几乎都是面向过程的,总结问题,提炼步骤,实现算法,一切都是自然而然。
第一单元的表达式求导是一个很好的下马威。如果仅仅依靠面向过程编程,程序的复杂程度将无法想象。笔者通过对组成表达式的元素进行抽象,以表达式、项、因子、无符号整数、指数、底数、三角底数等为组成元素,搭建起一个多层次的表达式系统。通过递归下降将输入的字符串表达式解析成上述的各个对象,并将其按照一定规则组织起来。而求导则是各个对象只需负责自己所在局部的求导法则,层层调用,结构清晰。在本单元的coding过程中逐渐领略到面向对象编程的魅力。
第二单元聚焦于多线程电梯系统的设计。为同学们建立了线程安全的概念,如何抽象电梯系统为对象反而是一个小问题。笔者采用了电梯个体具有自主决策的分散调度和核心派遣器的调度相结合的设计架构。
第三单元的JML规格反而更加注重算法的实现,作业代码的架构已经被基本实现,对于面向对象思维的训练体现不是很明显。
第四单元UML是面向对象中的面向对象。通过对三种图模型的建模建立UML概念和加强面向对象的思维。
过去写代码往往认为通过了寥寥几个测试点即自认为大功告成。OO课程的本地调试、中测、强测、互测让笔者深刻地明白,通过多少测试也不能证明程序的完全正确。模块测试、整体黑箱测试、随机点测试、针对性数据、边界数据测试都是必要的。
总结来看,经过半年的OO训练,笔者已经成功达到看什么也是对象的境界,即一切皆对象的自然流派的一员。同时对于成为对象的算法和数据本身具有内聚性的理解进一步加深。
JAVA的编程能力从无到有到强,能够对较复杂的JAVA工程进行理解和开发。
真正体验了为自己的需求而coding,即设计测试数据生成程序、测评机的搭建等,体验极好。
学习并初步掌握了GIT这一广泛使用的版本控制工具的使用。
课上实验可以公布测试结果和数据
讨论区回帖机制有待改进
想不出来了,那就祝愿大家结课快乐吧!