“面向状态软件开发”学习笔记一(整理LeWolf的文章)

来源:互联网 发布:修仙狂徒软件 编辑:程序博客网 时间:2024/05/08 15:40

“面向状态软件开发”学习笔记
一、面向对象程序设计思想
在计算机程序设计过程中,程序员使用面对的可能有许多的数据以及对这些数据进行处理的程序过程,这些过程和数据之间的关系错综复杂,程序员要处理这些复杂的关系往往会消耗很大的精力,面向对象的设计思想就是将关系比较密切的数据和处理过程有效地组织在一起,形成一个相对独立的个体——对象,在对象内部采用数据抽象和信息隐藏的技术,程序员所作的就是生成对象和处理对象之间的联系。
尽管面向对象技术对事物的描述已经非常接近人的思维和认识过程,但面向对象只是反映了一个静态过程。同样的一个处理过程可能会在不同的运行状态被触发或者调用。例
Class Car
Begin
Member:
Wheel //车轮
Steering wheel //方向盘
Engine //引擎
Door //车门
Method:
StartCar //点火
Run //开车
Accelerate //加速
Decelerate //减速
CloseDoor //关门
OpenDoor //开门
End
我们假设现在要求将车速变为60Km/h,可能会出现的初始状态是:
一、车速现在为90Km/h;
二、车速现在为30Km/h;
三、车停止,发动机熄火;
四、车停止,发动机熄火,车门未关;等等。
那么,针对这四种情况,我们所要执行的操作是不一样的。
第一种情况是减速;实现过程为:
Procedure Fn1
Begin
Decelerate //减速
End
第二种情况是加速;
Procedure Fn2
Begin
Accelerate //加速
End
第三种情况首先是点火,然后是加速至60Km/h;
Procedure Fn3
Begin
StartCar //点火
Run //启动
Accelerate //加速
End
而第四种情况是先关车门,然后点火,最后加速至60Km/h;
Procedure Fn4
Begin
CloseDoor //关门
StartCar //点火
Run //启动
Accelerate //加速
End
在这四种情况里,第一、第二种都是改变车速,一个为正方向的,一个为反方向,但都属于同一种操作;第三种情况,多了一个执行过程——点火,也同样包含一个改变车速的操作;第四种情况,多了关车门、点火两个过程,也包含了改变车速的操作。它们的共同点是都包含车速改变的过程,因为这个操作是车速状态改变的核心操作过程。进一步分析归纳可以发现这四种情况也包含了一个共同之处,它们必须有两个共同的约束条件:
一.车门必须是关着的
二.发动机必须处于点火状态
因为第一、第二种情况隐含的满足这两个条件,而第三种情况隐含的满足第二种条件,第四种中情况两个条件都不满足。根据这一特点,我们可以设想建立以下几个机制:
 将汽车的运行抽象出三个独立的运行状态:车速状态、车门状态、发动机状态。
每个状态都和一个操作过程和其相对应。
每个状态对应的操作过程都要负责其核心操作。
 每个状态对应的操作过程必须负责其约束条件的检测和设置。
这样问题将会大大简化,程序员不必考虑在不同的条件下是如何经过不同的过程而达到目的的,只需要关心对象中各个状态之间的约束关系,以及每个状态改变时的核心操作的实现过程就行。这就是面向状态的编程思想,它可以化解数据与数据之间的相关性,将一些复杂的逻辑关系转化成为较为简单的逻辑关系,使程序的设计、修改和维护都相对简单得多。用面向状态的思想描述上面的例子可以表述如下:
Class Car
Begin
Member:
Wheel //车轮
Steeringwheel //方向盘
Engine //引擎
Door //车门
… …
Method:
StartCar //点火
ShutDown //熄火
Run //开车
Accelerate //加速
Decelerate //减速
CloseDoor //关门
OpenDoor //开门
… …
SetSpeed //对应车速状态
SetDoor //对应车门状态
SetEngine //对应发动机状态
… …
State:
Speed //车速状态
IsDoorOpen //车门状态
IsTurnOn //发动机状态
… …
End
Procedure SetSpeed(X)
Begin
IsDoorOpen = False //约束条件,实际/执行SetDoor(False)
IsTurnOn = True //约束条件,实际执行SetEngine(True)
If  Speed > X
Decelerate
Else If Speed = 0
Run
Accelerate
Else
Accelerate
End If
End

Procedure SetDoor(Bool)
Begin
If IsDoorOpen != Bool
If …… //关车门的约束条件,这里没有
……
End If
If IsDoorOpen = True
CloseDoor
Else
OpenDoor
End If
End If
End

Procedure SetEngine(Bool)
Begin
If IsTurnOn != Bool
If IsTurnOn = True
ShutDown
Else
StartCar
End If
End If
End
要求将车速变为60Km/h,我们仅仅需要做的是
Speed = 60 //执行SetSpeed(60)
读者可以尝试使用结构化程序设计方法和面向对象的设计方法将上面这一条执行语句的整个流程画出来,跟上面这一段伪代码的描述比较一下,似乎这个很简单的逻辑用其他设计方法来描述都会变得复杂起来。其根本原因是,编写上面的这段伪代码,你根本不需要思考,因为这就是“现实”,这就是你的思维。是你的思维,当然不用费力的思考。
尽管使用面向状态的方法在建立对象的时候似乎比面向对象的方法要冗长得多,但在使用的时候却非常方便,简洁得多、直观得多了。而且,这个对象已经包含了目前的所有可能出现的不同使用环境和条件制约关系。从逻辑上也更加符合人类的思维,更加简单明了,修改和维护都相对简单得多。