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

原创 2004年07月07日 14:43:00

“面向状态软件开发”学习笔记
一、面向对象程序设计思想
在计算机程序设计过程中,程序员使用面对的可能有许多的数据以及对这些数据进行处理的程序过程,这些过程和数据之间的关系错综复杂,程序员要处理这些复杂的关系往往会消耗很大的精力,面向对象的设计思想就是将关系比较密切的数据和处理过程有效地组织在一起,形成一个相对独立的个体——对象,在对象内部采用数据抽象和信息隐藏的技术,程序员所作的就是生成对象和处理对象之间的联系。
尽管面向对象技术对事物的描述已经非常接近人的思维和认识过程,但面向对象只是反映了一个静态过程。同样的一个处理过程可能会在不同的运行状态被触发或者调用。例
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)
读者可以尝试使用结构化程序设计方法和面向对象的设计方法将上面这一条执行语句的整个流程画出来,跟上面这一段伪代码的描述比较一下,似乎这个很简单的逻辑用其他设计方法来描述都会变得复杂起来。其根本原因是,编写上面的这段伪代码,你根本不需要思考,因为这就是“现实”,这就是你的思维。是你的思维,当然不用费力的思考。
尽管使用面向状态的方法在建立对象的时候似乎比面向对象的方法要冗长得多,但在使用的时候却非常方便,简洁得多、直观得多了。而且,这个对象已经包含了目前的所有可能出现的不同使用环境和条件制约关系。从逻辑上也更加符合人类的思维,更加简单明了,修改和维护都相对简单得多。

南京大学<软件测试>笔记

软件测试目的 通过在编写代码的整个过程中添加测试的检测流程,来减少设计失误、笔误、以及在程序中表现出来的失误。...
  • jiaoyang623
  • jiaoyang623
  • 2015年07月13日 12:13
  • 2092

周志华《机器学习》笔记:第3章 线性模型

本章概括 从最简单但也是最基础的线性模型开始研究。线性模型虽然简单,但却是基础。先研究线性、单属性的线性回归问题,在此基础上研究非线性、多属性的回归和分类问题。 第3章 线性模型 单属性...
  • yzqzoom
  • yzqzoom
  • 2016年07月10日 12:11
  • 3111

软件开发过程学习笔记(一)之软件开发流程

概述:软件开发流程(Software development process)即软件设计思路和方法的一般过程,包括设计软件的功能和实现的算法和方法、软件的总体结构设计和模块设计、编程和调试、程序联调和...
  • u010963246
  • u010963246
  • 2015年07月08日 12:43
  • 2379

软件开发学习笔记

  • 2013年12月15日 22:28
  • 3.74MB
  • 下载

Java学习笔记(十八)软件开发、Ant及重构

软件开发流程: 1、可行性分析 2、需求分析->开发测试 3、概要设计->分隔模块,定义框架等 4、详细设计->类设计、接口设计 5、编码 6、测试 7、部署 8、维护 单元测试...
  • EricFantastic
  • EricFantastic
  • 2015年11月12日 11:11
  • 741

《敏捷软件开发》学习笔记:敏捷设计原则

遵循敏捷实践去发现问题;应用设计原则去诊断问题;应用适当的设计模式去解决问题。 软件开发这三个方面件的相互作用就是设计。 ...
  • Idleman
  • Idleman
  • 2011年03月05日 22:02
  • 472

敏捷软件开发学习笔记<一>

敏捷设计:敏捷设计是一个过程,不是一个事件,它是一个持续的应用原则、模式以及实践来改进软件的结构和可读性的过程,它致力于保持系统设计在任何实践都尽可能得简单,干净,及富有表现力; 也可以理解为:在敏...
  • world6
  • world6
  • 2017年06月08日 17:04
  • 216

UWP: Win10 软件开发之学习笔记(2017.5.11更新)

现代操作系统应用开发以下是我个人的学习笔记,欢迎大家提出疑问,我们一起探讨。github1.XAML XAML只是特定格式的XML,它遵循所有XML的规则。XML的使用者就是将我们的代码变成windo...
  • linwh8
  • linwh8
  • 2017年03月22日 20:02
  • 1158

软件开发过程学习笔记(五)之测试方案模板

1 概述 1.1 目的 本项目的软件系统测试目的是验证xx是否满足软件需求说明书的全部内容。 本文档通过详细说明测试范围、内容、方案和实现环境等,为后续的软件系统测试提供指导。并通过提供软件需求说明...
  • u010963246
  • u010963246
  • 2015年07月08日 14:48
  • 749

快速软件开发 学习笔记 之六

快速软件开发 学习笔记 之六 第9章 Customer-oriented Development(面向客户软件开发) Customer(“客户”)这个词,是指花钱购买拟开发软件产品的人或负...
  • ilvu999
  • ilvu999
  • 2012年11月25日 19:12
  • 420
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:“面向状态软件开发”学习笔记一(整理LeWolf的文章)
举报原因:
原因补充:

(最多只允许输入30个字)