第二十三篇 Extension
第76章 Extension
随着 ICAI 的感知、认知、记忆、推理、决策、行为、行动、表达、自维护等机制不断增加,系统本身会形成越来越多的功能模块。
如果所有功能都直接写入 ICAI 核心,就会产生一个问题:
功能增加
↓
核心代码不断增加
↓
模块之间耦合
↓
修改一个功能影响其他功能
↓
维护困难
因此需要 Extension(扩展机制)。
Extension 的核心思想是:
核心保持稳定,功能通过标准接口进入系统。
基本结构:
ICAI Core
│
├── Extension A
├── Extension B
├── Extension C
└── Extension D
Extension 不是新的认知核心,也不是新的智能机制。
它只是 ICAI 的功能扩展机制。
1. Extension 定义
Extension,即扩展,是 ICAI 在保持核心结构相对稳定的情况下,通过标准接口增加、加载、管理和移除外部功能模块的机制。
其基本关系:
Core
↓
Extension Interface
↓
Extension
↓
Additional Function
Extension 可以扩展:
- Perception
- Cognition
- Memory
- Reasoning
- Decision
- Behavior
- Action
- Expression
- Device
- Detection
- Diagnosis
- Repair
- Verification
- Storage
- Communication
- Data Processing
例如:
ICAI
├── Core
├── DetectionExtension
├── DeviceExtension
├── MemoryExtension
└── RepairExtension
Extension 本身不是 ICAI Core。
因此:
Extension ≠ Core
Extension ≠ Engine
Extension ≠ Module
Extension ≠ Capability
可以理解为:
Core
= 系统核心
Module
= 系统内部功能模块
Extension
= 可以按照标准接口增加或移除的扩展功能
2. 为什么需要 Extension
2.1 降低核心耦合
如果所有功能直接进入核心:
Core
├── Device
├── Repair
├── Detection
├── File
├── Network
├── Sensor
├── Storage
└── ...
核心会越来越复杂。
采用 Extension 后:
Core
↓
ExtensionManager
↓
Extensions
核心只负责管理扩展,不需要知道每个扩展内部的全部实现。
2.2 增加新功能
例如原来的 ICAI 没有温度设备支持。
可以增加:
TemperatureDeviceExtension
而不必修改整个 Cognition、Reasoning、Decision 核心。
2.3 独立维护
每个 Extension 可以拥有自己的:
Class
Method
Configuration
Data
State
Dependency
例如:
extensions/
├── DetectionExtension/
├── DeviceExtension/
├── MemoryExtension/
└── RepairExtension/
这样可以减少不同功能之间的直接依赖。
2.4 可加载
系统启动时可以:
Registry
↓
Find Extension
↓
Validate
↓
Load
↓
Initialize
不需要把所有扩展永久写死在 Core 中。
2.5 可卸载
某个 Extension 不再需要时:
Extension
↓
Stop
↓
Unload
↓
Registry Update
从而减少对核心系统的影响。
2.6 有利于自维护
Extension 本身也可以成为 Detection 的对象。
例如:
Detection
↓
Extension_A
↓
state = ERROR
↓
Diagnosis
↓
Repair
↓
Verification
因此 Extension 可以进入 ICAI 的自维护体系。
3. Extension Interface
Extension Interface 是扩展机制的标准接口。
它规定一个 Extension 至少应该具备哪些基本能力。
例如使用 PHP OOP:
interface ExtensionInterface
{
public function getId();
public function getName();
public function getVersion();
public function load();
public function start();
public function stop();
public function unload();
public function getState();
}
这样,ExtensionManager 不需要知道具体 Extension 的内部代码。
例如:
class DetectionExtension implements ExtensionInterface
{
protected $state = 'NEW';
public function getId()
{
return 'detection';
}
public function getName()
{
return 'Detection Extension';
}
public function getVersion()
{
return '1.0.0';
}
public function load()
{
$this->state = 'LOADED';
return true;
}
public function start()
{
$this->state = 'ACTIVE';
return true;
}
public function stop()
{
$this->state = 'STOPPED';
return true;
}
public function unload()
{
$this->state = 'UNLOADED';
return true;
}
public function getState()
{
return $this->state;
}
}
接口的意义是:
不同 Extension
↓
统一 Interface
↓
统一 Manager
4. Extension Manager
Extension Manager 是 Extension 的运行管理器。
它负责:
- 注册
- 查找
- 加载
- 初始化
- 启动
- 停止
- 卸载
- 状态管理
基本结构:
ExtensionManager
{
Registry
Loader
Extensions
DependencyChecker
StateManager
}
一个简单的 PHP OOP 示例:
class ExtensionManager
{
protected $extensions = array();
public function register(ExtensionInterface $extension)
{
$id = $extension->getId();
$this->extensions[$id] = $extension;
return true;
}
public function get($id)
{
if (!isset($this->extensions[$id])) {
return null;
}
return $this->extensions[$id];
}
public function load($id)
{
$extension = $this->get($id);
if (!$extension) {
return false;
}
return $extension->load();
}
public function start($id)
{
$extension = $this->get($id);
if (!$extension) {
return false;
}
return $extension->start();
}
public function stop($id)
{
$extension = $this->get($id);
if (!$extension) {
return false;
}
return $extension->stop();
}
public function unload($id)
{
$extension = $this->get($id);
if (!$extension) {
return false;
}
$result = $extension->unload();
if ($result) {
unset($this->extensions[$id]);
}
return $result;
}
}
Manager 的职责是管理 Extension 生命周期,而不是实现 Extension 的具体业务功能。
因此:
Extension
= 功能
ExtensionManager
= 管理功能
5. Extension Registry
Extension Registry,即扩展注册表,用于记录系统中有哪些 Extension,以及它们的基本信息。
基本结构:
ExtensionRegistry
{
id
name
version
class
path
type
dependencies
state
enabled
configuration
}
例如:
{
"id": "detection",
"name": "Detection Extension",
"version": "1.0.0",
"class": "DetectionExtension",
"path": "extensions/DetectionExtension.php",
"type": "system",
"dependencies": [],
"state": "ACTIVE",
"enabled": true
}
Registry 的作用是:
记录
↓
查找
↓
判断
↓
加载
它本身并不执行 Extension。
因此:
Registry ≠ Extension
Registry ≠ Manager
三者关系:
Registry
↓
记录有哪些 Extension
Manager
↓
管理 Extension
Extension
↓
执行具体扩展功能
5.1 注册
例如:
$manager->register(
new DetectionExtension()
);
注册以后:
ExtensionManager
↓
DetectionExtension
5.2 查询
$extension = $manager->get('detection');
如果不存在:
NULL
而不是假定 Extension 一定存在。
6. Extension 生命周期
Extension 必须具有明确生命周期。
基本生命周期:
NEW
↓
REGISTERED
↓
LOADED
↓
INITIALIZED
↓
ACTIVE
↓
STOPPED
↓
UNLOADED
异常状态可以包括:
ERROR
DISABLED
INVALID
CONFLICT
6.1 NEW
Extension 对象已经创建:
Extension
state = NEW
此时还没有正式进入系统运行环境。
6.2 REGISTERED
Extension 被 Registry / Manager 注册:
NEW
↓
REGISTERED
6.3 LOADED
系统成功加载 Extension:
REGISTERED
↓
LOADED
加载通常包括:
- 类文件
- 配置
- 基础资源
- 必要依赖
6.4 INITIALIZED
加载完成后进行初始化:
LOADED
↓
INITIALIZED
初始化可以建立:
- 内部对象
- 配置
- 数据结构
- 服务关系
6.5 ACTIVE
Extension 正式运行:
INITIALIZED
↓
ACTIVE
6.6 STOPPED
Extension 被停止:
ACTIVE
↓
STOPPED
停止不等于卸载。
6.7 UNLOADED
Extension 从运行环境中移除:
STOPPED
↓
UNLOADED
7. Extension 加载
Extension Loading 是把注册的 Extension 从定义状态转换为可运行状态的过程。
基本流程:
Registry
↓
Read Extension
↓
Check File
↓
Check Class
↓
Check Interface
↓
Check Dependency
↓
Load
↓
Initialize
↓
Start
↓
ACTIVE
7.1 检查文件
首先确认:
path
是否存在。
不存在:
LOAD FAILED
7.2 检查 Class
确认类是否存在:
class_exists($className)
不存在:
INVALID
7.3 检查 Interface
必须确认:
Extension
implements
ExtensionInterface
否则不能作为标准 Extension 加载。
7.4 检查依赖
例如:
DeviceExtension
depends_on
CommunicationExtension
如果:
CommunicationExtension = NOT_AVAILABLE
则:
DeviceExtension
LOAD BLOCKED
不能假定依赖已经存在。
7.5 加载与启动
依赖检查通过后:
Load
↓
Initialize
↓
Start
↓
ACTIVE
只有真正成功以后,Registry 才应该记录:
state = ACTIVE
8. Extension 卸载
Extension Unloading 是将 Extension 从系统运行环境中安全移除的过程。
基本流程:
ACTIVE
↓
Check Usage
↓
Stop
↓
Release Resource
↓
Remove Runtime Reference
↓
Registry Update
↓
UNLOADED
8.1 检查使用状态
如果:
DeviceExtension
仍然有:
Device_A
Device_B
Device_C
正在使用它,就不能简单执行:
unset($extension);
必须先检查依赖和运行对象。
8.2 停止 Extension
ACTIVE
↓
STOP
↓
STOPPED
停止以后不应该再接受新的运行任务。
8.3 释放资源
Extension 可能拥有:
- 文件句柄
- 数据连接
- 设备连接
- 临时对象
- 内存数据
- 注册事件
- 定时任务
卸载前需要释放这些资源。
8.4 移除运行引用
完成资源释放后:
ExtensionManager
↓
Remove Reference
然后更新 Registry:
state = UNLOADED
8.5 卸载失败
如果停止失败:
ACTIVE
↓
STOP FAILED
不能直接标记:
UNLOADED
应该保持:
state = ERROR
并进入:
Detection
↓
Diagnosis
↓
Repair
↓
Verification
这样 Extension 生命周期也可以纳入 ICAI 自维护体系。
本章核心模型
Extension Registry
↓
Extension Manager
↓
Extension Interface
↓
Extension
↓
Load
↓
Initialize
↓
Active
↓
Stop
↓
Unload
完整关系:
ICAI Core
│
ExtensionManager
│
ExtensionRegistry
│
┌─────────┼─────────┐
↓ ↓ ↓
Extension A Extension B Extension C
│ │ │
Function Function Function
本章核心定义
Extension:
Extension 是 ICAI 在保持核心结构稳定的基础上,通过标准接口增加、加载、管理和移除外部功能的扩展机制。
Extension Interface:
Extension Interface 是规定扩展基本结构和生命周期行为的标准接口。
Extension Manager:
Extension Manager 是负责 Extension 注册、查找、加载、启动、停止、卸载和状态管理的管理组件。
Extension Registry:
Extension Registry 是记录 Extension 身份、版本、路径、类型、依赖、状态和配置等信息的注册结构。
最终形成:
Core
↓
Extension Interface
↓
Extension Registry
↓
Extension Manager
↓
Load / Initialize / Start
↓
Extension
↓
Function
↓
Stop / Unload
而 Extension 与前面建立的自维护机制可以进一步连接:
Extension
↓
Detection
↓
Risk / Conflict
↓
Diagnosis
↓
Repair
↓
Verification
↓
Extension Continue
因此,Extension 解决的是“系统如何增加和移除功能”,而不是“系统如何产生认知”。