HarmonyOS掌上记账APP开发实践第53篇:领域组件设计模式:bill_base 与 asset_base 的领域驱动设计
053 — 领域组件设计模式bill_base 与 asset_base 的领域驱动设计简介在传统 MVC 架构中业务逻辑和 UI 代码往往混杂在一起导致代码难以复用和测试。MoneyTrack 引入了领域驱动设计DDD思想将核心业务逻辑抽取到领域基础包bill_base和asset_base中。这些基础包遵循无 UI 纯逻辑的原则只包含 Enums枚举、Types类型定义和 Models数据模型三部分不依赖任何 UI 框架。这种设计让同一套业务逻辑可以被不同 UI 组件复用也大幅简化了单元测试——测试领域包不需要搭建 UI 环境。核心知识点1. DDD 领域驱动设计DDD 将应用按业务领域拆分为独立的限界上下文bill_base账单位领域包含账单类型枚举、账单状态、收支类别、账单查询参数。asset_base资产领域包含资产类型、资产账户模型、货币类型、资产统计聚合。每个领域包自治管理自己的数据结构和业务规则彼此之间通过 common 层的共享基类如BaseEntity实现低耦合的跨领域引用。2. 领域包的三层结构每一个领域基础包都严格遵循 Enums / Types / Models 三层架构asset_baseEnums/AssetType.ets资产类型枚举Types/AssetFilter.ets资产筛选接口Types/AssetReport.ets资产报表类型Enums/CurrencyType.ets货币类型枚举Models/AssetModel.ets资产数据模型Models/AssetCalculator.ets资产计算器bill_baseEnums/BillType.ets账单类型枚举Types/BillQueryParams.ets查询参数接口Types/BillSummary.ets统计摘要类型Enums/BillStatus.ets账单状态枚举Enums/CategoryType.ets收支类别枚举Models/BillModel.ets账数据模型Models/BillValidator.ets账单校验器Enums 层定义领域内所有的枚举常量。例如BillType.EXPENSE表示支出、AssetType.CASH表示现金资产。Types 层定义 TypeScript 接口和类型别名用于跨模块的数据传递约定。例如BillQueryParams定义了账单列表的筛选条件接口。Models 层定义数据模型类包含数据验证、格式化、业务计算等纯方法不涉及任何 UI 渲染。3. 领域包与 UI 包的分离原则领域包与 UI 包的分离是 DDD 在鸿蒙工程中落地的核心原则领域包bill_base / asset_base纯 ArkTS 代码零 UI 依赖可独立编译和测试。UI 包bill_card / asset_card包含 Component 声明依赖 UI 框架引用领域包的数据类型。分离的好处当 UI 框架升级或替换时领域逻辑不受影响同一套领域逻辑可以同时服务于多个 UI 组件。4. 跨领域引用虽然每个领域包独立自治但在实际业务中账单与资产存在自然的关联。跨领域引用通过 common 层的共享基类实现// common/lib-utils/src/main/ets/BaseEntity.etsexportabstractclassBaseEntity{id:string;createdAt:string;updatedAt:string;abstractvalidate():boolean;}// bill_base/Models/BillModel.etsimport{BaseEntity}frommoneytrack/lib-utils;exportclassBillModelextendsBaseEntity{amount:number;categoryId:string;assetId:string;// 关联资产ID通过 ID 引用而非直接引用 AssetModelvalidate():boolean{returnthis.amount0!!this.categoryId;}}这里的关键原则是通过 ID 引用而非对象引用——BillModel 持有 assetId 字段指向资产但不直接持有 AssetModel 对象从而避免 bill_base 对 asset_base 的强依赖。项目代码案例Enums/Types/Models 三层完整代码框架Enums/BillType.etsexportenumBillType{EXPENSEexpense,INCOMEincome,TRANSFERtransfer}Types/BillQueryParams.etsexportinterfaceBillQueryParams{type?:BillType;startDate?:string;endDate?:string;categoryIds?:string[];minAmount?:number;maxAmount?:number;keyword?:string;}Models/BillValidator.ets业务校验逻辑exportclassBillValidator{staticvalidateAmount(amount:number):string|null{if(amount0)return金额必须大于零;if(amount99999999.99)return金额超出上限;if(!/^\d(\.\d{1,2})?$/.test(String(amount)))return金额格式错误最多两位小数;returnnull;}staticvalidateBill(bill:BillModel):string[]{consterrors:string[][];constamountErrorthis.validateAmount(bill.amount);if(amountError)errors.push(amountError);if(!bill.categoryId)errors.push(请选择收支类别);if(!bill.assetId)errors.push(请选择关联资产);returnerrors;}}asset_base/Models/AssetModel.etsexportclassAssetModel{id:string;name:string;type:AssetType;balance:number;currency:string;formatBalance():string{return¥${this.balance.toFixed(2)};}isOverdrawn():boolean{returnthis.balance0;}}领域驱动设计的核心价值在于业务逻辑独立于 UI 框架、可复用、可测试为后续 6 个 UI 组件包的开发提供了稳固的基础。推荐参考文档领域驱动设计DDD基础组件化架构设计模式ArkTS 面向对象编程指南

