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

第216章 ObjectRepository

第216章 ObjectRepository

216.1 ObjectRepository定义

在第215章中,IndividualRepository 负责 Individual 个体对象的持久化。

Individual 内部又包含大量具体 Object,因此需要进一步建立 ObjectRepository。

ObjectRepository 是 Object Domain Object 与持久化系统之间的边界,负责对象的保存、查询、更新和删除。

其基本模型为:

OR=(O,M,Q,U,D,T)OR=(O,M,Q,U,D,T)

其中:

  • OO:Object,对象领域对象;
  • MM:Mapping,对象映射;
  • QQ:Query,对象查询;
  • UU:Update,对象更新;
  • DD:Delete,对象删除;
  • TT:Time,持久化操作时间。

因此:

ObjectRepository=Save+Query+Update+Delete\boxed{ ObjectRepository = Save + Query + Update + Delete }

其基本关系为:

Object Domain Object
        ↓
ObjectRepository
        ↓
ObjectMapper
        ↓
PDO
        ↓
MySQL

读取方向则相反:

MySQL
  ↓
PDO
  ↓
ObjectRepository
  ↓
ObjectMapper
  ↓
Object Domain Object

因此 ObjectRepository 的本质是:

ObjectRepository=Object Persistence Boundary\boxed{ ObjectRepository = Object\ Persistence\ Boundary }


216.2 Object领域对象

前面的 ObjectEngine 已经定义对象模型:

O=(ID,T,A,S,R)O=(ID,T,A,S,R)

其中:

  • IDID:Object ID,对象唯一标识;
  • TT:Type,对象类型;
  • AA:Attributes,对象属性集合;
  • SS:State,对象当前状态;
  • RR:Relations,对象关系集合。

例如一个对象:

Object O-001
    ├── ID
    ├── Type
    ├── Attributes
    ├── State
    └── Relations

因此:

Object
≠
objects表的一行数据

数据库只是 Object 的一种持久化表达。

可以表示为:

DomainObject↔PersistenceDataDomainObject \leftrightarrow PersistenceData

而不是:

DomainObject=PersistenceDataDomainObject = PersistenceData


216.3 ObjectRepository与ObjectEngine

必须首先明确两个组件的职责边界。

ObjectEngine 负责:

对象计算
对象匹配
对象变化计算
对象更新候选计算
对象验证

ObjectRepository 负责:

对象保存
对象查询
对象读取
对象更新
对象删除

因此:

ObjectEngine=CalculationObjectEngine=Calculation ObjectRepository=PersistenceObjectRepository=Persistence

例如:

Object
  ↓
ObjectEngine
  ↓
计算对象状态变化
  ↓
Update Candidate
  ↓
UpdateEngine
  ↓
ObjectRepository
  ↓
MySQL

ObjectRepository 不应该自己判断:

这个对象是否应该改变?

它只负责:

这个已经确定的对象状态如何正确保存?

216.4 对象保存

216.4.1 保存定义

对象保存是把合法的 Object Domain Object 转换为持久化数据并写入数据库。

基本流程:

Object
  ↓
Validate
  ↓
Map
  ↓
Exists
  ↓
Insert
  ↓
ReadBack
  ↓
Verify

公式:

Save(O)→Validate→Map→Persist→VerifySave(O) \rightarrow Validate \rightarrow Map \rightarrow Persist \rightarrow Verify


216.5 对象保存条件

Object 不能因为 PHP 中存在一个对象实例就直接保存。

应该首先验证:

ValidObject=ID∧Type∧Attributes∧StateValidObject = ID \land Type \land Attributes \land State

其中:

  • IDID:对象身份合法;
  • TypeType:对象类型合法;
  • AttributesAttributes:属性结构合法;
  • StateState:状态结构合法。

因此:

PHPObject≠ValidDomainObjectPHPObject \neq ValidDomainObject

而:

ValidDomainObject≠ValidPersistenceDataValidDomainObject \neq ValidPersistenceData

