首页 理论 架构 工程 文档 白皮书 著作 研究 案例 下载 博客 关于 开始使用 →

第32章 Method

第32章 Method

本章大纲

  1. Method 定义
  2. 方法名称
  3. 方法参数
  4. 方法执行
  5. 方法返回值
  6. 方法状态
  7. 方法权限
  8. Object Method
  9. Method 示例

32.1 Method 定义

在 SAI Framework 中,Method(方法)是 Object 所具有的可执行操作定义,用于描述对象能够执行什么操作、需要什么输入、如何执行以及执行后返回什么结果。

前面已经建立:

Object
├── ID
├── Type
├── Property
├── Method
├── State
└── Relation

其中:

Property → 描述 Object 有什么特征
Method   → 描述 Object 能做什么
State    → 描述 Object 当前处于什么状态

例如一个 Fan Object:

Fan
├── Property
│   ├── speed = 1200
│   └── power = 50
│
├── State
│   └── on
│
└── Method
    ├── turnOn()
    ├── turnOff()
    └── setSpeed()

因此:

Object
   ├── Property → 有什么
   └── Method   → 能做什么

Method 不是 Behavior

这一点非常重要。

Method
→ Object 具备的操作能力

Behavior
→ Individual 实际采取的行为

例如:

Fan
Method:
    turnOn()

表示:

风扇具有 turnOn() 这个操作。

但这并不表示 SAI 此刻一定要执行它。

完整过程可能是:

Cognition
   ↓
Reasoning
   ↓
Decision
   ↓
Behavior
   ↓
Method
   ↓
Fan.turnOn()

所以:

Method = 可以执行什么
Behavior = 要执行什么行为

32.2 方法名称

Method Name(方法名称)用于唯一描述 Object 中的某个操作。

例如:

turnOn
turnOff
setSpeed
open
close
move
stop
lock
unlock

例如:

Fan
├── turnOn
├── turnOff
└── setSpeed

方法名称应该能够明确表达操作。


方法名称与 Object Type

不同 Object 可以具有不同 Method。

例如:

Fan
├── turnOn
├── turnOff
└── setSpeed

Door:

Door
├── open
├── close
└── lock

Robot:

Robot
├── move
├── stop
└── turn

因此:

Object Type
     ↓
可拥有的 Method 集合

方法名称不是执行代码本身

例如:

turnOn

只是一个方法标识。

真正的执行逻辑可能由:

Method
   ↓
Object
   ↓
DeviceAdapter
   ↓
External Device

完成。

因此 SAI 中可以将:

Method Name

与:

Method Implementation

分开。


32.3 方法参数

Method Parameter(方法参数)用于向方法提供执行所需要的数据。

例如:

setSpeed(1200)

其中:

Method = setSpeed
Parameter = 1200

无参数方法

例如:

$fan->turnOn();

不需要参数:

turnOn()

单参数方法

例如:

$fan->setSpeed(1200);

结构:

Method
Name:
    setSpeed

Parameter:
    speed = 1200

多参数方法

例如:

move(100, 200)

可以表示:

Method
Name:
    move

Parameters:
    x = 100
    y = 200

更复杂的机器人移动:

move(
    x,
    y,
    speed
)

例如:

move(100, 200, 20)

参数类型

参数也可以具有类型:

string
integer
float
boolean
array
object

例如:

setSpeed(
    integer speed
)

或者:

move(
    float x,
    float y,
    float speed
)

参数验证

方法执行之前应该检查参数。

例如:

setSpeed(1200)

如果允许范围:

0 <= speed <= 2000

则:

1200 → valid

如果:

setSpeed(5000)

则:

5000 → invalid

因此:

Method
   ↓
Parameter Validation
   ↓
Execute

参数验证是方法执行安全性的重要基础。


32.4 方法执行

Method Execution(方法执行)表示真正执行 Object 的某项操作。

例如:

Fan
   ↓
turnOn()
   ↓
Power State
off → on

或者:

Fan
   ↓
setSpeed(1200)
   ↓
speed = 1200

方法执行流程

一个完整的方法执行过程可以设计为:

调用 Method
   ↓
检查 Method 是否存在
   ↓
检查权限
   ↓
检查参数
   ↓
检查 Object 状态
   ↓
执行 Method
   ↓
更新 Object
   ↓
生成结果
   ↓
返回

因此 Method 并不是简单的:

call()

而是一个完整的执行过程。


Object 状态对 Method 的影响

例如:

Door
state = locked

此时:

open()

可能不能直接执行。

需要:

unlock()
   ↓
open()

所以:

Method
+
Object State

共同决定方法是否可以执行。


方法执行不是 Decision

例如:

Decision
→ open-door

这是决策结果。

然后:

Behavior
→ open door

最后:

Method
→ door.open()

所以:

Decision
   ↓
Behavior
   ↓
Method
   ↓
Object

职责必须分开。


32.5 方法返回值

Method 执行完成后,可以返回结果。

例如:

turnOn()
→ success

或者:

setSpeed(1200)
→ success

