鸿蒙 App 的“无状态 System”设计


子玥酱 (掘金 / 知乎 / CSDN / 简书 同名)

大家好,我是 子玥酱,一名长期深耕在一线的前端程序媛 👩‍💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚焦于业务型系统的工程化建设与长期维护。

我持续输出和沉淀前端领域的实战经验,日常关注并分享的技术方向包括 前端工程化、小程序、React / RN、Flutter、跨端方案,

在复杂业务落地、组件抽象、性能优化以及多端协作方面积累了大量真实项目经验。

技术方向: 前端 / 跨端 / 小程序 / 移动端工程化 内容平台: 掘金、知乎、CSDN、简书 创作特点: 实战导向、源码拆解、少空谈多落地 **文章状态:**长期稳定更新,大量原创输出

我的内容主要围绕 前端技术实战、真实业务踩坑总结、框架与方案选型思考、行业趋势解读 展开。文章不会停留在"API 怎么用",而是更关注为什么这么设计、在什么场景下容易踩坑、真实项目中如何取舍,希望能帮你在实际工作中少走弯路。

子玥酱 · 前端成长记录官 ✨

👋 如果你正在做前端,或准备长期走前端这条路

📚 关注我,第一时间获取前端行业趋势与实践总结

🎁 可领取 11 类前端进阶学习资源 (工程化 / 框架 / 跨端 / 面试 / 架构)

💡 一起把技术学"明白",也用"到位"

持续写作,持续进阶。

愿我们都能在代码和生活里,走得更稳一点 🌱