必须经过 Repository Mapping 和持久化验证。


216.6 对象保存的数据结构

基础对象可以保存到:

objects

属性可以保存到:

object_attributes

关系可以保存到:

object_relations

状态历史可以保存到:

object_state_history

因此:

objects
    │
    ├── object_attributes
    ├── object_relations
    └── object_state_history

ObjectRepository 可以负责对象聚合的持久化协调,但不应该把所有认知计算都塞进 Repository。


216.7 对象查询

对象查询是 ObjectRepository 最重要的能力之一。

查询不只是:

SELECT * FROM objects

而是根据不同查询条件获取对象集合。

基本模型:

Query(C)→{O1,O2,…,On}Query(C)\rightarrow \{O_1,O_2,\ldots,O_n\}

其中 CC 是查询条件。

例如:

按照ID查询
按照Individual查询
按照Type查询
按照State查询
按照创建时间查询
按照状态范围查询

216.8 按ID查询

最基本的对象查询:

findById(ID)→OfindById(ID)\rightarrow O

流程:

Object ID
   ↓
Repository
   ↓
SELECT
   ↓
Persistence Data
   ↓
Mapper
   ↓
Object

PHP:

public function findById($id)
{
    $sql = "
        SELECT *
        FROM objects
        WHERE id = :id
        LIMIT 1
    ";

    $stmt = $this->pdo->prepare($sql);

    $stmt->execute(array(
        ':id' => $id
    ));

    $data = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$data) {
        return null;
    }

    return $this->mapper->toDomain($data);
}

这里返回的是 Domain Object,而不是裸数据库数组。


216.9 按Individual查询对象

一个 Individual 可以拥有多个 Object:

I→{O1,O2,…,On}I \rightarrow \{O_1,O_2,\ldots,O_n\}

因此需要:

findByIndividualId(I)→{O}findByIndividualId(I) \rightarrow \{O\}

例如:

public function findByIndividualId($individualId)
{
    $sql = "
        SELECT *
        FROM objects
        WHERE individual_id = :individual_id
        ORDER BY id ASC
    ";

    $stmt = $this->pdo->prepare($sql);

    $stmt->execute(array(
        ':individual_id' => $individualId
    ));

    $objects = array();

    while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $objects[] = $this->mapper->toDomain($data);
    }

    return $objects;
}

这项能力对于:

IndividualRepository
IndividualAggregateLoader
CognitiveEngine
SceneEngine

都非常重要。


216.10 按对象类型查询

Object Type 是对象的重要分类属性。

因此:

findByType(T)→{O1,…,On}findByType(T)\rightarrow\{O_1,\ldots,O_n\}

例如:

public function findByType($type)
{
    $sql = "
        SELECT *
        FROM objects
        WHERE type = :type
        ORDER BY id ASC
    ";

    $stmt = $this->pdo->prepare($sql);

    $stmt->execute(array(
        ':type' => $type
    ));

    $objects = array();

    while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $objects[] = $this->mapper->toDomain($data);
    }

    return $objects;
}

Repository 只是查询。

真正的:

类型计算
类型推导
类型匹配

应该由 ObjectEngine 或 MatchingEngine 处理。


216.11 按状态查询

对象状态也是重要的持久化查询条件。

例如:

ready
active
blocked
inactive
archived

可以建立:

findByState(S)→{O}findByState(S)\rightarrow\{O\}

例如:

public function findByState($state)
{
    $sql = "
        SELECT *
        FROM objects
        WHERE state = :state
        ORDER BY id ASC
    ";

    $stmt = $this->pdo->prepare($sql);

    $stmt->execute(array(
        ':state' => $state
    ));

    $objects = array();

    while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $objects[] = $this->mapper->toDomain($data);
    }

    return $objects;
}

但是必须注意:

QueryState≠CalculateStateQueryState \neq CalculateState

Repository 查询已经保存的状态。

StateEngine 计算状态。


216.12 对象聚合查询

Object 本身还可能拥有:

