软件=数据结构+算法;这是经典的公式,指引着每个软件开发活动;一个事物在系统中以各种类型的数据存在,这个数据需要有机的组合在一起,才能描述整个事物,这个有机的组合就是数据结构,对应在不同的语言中有结构体、类、表等。算法作为一门独立的课程教授,我学习的算法课程中从未讲到状态机,这里我盗用经典公式:软件=数据结构+状态机。算法描述了数据计算的过程,整个过程中,数据不会因为算法而改变。实际的软件系统中,数据计算的过程又是数据再加工的过程,即虽然在任意时间切片上看,事物的数据都是静止的、确定的;但是从事物的生命周期看,数据是不断变化的。
描述数据不断变动的过程是状态机和流程图,两者都非常重要,这里强调的是状态机,只是看待问题的角度不同。流程图的设计过程,关注点是模块或者子系统;而状态机的设计过程,关注点是数据结构;另外,从系统之外看,数据结构和状态机可以基本清楚的描述系统功能。
我所经历的项目中,有很多仅提供了PDM或者ER图,即使字段描述中写了状态枚举值,这是不够的;主要的不足有以下几点:
状态是动态变化的,不同状态取值之间的变迁是有明确的业务含义的;枚举值之间不是可以随意改变的,变动的轨迹、条件缺少必要的描述
不同事物的状态之间是有关联、互动的;没有对应的说明,系统很难有效的划分事务颗粒;
有些状态标明的是量变到质变,仅通过枚举值不好说明;
通过状态机来补充静态数据结构描述的不足;对于一个业务对象而言,其所有改变数据值的业务功能都应该体现在状态机上。当两个业务对象之间的状态有关联时,则通过业务功能(描述或者编号)联系起来,提示开发人员这是要在一个事务中处理的。
一般系统中涉及算法设计几乎没有,大多数选用经典算法即可。所以软件设计中,数据结构+状态机的设计基本上是可以描述系统功能,再辅以实现方面的设计(序列图、类图等)。