第32章 Method
本章大纲
- Method 定义
- 方法名称
- 方法参数
- 方法执行
- 方法返回值
- 方法状态
- 方法权限
- Object Method
- 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 结构,未作为实际项目代码执行验证。