第六章 太医院生命周期 - 从采药到煎煮的钩子哲学

64 阅读2分钟

御药房君臣佐使(类生命周期设计)

class ImperialMedicinalHook {
  private _herbs = new Map<string, Herb>()  // 药材仓库
  private _cauldron: Pot|null = null        // 煎药砂锅
  private _decoctionSteps: Function[] = []  // 火候控制队列

  // 采药阶段钩子
  beforeHarvest() {
    this._checkSoilQuality() // 校验采药环境
    this._prepareBasket()    // 初始化采药容器
  }

  // 炮制阶段钩子
  processedHerbs(processor: (herbs: Map<string, Herb>) => void) {
    this._herbs = processor(this._herbs) // 药材预处理
    this._registerYinYangBalance()        // 阴阳平衡校验
  }

  // 煎煮完整周期
  async brew() {
    try {
      await this._igniteFire('文火')   // 挂载前准备
      this._cauldron = this._combineHerbs()
      await this._controlHeat()        // 更新阶段控温
    } finally {
      this._cleanPot()                 // 卸载后清理
    }
  }
}

采药九蒸九晒(初始化阶段)

道地药材校验

// 环境变量校验钩子
function validateGrowingEnv() {
  if (!process.env.MOUNTAIN_AIR) {
    throw new Error('非终南山灵气不能入药')
  }
}

// 在采药前注入校验
class GinsengHook extends ImperialMedicinalHook {
  beforeHarvest() {
    validateGrowingEnv()
    super.beforeHarvest()
  }
}

君臣佐使配伍

// 药材依赖注入
interface Prescription {
  monarch: Herb     // 君药
  minister: Herb[]  // 臣药
  assistant?: Herb  // 佐药
  guide?: Herb      // 使药
}

function createPrescription(hook: ImperialMedicinalHook): Prescription {
  return {
    monarch: hook._herbs.get('人参'),
    minister: [hook._herbs.get('白术'), hook._herbs.get('茯苓')],
    guide: hook._herbs.get('甘草')
  }
}

文武火调控(挂载与更新)

火候阶段管理

// 火候控制中间件
function createFireControl() {
  const fireStages = ['微火', '文火', '武火']
  let currentStage = 0

  return {
    next() {
      if (currentStage < fireStages.length) {
        console.log(`转${fireStages[currentStage++]}`)
        return true
      }
      return false
    },
    emergencyCoolDown() {
      currentStage = 0
      console.log('紧急退火!')
    }
  }
}

// 应用火候控制
async _controlHeat() {
  const fire = createFireControl()
  while (fire.next()) {
    await new Promise(r => setTimeout(r, 1000))
  }
}

汤药生效监测(效果追踪)

脉象监听系统

// 药效响应式追踪
type PulseListener = (diagnosis: Diagnosis) => void

class MedicinalEffect {
  private _pulseListeners: PulseListener[] = []

  // 号脉订阅
  onPulseChange(listener: PulseListener) {
    this._pulseListeners.push(listener)
  }

  // 切脉触发
  private _checkEffect() {
    setInterval(() => {
      const diagnosis = this._diagnose()
      this._pulseListeners.forEach(fn => fn(diagnosis))
    }, 5000)
  }
}

// 示例:实时监测药效
const effectTracker = new MedicinalEffect()
effectTracker.onPulseChange((d) => {
  if (d.meridianBlock) {
    console.warn('经络不通,需调整药方!')
  }
})

药渣处理(卸载清理)

副作用清除术

function createCleanupScript() {
  const cleaners = []
  
  return {
    addCleaner(fn) {
      cleaners.push(fn)
      return () => cleaners.splice(cleaners.indexOf(fn), 1)
    },
    execute() {
      cleaners.forEach(fn => fn())
      console.log('药渣已深埋三尺')
    }
  }
}

// 在煎药结束后自动执行
class SafeMedicinalHook extends ImperialMedicinalHook {
  async brew() {
    const cleanup = createCleanupScript()
    try {
      // ...煎药过程
    } finally {
      cleanup.execute()
    }
  }
}

(臣启:此设计暗合《黄帝内经》四时调神之道——

  1. beforeHarvest 如春季养生,生而勿杀
  2. brew 似夏季养长,使华英成秀
  3. onPulseChange 仿秋季养收,使志安宁
  4. cleanup 同冬季养藏,必待日光

然今人用药多求速效,建议:

  • 引入Suspense如先服护心汤
  • 使用Error Boundary似预备解毒丹
  • 采用SSR同古法汤剂快火急煎
    方得现代应用调和之道!)