Attributes
State
Relations

因此可以提供:

LoadAggregate(OID)→(O,A,S,R)LoadAggregate(OID) \rightarrow (O,A,S,R)

完整读取:

objects
   ↓
Object
   ├── Attributes
   ├── State
   └── Relations

例如:

public function loadAggregate($id)
{
    $object = $this->findById($id);

    if (!$object) {
        return null;
    }

    $object->setAttributes(
        $this->attributeRepository->findByObjectId($id)
    );

    $object->setRelations(
        $this->relationRepository->findByObjectId($id)
    );

    return $object;
}

状态可以由 StateRepository 加载。

这样避免 ObjectRepository 自己重新实现整个 StateRepository 和 RelationRepository。


216.13 查询与计算必须分离

这是 ObjectRepository 设计中的核心原则。

例如用户要求:

找到所有可处理当前任务的对象。

不能直接在 ObjectRepository 中实现全部认知判断。

正确流程:

Requirement
    ↓
ObjectRepository
    ↓
Load Object Candidates
    ↓
ObjectEngine
    ↓
MatchingEngine
    ↓
CapabilityEngine
    ↓
DecisionEngine

因此:

Repository→Candidate RetrievalRepository \rightarrow Candidate\ Retrieval Engine→Candidate CalculationEngine \rightarrow Candidate\ Calculation DecisionEngine→Final SelectionDecisionEngine \rightarrow Final\ Selection


216.14 对象更新

对象更新模型:

Ot+ΔO→Ot+1O_t+\Delta O\rightarrow O_{t+1}

其中:

  • OtO_t:当前对象;
  • ΔO\Delta O:经过验证的变化;
  • Ot+1O_{t+1}:更新后的对象。

基本流程:

Current Object
      ↓
Load
      ↓
Compare
      ↓
ΔObject
      ↓
Validate
      ↓
Update
      ↓
ReadBack
      ↓
Verify

216.15 对象更新不是对象重建

错误方式:

Delete Object
    ↓
Create New Object

正确方式:

Object_t
    ↓
ΔO
    ↓
Object_{t+1}

例如:

Object O-001
state = ready

经过 StateEngine 和 UpdateEngine 确认:

ready → active

那么只需要:

UPDATE objects
SET state = 'active'
WHERE id = ?

不需要重新创建 Object。


216.16 对象属性更新

如果只是某一个属性发生变化:

At+ΔA→At+1A_t+\Delta A\rightarrow A_{t+1}

例如:

temperature = 30

变成:

temperature = 35

则:

ΔA=temperature:30→35\Delta A = temperature:30\rightarrow35

只更新该属性。

这就是:

Minimal Object Update\boxed{Minimal\ Object\ Update}


216.17 对象状态更新

状态更新必须经过 StateEngine。

正确流程:

Event
 ↓
StateEngine
 ↓
Candidate State
 ↓
Validation
 ↓
Verification
 ↓
UpdateEngine
 ↓
ObjectRepository
 ↓
MySQL

而不能:

ObjectRepository
       ↓
直接改变状态

Repository 不应该自己决定:

ready 是否可以变成 active?

这是 StateEngine 的职责。


216.18 对象关系更新

如果 Object 新增关系:

O1 → supports → O2

应该由 RelationEngine 计算关系是否合法。

流程:

Object O1
Object O2
Condition
Rule
    ↓
RelationEngine
    ↓
Relation Candidate
    ↓
Verification
    ↓
RelationRepository

而不是 ObjectRepository 自己计算关系。

因此:

ObjectRepository≠RelationEngineObjectRepository \neq RelationEngine


216.19 对象删除

Object 删除必须特别谨慎,因为 Object 可能被大量认知结构引用。

例如:

Individual
   ↓
Object
   ↓
Relation
   ↓
Knowledge
   ↓
Capability
   ↓
Method
   ↓
Behavior
   ↓
Execution

因此:

Delete(Object)≠DELETE FROM objectsDelete(Object) \neq DELETE\ FROM\ objects