也可以返回更加完整的数据:

{
    success: true,
    state: "on"
}

返回值的作用

返回值用于告诉调用者:

执行是否成功
执行结果是什么
Object 当前状态如何
是否发生错误

成功返回

例如:

$result = $fan->turnOn();

返回:

{
    success: true,
    state: "on"
}

失败返回

例如:

Fan
state = offline

执行:

turnOn()

可能返回:

{
    success: false,
    error: "device_offline"
}

因此:

Method
   ↓
Execution
   ↓
Result

返回值与反馈

Method 返回值可以进一步形成 Feedback。

例如:

turnOn()
   ↓
success
   ↓
Method Result
   ↓
Feedback
   ↓
Information

然后:

Information
   ↓
Perception
   ↓
Cognition

这样就形成:

行为
 ↓
方法执行
 ↓
结果
 ↓
反馈
 ↓
再次感知

这是 SAI 闭环的重要基础。


32.6 方法状态

Method 本身也可以具有状态。

例如:

Method
turnOn
state = ready

执行过程中:

ready
 ↓
running
 ↓
completed

失败:

running
 ↓
failed

Method State

可以定义:

registered
disabled
ready
running
completed
failed
cancelled

例如:

turnOn
state = ready

调用后:

turnOn
state = running

执行完成:

turnOn
state = completed

Object State 与 Method State

两者不能混淆。

例如:

Fan Object
state = on

同时:

turnOn Method
state = completed

含义分别是:

Object State
→ Fan 当前是什么状态

Method State
→ turnOn 这次方法执行处于什么状态

方法执行状态流程

Method
   ↓
registered
   ↓
ready
   ↓
running
   ├──→ completed
   │
   ├──→ failed
   │
   └──→ cancelled

这为后续行为管理、任务管理和异常处理提供基础。


32.7 方法权限

Method Permission(方法权限)用于控制:

谁可以执行这个 Method。

并不是所有方法都应该允许任何模块或任何外部调用者直接执行。

例如:

Door
├── open()
├── close()
└── unlock()

其中:

unlock()

可能需要更高权限。


权限类型

可以设计为:

public
protected
private
system
device
admin

在 SAI Framework 中,这些不一定完全对应 PHP 的访问修饰符,而可以作为 SAI 方法运行权限模型

例如:

Method
name = unlock
permission = security

表示该方法需要满足安全权限条件。


权限检查

执行流程:

调用 Method
   ↓
Permission Check
   ↓
通过?
 ┌───┴───┐
是       否
↓        ↓
执行    拒绝

例如:

unlock()
permission = security

调用者没有权限:

Permission Denied

方法不执行。


权限与安全

权限尤其适用于:

门锁
车辆
机器人
工业设备
生产机器
能源设备

例如:

EmergencyStop()

与:

StartMachine()

可以具有不同权限和优先级。

因此 Method Permission 可以成为后续:

Decision
Risk
Behavior
Device
Maintenance

的重要基础。


32.8 Object Method

Object Method 是 Object 所拥有的方法集合。

例如:

Fan Object

可以定义:

Method
├── turnOn()
├── turnOff()
└── setSpeed(speed)

Object 与 Method 的关系

Object
    │
    ├── Property
    │
    ├── State
    │
    ├── Method
    │
    └── Relation

Method 属于 Object 的行为能力描述。

例如:

fan-001

具有:

turnOn()
turnOff()
setSpeed()

而:

door-001

具有:

open()
close()
lock()
unlock()

Object Method 调用

例如:

$fan->turnOn();

可以理解为:

Object
fan-001
   ↓
Method
turnOn
   ↓
Execute
   ↓
State
off → on

如果:

$fan->setSpeed(1200);

则:

Object
fan-001
   ↓
Method
setSpeed
   ↓
Parameter
1200
   ↓
Execute
   ↓
Property
speed = 1200

32.9 Method 示例

下面建立一个基础 Method 类。

Method Class

<?php

namespace SAI\Object;

class Method
{
    protected $name;
    protected $parameters = array();
    protected $state = 'ready';
    protected $permission = 'public';
    protected $handler;

    public function __construct(
        $name,
        $handler = null
    ) {
        $this->name = $name;
        $this->handler = $handler;
    }

    public function getName()
    {
        return $this->name;
    }

    public function setParameters(array $parameters)
    {
        $this->parameters = $parameters;
    }

    public function getParameters()
    {
        return $this->parameters;
    }

    public function setPermission($permission)
    {
        $this->permission = $permission;
    }

    public function getPermission()
    {
        return $this->permission;
    }

    public function getState()
    {
        return $this->state;
    }

    public function execute(array $parameters = array())
    {
        $this->state = 'running';

        if (!is_callable($this->handler)) {
            $this->state = 'failed';

            return array(
                'success' => false,
                'error' => 'method_handler_not_found'
            );
        }

        $result = call_user_func(
            $this->handler,
            $parameters
        );

        $this->state = 'completed';

        return $result;
    }
}

这个类表达:

Method
├── Name
├── Parameters
├── State
├── Permission
└── Handler