文章目录

    • 引言
    • [一、什么是"无状态 System"](#一、什么是“无状态 System”)
    • [二、为什么 System 必须无状态](#二、为什么 System 必须无状态)
      • [1 分布式环境下,状态不能"藏在某一层"](#1 分布式环境下,状态不能“藏在某一层”)
      • [2 并发问题](#2 并发问题)
      • [3 可测试性](#3 可测试性)
    • 三、正确的架构分层
    • 四、状态应该放在哪里
      • [1 UI 层(局部状态)](#1 UI 层(局部状态))
      • [2 模块层(共享状态)](#2 模块层(共享状态))
      • [3 全局层(分布式状态)](#3 全局层(分布式状态))
    • [五、System 的正确职责](#五、System 的正确职责)
      • [1 编排逻辑](#1 编排逻辑)
      • [2 调度任务](#2 调度任务)
      • [3 聚合能力](#3 聚合能力)
    • [六、结合 Task / Agent 架构](#六、结合 Task / Agent 架构)
    • [七、一个错误 vs 正确案例](#七、一个错误 vs 正确案例)
    • [八、System + 状态的正确关系](#八、System + 状态的正确关系)
    • 九、为什么很多项目做不到
      • [1 惯性思维](#1 惯性思维)
      • [2 想"方便"](#2 想“方便”)
      • [3 不理解分布式](#3 不理解分布式)
    • 十、本质总结

引言

如果你已经开始用鸿蒙写中大型应用,大概率会遇到一个问题:

复制代码
System 层越来越重
状态越来越多
逻辑越来越难控

很多人会把各种东西往 System 里塞:

  • 当前用户
  • 当前订单
  • 页面状态
  • UI 控制标记

看起来很"集中管理",但很快就会变成:

一个巨大的状态黑洞

但如果你观察一些结构清晰、可扩展的项目,你会发现一个非常反直觉的设计:

System 层,应该是"无状态的"。

一、什么是"无状态 System"

一句话解释:

System 只负责"处理",不负责"存储"。

对比两种设计

错误 有状态 System

ts 复制代码
class OrderSystem {

  currentOrder: any

  create(order) {
    this.currentOrder = order
  }

}

问题:

  • 状态来源不清晰
  • 多设备同步困难
  • 并发冲突严重

正确 无状态 System

ts 复制代码
class OrderSystem {

  async create(order) {
    return await orderService.create(order)
  }

}

System 不保存任何状态

二、为什么 System 必须无状态

1 分布式环境下,状态不能"藏在某一层"

如果你这样写:

ts 复制代码
this.currentUser = user

这个状态:

复制代码
只存在当前设备

但鸿蒙是:

复制代码
多设备系统

所以:

状态必须在"全局可访问"的地方

2 并发问题

有状态 System:

ts 复制代码
this.currentOrder = orderA
this.currentOrder = orderB

会发生:

复制代码
状态覆盖

无状态 System:

ts 复制代码
create(orderA)
create(orderB)

没有冲突

3 可测试性

有状态:

复制代码
测试依赖历史状态 错误

无状态:

复制代码
输入 → 输出 ✔

更容易测试

三、正确的架构分层

推荐模型

复制代码
UI(展示)
   ↓
State(状态)
   ↓
System(处理)
   ↓
Service(业务)
   ↓
Repository(数据)

关键:

状态不属于 System

四、状态应该放在哪里

1 UI 层(局部状态)

ts 复制代码
@State count: number

2 模块层(共享状态)

ts 复制代码
class UserState {
  user: any
}

3 全局层(分布式状态)

ts 复制代码
await kvStore.put("user", user)

System 不应该有:

复制代码
任何 state 字段

五、System 的正确职责

1 编排逻辑

ts 复制代码
class OrderSystem {

  async createOrder(itemId: string) {
    const item = await productService.get(itemId)
    return await orderService.create(item)
  }

}

2 调度任务

ts 复制代码
await task.run()

3 聚合能力

ts 复制代码
await Promise.all([
  userService.getUser(),
  orderService.list()
])

System 是:

复制代码
"指挥者"

而不是:

复制代码
"存储者"

六、结合 Task / Agent 架构

在 AI / Task 模型下: System 更应该无状态

示例

ts 复制代码
class BuySystem {

  async run(params) {
    return await orderService.create(params.itemId)
  }

}

每次调用:

复制代码
都是独立的

七、一个错误 vs 正确案例

错误写法

ts 复制代码
class CartSystem {

  items: any[] = []

  add(item) {
    this.items.push(item)
  }

}

问题:

  • 状态不透明
  • 不可分布式
  • 不可恢复

正确写法

ts 复制代码
class CartSystem {

  async add(item) {
    const cart = await globalState.get("cart") || []
    cart.push(item)
    await globalState.set("cart", cart)
  }

}

状态:

复制代码
外部存储

八、System + 状态的正确关系

错误模型

复制代码
System 持有状态 错误

正确模型

复制代码
System 使用状态 正确

图示

复制代码
State → System → State

System:

复制代码
只做"变换"

九、为什么很多项目做不到

1 惯性思维

复制代码
写类 → 加属性 → 存数据

2 想"方便"

复制代码
先存在这里再说

3 不理解分布式

复制代码
以为是单机应用

结果:

复制代码
越写越乱

十、本质总结

如果用一句话总结:

System 应该是"纯函数式"的能力层。

对比:

维度 有状态 System 无状态 System
状态来源 内部 外部
可扩展性 差 强
分布式 困难 自然
可测试性 差 好

结语

很多鸿蒙项目后期难维护,本质原因是:

System 层承担了"它不该承担的责任"。

当你把 System 改成"无状态"之后,你会明显感受到:

  • 逻辑更清晰
  • 状态更可控
  • 分布式更容易
  • AI 更容易接入

记住一句话:

复制代码
状态是"数据"
System 是"函数"
相关推荐
传奇开心果编程1 小时前
中庸、有容、破执:仓颉编程语言的中华智慧结晶——三重哲学境界思辨
开发语言·华为·开源·软件工程
李游Leo1 小时前
HarmonyOS 7 文搜图实战 04:图片增删、索引重建与异常恢复完善 SnapSeek 可维护性【鸿蒙心迹】
harmonyos
三掌柜6665 小时前
# ArkWeb 手记 03|把 JSBridge 做成协议
harmonyos
轻口味6 小时前
HarmonyOS 7 新特性5:平行视界——轻视界文集的两栏阅读与窗口状态边界矩阵真机实测
华为·矩阵·harmonyos·鸿蒙·平行视界
动物园猫6 小时前
Compose Multiplatform 三方库 compose-icons(Octicons)的 OpenHarmony 鸿蒙化适配实战
华为·ar·harmonyos
旺仔Sec7 小时前
2026年江西省职业院校技能大赛鸿蒙应用开发赛项竞赛任务书(高职组)样题
华为·harmonyos
曲鸟7 小时前
体验完鸿蒙AI后的几点感受
人工智能·华为·harmonyos
HwJack207 小时前
【HarmonyOS开发小实践】Node-API 的SO 命名规则、多线程限制与调试
华为·harmonyos
LucianaiB7 小时前
用 HarmonyOS 做一张会写诗的月夜明信片:追月的完整开发复盘
华为·ai·harmonyos·skill
蒸鱼Yuzheng8 小时前
HarmonyOS HAP 与调试工件治理:包结构、版本身份与自动化证据链
自动化·性能测试·数据治理·harmonyos·hap