216.20 对象删除前引用检查

删除 Object 前应该检查:

Individual Reference
Relation Reference
Knowledge Reference
Capability Reference
Method Reference
Behavior Reference
Memory Reference
Experience Reference
History Reference

可以定义:

CanDelete(O)=NoRequiredReference∧DeleteRule∧HistoryPolicyCanDelete(O) = NoRequiredReference \land DeleteRule \land HistoryPolicy

如果存在必须保留的引用:

Delete
   ↓
Reference Check
   ↓
Blocked

而不是强制删除。


216.21 对象删除方式

ObjectRepository 可以提供:

Logical Delete
Archive
Physical Delete

逻辑删除

active
  ↓
deleted

保留对象数据。

归档

active
  ↓
archived

对象停止当前使用,但历史数据继续保存。

物理删除

真正删除:

DELETE FROM objects

必须经过引用和删除规则检查。

因此:

PhysicalDeletePhysicalDelete

应该是最严格的一种操作。


216.22 ObjectRepository PHP接口

兼容 PHP 5.6 / PHP 7:

<?php

interface ObjectRepositoryInterface
{
    public function findById($id);

    public function findByIndividualId($individualId);

    public function findByType($type);

    public function findByState($state);

    public function loadAggregate($id);

    public function save($object);

    public function update($object);

    public function archive($id);

    public function delete($id);

    public function exists($id);
}

接口本身不包含:

ObjectEngine
StateEngine
RelationEngine
MatchingEngine
DecisionEngine

它只定义对象持久化能力。


216.23 ObjectMapper

ObjectMapper 负责:

Object↔PersistenceDataObject \leftrightarrow PersistenceData

例如:

<?php

class ObjectMapper
{
    public function toPersistence($object)
    {
        return array(
            'id' => $object->getId(),
            'individual_id' => $object->getIndividualId(),
            'type' => $object->getType(),
            'name' => $object->getName(),
            'state' => $object->getState()
        );
    }

    public function toDomain($data)
    {
        $object = new ObjectEntity();

        $object->setId($data['id']);
        $object->setIndividualId($data['individual_id']);
        $object->setType($data['type']);
        $object->setName($data['name']);
        $object->setState($data['state']);

        return $object;
    }
}

这里使用 ObjectEntity,是为了避免 PHP 中 Object 与基础对象概念产生命名混乱。


216.24 ObjectRepository完整基本实现

<?php

class MySQLObjectRepository implements ObjectRepositoryInterface
{
    protected $pdo;
    protected $mapper;

    public function __construct(PDO $pdo, ObjectMapper $mapper)
    {
        $this->pdo = $pdo;
        $this->mapper = $mapper;
    }

    public function exists($id)
    {
        $sql = "
            SELECT COUNT(*) AS total
            FROM objects
            WHERE id = :id
        ";

        $stmt = $this->pdo->prepare($sql);

        $stmt->execute(array(
            ':id' => $id
        ));

        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        return ((int)$row['total'] > 0);
    }

    public function findById($id)
    {
        $sql = "
            SELECT *
            FROM objects
            WHERE id = :id
            LIMIT 1
        ";

        $stmt = $this->pdo->prepare($sql);

        $stmt->execute(array(
            ':id' => $id
        ));

        $data = $stmt->fetch(PDO::FETCH_ASSOC);

        if (!$data) {
            return null;
        }

        return $this->mapper->toDomain($data);
    }

    public function findByIndividualId($individualId)
    {
        $sql = "
            SELECT *
            FROM objects
            WHERE individual_id = :individual_id
            ORDER BY id ASC
        ";

        $stmt = $this->pdo->prepare($sql);

        $stmt->execute(array(
            ':individual_id' => $individualId
        ));

        $objects = array();

        while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $objects[] = $this->mapper->toDomain($data);
        }