创建 turnOn Method

$turnOn = new Method(
    'turnOn',
    function ($parameters) {

        return array(
            'success' => true,
            'state' => 'on'
        );
    }
);

执行:

$result = $turnOn->execute();

返回:

{
    success = true
    state   = on
}

创建 setSpeed Method

$setSpeed = new Method(
    'setSpeed',
    function ($parameters) {

        if (!isset($parameters['speed'])) {
            return array(
                'success' => false,
                'error' => 'speed_required'
            );
        }

        $speed = $parameters['speed'];

        if ($speed < 0 || $speed > 2000) {
            return array(
                'success' => false,
                'error' => 'speed_out_of_range'
            );
        }

        return array(
            'success' => true,
            'speed' => $speed
        );
    }
);

执行:

$result = $setSpeed->execute(
    array(
        'speed' => 1200
    )
);

得到:

{
    success = true
    speed   = 1200
}

Method 加入 Object

前面已经有:

$fan = new Object(
    'fan-001',
    'fan'
);

现在加入 Method:

$fan->addMethod(
    'turnOn',
    $turnOn
);

$fan->addMethod(
    'setSpeed',
    $setSpeed
);

于是:

Fan
ID = fan-001

Methods
├── turnOn()
└── setSpeed(speed)

改进 Object 的 Method 调用

可以让 Object 直接调用自己的 Method:

public function callMethod(
    $name,
    array $parameters = array()
) {
    if (!isset($this->methods[$name])) {
        return array(
            'success' => false,
            'error' => 'method_not_found'
        );
    }

    return $this->methods[$name]->execute(
        $parameters
    );
}

那么:

$result = $fan->callMethod(
    'turnOn'
);

或者:

$result = $fan->callMethod(
    'setSpeed',
    array(
        'speed' => 1200
    )
);

形成:

Object
 ↓
Method Name
 ↓
Method
 ↓
Parameter
 ↓
Execute
 ↓
Result

32.10 Method 完整运行示例

建立一个 Fan:

Object
ID = fan-001
Type = fan

Property
speed = 0

State
off

Method
turnOn()
turnOff()
setSpeed(speed)

SAI 产生决策:

Decision
turn_on_fan

进入行为:

Behavior
turn_on_fan

然后调用 Object Method:

fan-001
   ↓
turnOn()

Method:

ready
 ↓
running
 ↓
completed

Object:

state
off
 ↓
on

最终返回:

{
    success: true,
    state: "on"
}

然后形成:

Method Result
      ↓
Feedback
      ↓
Information
      ↓
Perception
      ↓
Cognition

完整闭环:

Information
   ↓
Perception
   ↓
Element
   ↓
Object
   ↓
Property
   ↓
Cognition
   ↓
Reasoning
   ↓
Decision
   ↓
Behavior
   ↓
Object Method
   ↓
Execution
   ↓
Result
   ↓
Feedback
   ↓
Information

这一步非常重要,因为 SAI Framework 开始形成:

从“认识对象”到“调用对象能力”的连接。


32.11 Property 与 Method 的对应关系

第31章和第32章可以直接连接:

Object
├── Property → 对象有什么
└── Method   → 对象能做什么

例如:

Fan

具有:

Property
speed = 1200
power = 50

以及:

Method
setSpeed()
turnOn()
turnOff()

执行:

setSpeed(1500)

会导致:

Property
speed
1200 → 1500

执行:

turnOff()

可能导致:

State
on → off

因此:

Method
   ↓
改变
   ↓
Property / State

而变化又可以产生:

PropertyChanged
StateChanged
Feedback

重新进入 SAI 的信息处理循环。


本章小结

第32章建立了 SAI Framework 的 Method 方法层

核心定义:

Method 是 Object 所具有的可执行操作定义,用于描述对象能够执行什么操作、需要什么输入、如何执行以及执行后返回什么结果。

核心结构:

Method
├── Name
├── Parameters
├── Execution
├── Return Value
├── State
└── Permission

核心关系:

Object
   ↓
Method
   ↓
Parameter
   ↓
Execute
   ↓
Result

与前两章连接:

Element
   ↓
Object
   ├── Property → 对象有什么
   ├── Method   → 对象能做什么
   ├── State    → 对象现在是什么状态
   └── Relation → 对象与谁有什么关系

最重要的职责区别:

Property
→ 描述

Method
→ 执行

Behavior
→ 行为

Decision
→ 决定

DeviceAdapter
→ 连接外部设备

因此完整执行链可以表示为:

Decision
   ↓
Behavior
   ↓
Object
   ↓
Method
   ↓
Execution
   ↓
Property / State
   ↓
Result
   ↓
Feedback

这为下一章 第33章 Relation 建立基础:Relation 将进一步解决 Object 与 Object 之间如何建立结构化关系

说明:以上 PHP 代码是本章的设计示例,用于说明 SAI Framework 的 OOP 结构,未作为实际项目代码执行验证。

Leave a Reply

Your email address will not be published. Required fields are marked *