相关新闻

AI人才争夺战:硅谷巨头如何争夺顶级研究员

AI人才争夺战:硅谷巨头如何争夺顶级研究员

1. 硅谷人才争夺战背后的行业暗流那天下午,我正和团队在OpenAI的休息区讨论模型架构优化方案,突然看见扎克伯格端着碗热腾腾的越南河粉走进来。这个画面至今想来仍觉得魔幻——全球市值Top5的科技公司CEO,亲自端着食物来我们办公室挖人。更戏…

2026/7/23 3:14:14 阅读更多 →
AI编程实践:Anthropic如何重塑工程师工作模式

AI编程实践:Anthropic如何重塑工程师工作模式

1. Anthropic的AI编程实践与团队管理策略当Anthropic宣布其80%的代码由AI生成时,整个科技行业都在等待这家AI安全研究公司的裁员公告。但令人意外的是,这家公司不仅没有缩减团队规模,反而在持续扩大招聘。这种看似矛盾的现象背后,…

2026/7/23 17:46:11 阅读更多 →
GPT-5.2与Codex性能突破:技术解析与应用实践

GPT-5.2与Codex性能突破:技术解析与应用实践

1. GPT-5.2与Codex性能突破的技术解析 OpenAI最新发布的GPT-5.2和Codex模型在推理速度上实现了40%的提升,这一突破性进展主要源于三个关键技术革新: 1.1 推理堆栈的深度优化 OpenAI工程团队对模型推理过程进行了系统性重构,重点优化了以下环…

2026/7/23 14:37:36 阅读更多 →

最新新闻

软路由小白必看:OpenWRT旁路由在ESXi下的完整配置流程(含固件转换技巧)

软路由小白必看:OpenWRT旁路由在ESXi下的完整配置流程(含固件转换技巧)

软路由入门指南:ESXi虚拟机中部署OpenWRT旁路由的完整实践 对于刚接触软路由的新手来说,将OpenWRT配置为旁路由可能是最安全稳妥的入门方案。不同于直接替代主路由的高风险操作,旁路由模式允许你在保留原有网络结构的同时,逐步探索OpenWRT的强大功能。本文将手把手带你完成…

2026/7/23 19:40:11 阅读更多 →
SpringBoot22-@Conditional条件装配

SpringBoot22-@Conditional条件装配

一、解释 ConditionalConditional 的作用是:只有在满足某个条件时,才把这个 Bean 放进 Spring 容器里。不满足条件 → 不装配 满足条件 → 才装配你可以理解为:if (条件满足) {把这个 Bean 交给 Spring 管理 } else {不要管它 }1、例子你有一…

2026/7/23 19:40:11 阅读更多 →
SpringBoot18-集成Redis

SpringBoot18-集成Redis

一、SpringBoot集成Redis1-1、先理解:什么是 Redis?Redis 就是一个超快的数据库,但它专门存 数据在内存里(不是硬盘)。你可以把它想象成:一个超级快的“笔记本”,用来暂时记一些数据。 比如&…

2026/7/23 19:39:11 阅读更多 →
《手把手教你写一个生产级 K8s Operator:CRD + Controller + Webhook 全链路实践》

《手把手教你写一个生产级 K8s Operator:CRD + Controller + Webhook 全链路实践》

K8s Operator 控制器 进行深度全链路实践,增加以下生产级特性:并发协调控制(MaxConcurrentReconciles)事件记录(Event Recorder)最终一致性保证(Requeue 策略优化)子资源冲突处理&am…

2026/7/23 19:39:11 阅读更多 →
软路由玩家必看:在PVE7.3上实现iKuai+OpenWRT双路由+NAS+Win10的5个性能优化技巧

软路由玩家必看:在PVE7.3上实现iKuai+OpenWRT双路由+NAS+Win10的5个性能优化技巧

软路由性能调优实战:从J4125到PVE,榨干每一分硬件潜力的进阶指南 如果你已经成功在J4125小主机上部署了PVE,并搭建了iKuai主路由、OpenWRT旁路由、NAS乃至Windows 10的All-in-One系统,那么恭喜你,已经迈入了高阶玩家的行列。但搭建成功只是第一步,真正的挑战在于如何让这…

2026/7/23 19:39:11 阅读更多 →
厨卫翻新不搬家如何选择:牛牛快装等服务适用场景

厨卫翻新不搬家如何选择:牛牛快装等服务适用场景

厨卫翻新不搬家:如何理性选择“快与净”的局部改造服务在老旧小区的居住体验中,厨卫空间往往是痛点最集中的区域。水管老化、瓷砖空鼓、防水失效等问题直接影响日常生活品质。然而,传统装修伴随的噪音污染、粉尘飞扬以及漫长的工期&#xff0…

2026/7/23 19:39:11 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