        return $objects;
    }

    public function findByType($type)
    {
        $sql = "
            SELECT *
            FROM objects
            WHERE type = :type
            ORDER BY id ASC
        ";

        $stmt = $this->pdo->prepare($sql);

        $stmt->execute(array(
            ':type' => $type
        ));

        $objects = array();

        while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $objects[] = $this->mapper->toDomain($data);
        }

        return $objects;
    }

    public function findByState($state)
    {
        $sql = "
            SELECT *
            FROM objects
            WHERE state = :state
            ORDER BY id ASC
        ";

        $stmt = $this->pdo->prepare($sql);

        $stmt->execute(array(
            ':state' => $state
        ));

        $objects = array();

        while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $objects[] = $this->mapper->toDomain($data);
        }

        return $objects;
    }

    public function save($object)
    {
        $data = $this->mapper->toPersistence($object);

        $sql = "
            INSERT INTO objects
            (
                id,
                individual_id,
                type,
                name,
                state
            )
            VALUES
            (
                :id,
                :individual_id,
                :type,
                :name,
                :state
            )
        ";

        $stmt = $this->pdo->prepare($sql);

        $success = $stmt->execute(array(
            ':id' => $data['id'],
            ':individual_id' => $data['individual_id'],
            ':type' => $data['type'],
            ':name' => $data['name'],
            ':state' => $data['state']
        ));

        if (!$success) {
            return false;
        }

        return $this->exists($data['id']);
    }

    public function update($object)
    {
        $data = $this->mapper->toPersistence($object);

        $sql = "
            UPDATE objects
            SET
                individual_id = :individual_id,
                type = :type,
                name = :name,
                state = :state
            WHERE id = :id
        ";

        $stmt = $this->pdo->prepare($sql);

        $success = $stmt->execute(array(
            ':id' => $data['id'],
            ':individual_id' => $data['individual_id'],
            ':type' => $data['type'],
            ':name' => $data['name'],
            ':state' => $data['state']
        ));

        if (!$success) {
            return false;
        }

        return $this->exists($data['id']);
    }

    public function archive($id)
    {
        $sql = "
            UPDATE objects
            SET state = 'archived'
            WHERE id = :id
        ";

        $stmt = $this->pdo->prepare($sql);

        return $stmt->execute(array(
            ':id' => $id
        ));
    }

    public function delete($id)
    {
        $sql = "
            DELETE FROM objects
            WHERE id = :id
        ";

        $stmt = $this->pdo->prepare($sql);

        return $stmt->execute(array(
            ':id' => $id
        ));
    }

    public function loadAggregate($id)
    {
        $object = $this->findById($id);

        if (!$object) {
            return null;
        }

        /*
         * Attributes、Relations、State
         * 应由对应 Repository 加载。
         */

        return $object;
    }
}

这段实现展示的是 Repository 的基本持久化职责。它没有把 ObjectEngine 的计算逻辑放进 Repository。

实际项目中的字段名称必须以真实数据库结构为准,不能因为理论模型而直接假设现有项目一定存在这些字段。


216.25 对象保存后的验证

执行:

$stmt->execute();

只能说明 PDO 执行过程没有直接报告失败。

不能简单等价于:

PersistenceSuccessPersistenceSuccess

更完整的验证:

PersistenceSuccess=SQLSuccess∧Exists∧IdentityMatch∧DataMatchPersistenceSuccess = SQLSuccess \land Exists \land IdentityMatch \land DataMatch

因此保存流程:

Save
 ↓
SQL Execute
 ↓
Exists
 ↓
ReadBack
 ↓
Compare
 ↓
Verify

如果保存后的对象读取结果不符合预期,就应该记录持久化验证失败。


216.26 对象更新后的验证

更新同样不能只判断 SQL 是否执行。

应该:

Update(Ot,ΔO)→ReadBack→Compare→VerifyUpdate(O_t,\Delta O) \rightarrow ReadBack \rightarrow Compare \rightarrow Verify

例如:

state:
ready
↓
active

更新后重新读取:

state = active

才能确认:

VerifiedUpdate=trueVerifiedUpdate=true


