知识卡片

context函数让子状态安全访问祖先状态数据

专业/工作 · 515.b

内容

子状态经常需要用到父状态或更上层祖先状态保存的上下文数据(比如 Peering 过程中某个子阶段要读取整体 Peering 流程累积的信息),statechart 提供 context<祖先状态类型>() 按类型直接取得该祖先状态实例的指针,而不需要把这些数据提升成全局变量或者在状态转换时层层手动传递。这解决了层级状态机的一个潜在问题:[[层级状态机用父子嵌套复用公共事件处理|父子状态共享行为]]之外,还经常需要共享数据,如果没有这个机制,要么被迫用全局状态(丧失封装、多个 PG 实例之间会互相污染),要么每次转换都要手动搬运数据。用状态树的父子关系本身作为数据作用域的层级,是一种”结构即作用域”的设计。

参考来源

《Ceph源码分析》第10章《Ceph Peering机制》