216.27 ObjectRepository与StateRepository

ObjectRepository 保存 Object 本体。

StateRepository 保存 State 持久化记录。

二者关系:

ObjectEngine
      ↓
StateEngine
      ↓
State Candidate
      ↓
UpdateEngine
      ↓
ObjectRepository / StateRepository

不能让 ObjectRepository 自己实现完整 StateEngine。

因为:

Object≠StateObject \neq State

虽然:

Object→StateObject \rightarrow State

但是两者属于不同 Domain Object。


216.28 ObjectRepository与RelationRepository

同样:

ObjectRepository

负责:

Object

而:

RelationRepository

负责:

Relation

关系计算由:

RelationEngine

完成。

完整流程:

Object O1
Object O2
   ↓
RelationEngine
   ↓
Relation Candidate
   ↓
Verification
   ↓
RelationRepository
   ↓
MySQL

因此不能因为 Relation 是 Object 的组成部分,就把 RelationEngine 的逻辑直接放进 ObjectRepository。


216.29 ObjectRepository与IndividualRepository

两者属于不同层级。

Individual→ObjectsIndividual \rightarrow Objects

IndividualRepository:

保存 Individual
读取 Individual
协调 Individual 聚合

ObjectRepository:

保存 Object
查询 Object
更新 Object
删除 Object

关系:

IndividualRepository
        ↓
ObjectRepository
        ↓
objects

或者通过 AggregateLoader:

Individual
   ↓
IndividualAggregateLoader
   ↓
ObjectRepository
   ↓
Object集合

因此:

IndividualRepository≠ObjectRepositoryIndividualRepository \neq ObjectRepository

但是:

IndividualRepository⊃Object Aggregate CoordinationIndividualRepository \supset Object\ Aggregate\ Coordination


216.30 对象删除与历史数据

一个 Object 可能已经产生:

State History
Behavior History
Execution History
Feedback
Memory
Experience
Knowledge
Relation History

因此:

DeleteObject≠DeleteObjectHistoryDeleteObject \neq DeleteObjectHistory

尤其当历史数据已经进入 Memory、Experience 或 Learning 后,直接物理删除 Object 可能破坏历史引用。

因此推荐:

Object Active
     ↓
Object Inactive
     ↓
Object Archived

历史继续保存。

如果必须物理删除:

Reference Check
      ↓
History Policy
      ↓
Delete Rule
      ↓
Physical Delete

216.31 ObjectRepository的数据生命周期

对象持久化生命周期可以定义为:

Create
   ↓
Initialize
   ↓
Save
   ↓
Load
   ↓
Runtime
   ↓
Modify
   ↓
Validate
   ↓
Update
   ↓
Verify
   ↓
Inactive
   ↓
Archive
   ↓
Delete

而认知生命周期则可能是:

Object
 ↓
State
 ↓
Relation
 ↓
Scene
 ↓
Knowledge
 ↓
Capability
 ↓
Method
 ↓
Decision
 ↓
Behavior
 ↓
Execution
 ↓
Result
 ↓
Feedback
 ↓
Learning
 ↓
Update
 ↓
ObjectRepository

两个生命周期通过 Repository 与 UpdateEngine 连接。


216.32 ObjectRepository完整工程结构

最终 Object 相关工程结构可以形成:

Controller
    ↓
ObjectService
    ├── ObjectRepository
    ├── StateRepository
    └── RelationRepository
             ↓
          MySQL

认知计算:

ObjectService
    ↓
ObjectEngine
    ↓
StateEngine
    ↓
RelationEngine
    ↓
SceneEngine
    ↓
KnowledgeEngine

更新:

LearningEngine
      ↓
Update Candidate
      ↓
UpdateEngine
      ↓
Object
      ↓
ObjectRepository
      ↓
MySQL

216.33 ObjectRepository统一操作模型

可以将 ObjectRepository 的四项核心操作统一表示为:

保存

Save(O)→Validate→Map→Insert→VerifySave(O) \rightarrow Validate \rightarrow Map \rightarrow Insert \rightarrow Verify

查询

Query(C)→Database→Map→{O}Query(C) \rightarrow Database \rightarrow Map \rightarrow \{O\}

更新

Ot+ΔO→Validate→Update→ReadBack→VerifyO_t+\Delta O \rightarrow Validate \rightarrow Update \rightarrow ReadBack \rightarrow Verify

删除

Delete(O)→ReferenceCheck→DeletePolicy→Archive/Delete→VerifyDelete(O) \rightarrow ReferenceCheck \rightarrow DeletePolicy \rightarrow Archive/Delete \rightarrow Verify


216.34 ObjectRepository核心原则

ObjectRepository 必须遵守以下原则。

原则一:对象与数据库分离

Object≠DatabaseRecordObject \neq DatabaseRecord

原则二:Repository不负责对象计算

Repository≠ObjectEngineRepository \neq ObjectEngine

原则三:Repository不负责状态计算

Repository≠StateEngineRepository \neq StateEngine

原则四:Repository不负责关系计算

Repository≠RelationEngineRepository \neq RelationEngine

原则五:查询不等于匹配

Query≠MatchingQuery \neq Matching

原则六:更新不等于学习

Update≠LearningUpdate \neq Learning

原则七:保存必须可验证

Save→ReadBack→VerifySave \rightarrow ReadBack \rightarrow Verify

原则八:更新遵守最小更新原则

Ot+ΔO→Ot+1O_t+\Delta O\rightarrow O_{t+1}

原则九:删除必须检查引用

Delete→ReferenceCheckDelete \rightarrow ReferenceCheck

原则十:历史数据不能被无条件删除

DeleteObject≠DeleteHistoryDeleteObject \neq DeleteHistory


216.35 本章总结

ObjectRepository 是 ICAI Object 持久化体系的核心组件。

它将 Object Domain Object 与 MySQL 隔离:

Object↔ObjectRepository↔MySQL\boxed{ Object \leftrightarrow ObjectRepository \leftrightarrow MySQL }

其四项核心能力是:

Save+Query+Update+Delete\boxed{ Save + Query + Update + Delete }

对象保存:

Object→Validate→Map→Persist→VerifyObject \rightarrow Validate \rightarrow Map \rightarrow Persist \rightarrow Verify

对象查询:

QueryCondition→MySQL→PersistenceData→ObjectQueryCondition \rightarrow MySQL \rightarrow PersistenceData \rightarrow Object

对象更新:

Ot+ΔO→Ot+1O_t+\Delta O\rightarrow O_{t+1}

对象删除:

Delete→ReferenceCheck→DeletePolicy→Archive/DeleteDelete \rightarrow ReferenceCheck \rightarrow DeletePolicy \rightarrow Archive/Delete

最终形成:

ObjectEngine
     ↓
计算
     ↓
UpdateEngine
     ↓
Object
     ↓
ObjectRepository
     ↓
MySQL

而读取则形成:

MySQL
  ↓
ObjectRepository
  ↓
ObjectMapper
  ↓
Object
  ↓
ObjectEngine

由此,ICAI 的对象工程边界进一步明确:

ObjectEngine=对象计算\boxed{ ObjectEngine=对象计算 } ObjectRepository=对象持久化\boxed{ ObjectRepository=对象持久化 } ObjectService=对象应用流程编排\boxed{ ObjectService=对象应用流程编排 } MySQL=持久化存储\boxed{ MySQL=持久化存储 }

四者共同构成:

ObjectService→ObjectEngine→Object→ObjectRepository→MySQL\boxed{ ObjectService \rightarrow ObjectEngine \rightarrow Object \rightarrow ObjectRepository \rightarrow MySQL }

ObjectRepository 因此不是一个简单的 CRUD 类,而是 ICAI 从 运行时 Object → 持久化 Object → 再恢复运行时 Object 的核心数据边界。

Leave a Reply

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