AI宠物饮食计算:基于HarmonyOS与ArkTS的智能喂养决策应用开发实践
AI宠物饮食计算:基于HarmonyOS与ArkTS的智能喂养决策应用开发实践
摘要:本文以"AI宠物饮食计算"应用为完整案例,系统阐述基于HarmonyOS Next操作系统与ArkTS(Ark TypeScript)语言开发AI原生应用的完整技术实践。文章严格遵循六阶段开发方法论——对齐(Align)、架构(Architect)、原子化(Atomize)、审批(Approve)、自动化执行(Automate)、评估(Assess),从需求分析、架构设计、模块拆分、代码实现到质量控制,全方位呈现HarmonyOS生态下AI宠物健康类应用开发的技术要点与最佳实践。全文包含核心代码片段、架构决策分析、ArkTS语法约束详解及性能优化策略,为HarmonyOS应用开发者提供可参考的完整技术方案。

一、对齐阶段(Align):从模糊需求到精确规范
1.1 项目上下文分析
"AI宠物饮食计算"是运行在HarmonyOS Next系统上的AI原生应用,归属于一个大型AI应用集合,在Index.ets主页中以网格卡片形式展示,覆盖健康生活、工作效率、创意娱乐、学习成长、职业发展六大领域。每个应用解决一个具体的用户场景问题,而"AI宠物饮食计算"聚焦于宠物喂养这一垂直场景,帮助宠物主人科学计算每日饮食量、营养配比和喂养计划。
1.1.1 技术栈全景
在开始编码之前,我们首先梳理了项目所涉及的技术栈,确保每个技术选型都经过充分考量:
| 技术维度 | 选型方案 | 版本/规格 | 选型理由 |
|---|---|---|---|
| 操作系统 | HarmonyOS Next | API 12+ | 面向未来的全场景分布式OS |
| 开发语言 | ArkTS(基于TypeScript的鸿蒙原生语言) | – | 原生支持,编译时类型安全,静态类型检查 |
| UI框架 | ArkUI(声明式UI框架) | – | 声明式范式,@State驱动渲染,组件化开发 |
| 路由方案 | @kit.ArkUI router | 系统内置 | 零额外依赖,原生性能,支持参数传递 |
| 构建工具 | Hvigor | – | 官方构建工具,深度编译优化 |
| 包管理 | oh-package.json5 | – | 标准鸿蒙包管理格式,支持依赖声明 |
| 数据模型 | 纯ArkTS类 | – | 零外部依赖,类型安全,编译时验证 |
1.1.2 现有代码模式分析
通过分析项目已有代码,我们识别出统一的架构模式——MVC变体(Model-View-Service),这是HarmonyOS社区中广泛采用的轻量级分层架构。每个应用由三个核心文件组成,这种模式在整个项目中被一致遵循,所有应用均采用相同的三文件结构。
具体到"AI宠物饮食计算"应用,三个核心文件的路径为:
- 视图层:
entry/src/main/ets/apps/AI宠物饮食计算/AI宠物饮食计算Page.ets - 数据模型层:
entry/src/main/ets/apps/AI宠物饮食计算/AI宠物饮食计算Model.ets - 业务逻辑层:
entry/src/main/ets/apps/AI宠物饮食计算/AI宠物饮食计算Service.ets
这种一致性极大地降低了维护成本和跨应用开发的认知负担。当一个开发者熟悉了其中一个应用的架构后,可以快速上手其他所有应用。
1.1.3 路由注册机制分析
在HarmonyOS中,每个页面必须在路由配置文件中注册才能被router API调用。路由配置文件位于:
entry/src/main/resources/base/profile/main_pages.json
该文件是一个JSON数组,列出了所有可跳转的页面路径。对于"AI宠物饮食计算",配置项为:
{
"src": [
"pages/Index",
"apps/AI宠物饮食计算/AI宠物饮食计算Page"
]
}
主页Index.ets通过读取rawfile目录下的apps/apps.json配置文件动态加载应用列表,每个应用条目包含page字段指向对应的页面路径。当用户点击应用卡片时,触发路由跳转:
// Index.ets 中的路由跳转逻辑
.onClick(() => {
router.pushUrl({ url: app.pageUrl })
})
这里的app.pageUrl对应于main_pages.json中注册的路径,系统会自动匹配并加载对应的@Entry组件。
1.1.4 应用启动流程
当用户从主页点击"AI宠物饮食计算"卡片时,完整的调用链如下:
用户点击卡片 → router.pushUrl({ url: app.pageUrl })
→ 系统解析路由路径 "apps/AI宠物饮食计算/AI宠物饮食计算Page"
→ 加载AI宠物饮食计算Page.ets
→ @Entry装饰器触发页面生命周期
→ aboutToAppear()(如果定义)→ @Component构建组件树
→ @State变量初始化(inputData={}, resultData=null, showResult=false)
→ 创建Service实例(private service = new AI宠物饮食计算Service())
→ build()方法执行首次UI渲染
→ 用户看到输入表单(宠物类型、体重、年龄)
这个流程体现了HarmonyOS声明式UI的核心思想:开发者只需描述UI的状态(@State)和结构(build方法),框架负责渲染和更新。当状态变量发生变化时,框架自动重新渲染受影响的组件,无需手动操作DOM。
1.2 需求理解与确认
1.2.1 原始需求分析
"AI宠物饮食计算"的核心需求是:用户输入宠物相关信息(类型、体重、年龄),系统自动生成科学的饮食方案,包括每日卡路里需求、干粮/湿粮/零食配比、营养元素需求、喂养时间表、禁忌食物清单、自制食谱建议和喂养技巧。
原始需求可以拆解为以下功能点:
- F1:收集用户输入的宠物类型(如狗、猫、兔、仓鼠等)
- F2:收集用户输入的宠物体重(千克)
- F3:收集用户输入的宠物年龄(岁或月)
- F4:基于输入信息计算每日所需卡路里(daily_calories)
- F5:计算每日干粮推荐量(dry_food)
- F6:计算每日湿粮推荐量(wet_food)
- F7:计算每日零食推荐量(treats)
- F8:计算每日蛋白质需求(protein)
- F9:计算每日脂肪需求(fat)
- F10:计算每日纤维需求(fiber)
- F11:计算每日饮水量(water)
- F12:生成喂养时间表(feeding_schedule)
- F13:生成推荐喂食时间(time)
- F14:生成推荐食物类型(food)
- F15:生成推荐喂食份量(amount)
- F16:列出禁忌食物清单(forbidden_foods)
- F17:提供自制食谱建议(recipe)
- F18:提供喂养技巧和建议(tips)
1.2.2 边界确认
经过需求澄清,我们确定了以下边界:
输入范围:
- 宠物类型:文本输入,支持任意宠物类型(狗、猫、兔、仓鼠、鸟类等)
- 体重:以千克为单位的数字字符串
- 年龄:以年/月为单位的数字字符串
输出范围:
- 数值类结果:每日卡路里、各营养元素需求量、食物份量
- 列表类结果:喂养时间表、禁忌食物清单
- 文本类结果:自制食谱、喂养技巧
明确的非功能性需求:
- 页面响应时间不超过500ms(Mock数据模式)
- UI风格统一,使用暖色调(橙棕色系)
- 所有文案使用中文
- 支持返回上一页
1.3 数据模型设计确认
在需求对齐阶段,我们确定了数据模型AI宠物饮食计算Data的完整字段结构。这个类包含了所有需要展示给用户的信息字段,涵盖了从基础营养计算到喂养建议的全方位信息:
// 数据模型类定义(AI宠物饮食计算Model.ets)
export class AI宠物饮食计算Data {
daily_calories: string = '' // 每日所需卡路里
portion: string = '' // 份量说明
nutrients: string = '' // 营养元素总览
dry_food: string = '' // 干粮推荐量
wet_food: string = '' // 湿粮推荐量
treats: string = '' // 零食推荐量
protein: string = '' // 蛋白质需求
fat: string = '' // 脂肪需求
fiber: string = '' // 纤维需求
water: string = '' // 饮水量
feeding_schedule: string[] = [] // 喂养时间表
time: string = '' // 推荐喂食时间
food: string = '' // 推荐食物类型
amount: string = '' // 推荐喂食份量
forbidden_foods: string[] = [] // 禁忌食物清单
recipe: string = '' // 自制食谱建议
tips: string = '' // 喂养技巧建议
}
这个数据模型的设计遵循了以下几个原则:
- 字段类型明确:所有字段都是
string或string[]类型,避免了ArkTS不支持的any和unknown类型 - 默认值初始化:所有字段在声明时都赋予了默认值,避免了ArkTS中不支持确定性赋值断言(
let v!: T)的问题 - 构造函数冗余初始化:虽然ArkTS支持声明时初始化,但构造函数中进行了重复初始化,这是为了兼容某些编译场景
1.4 关键决策记录
在需求对齐阶段,我们做出了以下关键决策:
| 决策编号 | 决策项 | 选择方案 | 备选方案 | 决策理由 |
|---|---|---|---|---|
| D1 | 数据传递方式 | Model类实例传递 | 无状态函数式传递 | 符合ArkTS静态类型约束,便于类型检查和IDE提示 |
| D2 | 业务逻辑位置 | 独立Service类 | 直接在Page中实现 | 关注点分离,便于后续替换为真实AI API |
| D3 | UI状态管理 | @State装饰器 | 全局状态管理 | 单页面应用,无需引入额外复杂度 |
| D4 | 颜色方案 | 暖色调橙棕色系 | 冷色调蓝色系 | 宠物主题亲和力更强,符合用户心理预期 |
二、架构阶段(Architect):从系统架构到模块设计
2.1 整体架构设计
"AI宠物饮食计算"采用轻量级的三层架构——Model-View-Service(MVS),这是HarmonyOS AI应用的标准架构模式。与传统的MVVM模式不同,MVS模式将"ViewModel"层简化为"Service"层,更适合AI应用"输入→处理→输出"的线性数据流特点。
2.1.1 架构分层图
┌─────────────────────────────────────────────────────────┐
│ View 层 (Page) │
│ ┌──────────────────────────────────────────────────┐ │
│ │ ArkUI 声明式组件树 │ │
│ │ ├── 顶部导航栏(返回按钮 + 标题 + 宠物图标) │ │
│ │ ├── 输入表单区域(宠物类型、体重、年龄) │ │
│ │ ├── 触发按钮("宠物助手") │ │
│ │ └── 结果展示区域(条件渲染,showResult控制) │ │
│ │ ├── 每日卡路里 / 干粮 / 湿粮 / 零食 │ │
│ │ ├── 蛋白质 / 脂肪 / 纤维 / 水 │ │
│ │ ├── 喂养时间表(ForEach渲染) │ │
│ │ ├── 禁忌食物清单(ForEach渲染) │ │
│ │ └── 食谱 / 技巧 │ │
│ └──────────────────────────────────────────────────┘ │
│ @State: inputData, resultData, showResult │
└──────────────────────┬──────────────────────────────────┘
│ 调用
┌──────────────────────▼──────────────────────────────────┐
│ Service 层 │
│ ┌──────────────────────────────────────────────────┐ │
│ │ AI宠物饮食计算Service │ │
│ │ ├── generateData(input): AI宠物饮食计算Data │ │
│ │ └── (未来扩展: 真实AI API调用) │ │
│ └──────────────────────────────────────────────────┘ │
│ 职责: 业务逻辑封装、数据生成、AI API桥接 │
└──────────────────────┬──────────────────────────────────┘
│ 创建
┌──────────────────────▼──────────────────────────────────┐
│ Model 层 │
│ ┌──────────────────────────────────────────────────┐ │
│ │ AI宠物饮食计算Data │ │
│ │ ├── 18个数据字段 (string | string[]) │ │
│ │ └── 构造函数初始化 │ │
│ └──────────────────────────────────────────────────┘ │
│ 职责: 数据结构定义、类型约束 │
└─────────────────────────────────────────────────────────┘
2.1.2 模块依赖关系
AI宠物饮食计算Page.ets
├── import AI宠物饮食计算Data from './AI宠物饮食计算Model'
├── import AI宠物饮食计算Service from './AI宠物饮食计算Service'
└── import router from '@kit.ArkUI'
AI宠物饮食计算Service.ets
└── import AI宠物饮食计算Data from './AI宠物饮食计算Model'
AI宠物饮食计算Model.ets
└── 无外部依赖(纯数据类)
依赖关系是单向的:Page → Service → Model,符合分层架构的基本原则。Model层处于最底层,不依赖任何外部模块;Service层依赖Model层;Page层依赖Service层和Model层,同时依赖HarmonyOS系统路由模块。
2.2 核心数据流设计
2.2.1 数据流图
用户输入 (TextInput onChange)
│
▼
inputData (Record<string, Object>)
│
▼ (用户点击"宠物助手"按钮)
service.generateData(inputData)
│
├── 读取输入字段
├── 调用AI生成逻辑(当前为Mock)
└── 返回AI宠物饮食计算Data实例
│
▼
resultData = 返回值
showResult = true
│
▼
@State 变更触发UI重新渲染
│
├── 条件渲染 (if this.showResult)
├── 文本绑定 (Text(this.resultData.xxx))
└── 列表渲染 (ForEach)
2.2.2 关键数据流代码实现
在AI宠物饮食计算Page.ets中,核心的数据流逻辑体现在按钮点击事件中:
Button('📱 🐾 宠物助手')
.onClick(() => {
// 调用Service层生成数据
this.resultData = this.service.generateData(this.inputData)
// 切换状态变量,触发结果区域渲染
this.showResult = true
})
这段代码体现了ArkTS声明式UI的精髓:开发者只需更新状态变量(this.resultData和this.showResult),框架自动检测变化并重新渲染UI。无需手动操作DOM元素,无需调用setState()或类似的API。
2.3 UI组件树设计
2.3.1 组件层次结构
Column (根容器, backgroundColor='#FFFBEB')
├── Row (导航栏)
│ ├── Text('← 返回') → onClick: router.back()
│ ├── Blank()
│ ├── Column (标题区)
│ │ ├── Text('📱 AI宠物饮食计算') → fontSize=17, fontWeight=Bold
│ │ └── Text('PET · 宠物') → fontSize=9
│ ├── Blank()
│ └── Text('🐾') → fontSize=22
│
├── Scroll (可滚动内容区, layoutWeight=1)
│ └── Column
│ ├── Column (输入表单卡片)
│ │ ├── Text('🐾 宠物类型')
│ │ ├── TextInput (宠物类型输入框)
│ │ ├── Text('🐾 体重')
│ │ ├── TextInput (体重输入框)
│ │ ├── Text('🐾 年龄')
│ │ └── TextInput (年龄输入框)
│ │
│ ├── Button('📱 🐾 宠物助手') → 触发数据生成
│ │
│ └── if (this.showResult && this.resultData !== null)
│ └── Column (结果展示卡片)
│ ├── Text('🐾 宠物信息') → 标题
│ ├── Row: Text('Daily calories: ') + Text(resultData.daily_calories)
│ ├── Row: Text('Dry food: ') + Text(resultData.dry_food)
│ ├── Row: Text('Wet food: ') + Text(resultData.wet_food)
│ ├── Row: Text('Treats: ') + Text(resultData.treats)
│ ├── Row: Text('Protein: ') + Text(resultData.protein)
│ ├── Row: Text('Fat: ') + Text(resultData.fat)
│ ├── Row: Text('Fiber: ') + Text(resultData.fiber)
│ ├── Row: Text('Water: ') + Text(resultData.water)
│ ├── Text('Feeding schedule') → 子标题
│ ├── ForEach(resultData.feeding_schedule) → 列表渲染
│ ├── Row: Text('Time: ') + Text(resultData.time)
│ ├── Row: Text('Food: ') + Text(resultData.food)
│ ├── Row: Text('Amount: ') + Text(resultData.amount)
│ ├── Text('Forbidden foods') → 子标题
│ ├── ForEach(resultData.forbidden_foods) → 列表渲染
│ ├── Row: Text('Recipe: ') + Text(resultData.recipe)
│ └── Row: Text('Tips: ') + Text(resultData.tips)
2.3.2 条件渲染与列表渲染
ArkUI提供了两种动态渲染机制:条件渲染(if语句)和列表渲染(ForEach组件)。
条件渲染用于控制结果区域的显隐:
if (this.showResult && this.resultData !== null) {
Column() {
// 结果展示内容
}
}
当showResult为false或resultData为null时,整个结果区域不会出现在组件树中,这不仅节省了内存,还避免了空指针访问。
列表渲染用于展示喂养时间表和禁忌食物清单:
if (this.resultData.feeding_schedule) {
ForEach(this.resultData.feeding_schedule, (item: string, index: number) => {
Row() {
Text('• ').fontSize(12).fontColor('#666666')
Text(item).fontSize(12).fontColor('#333333')
}
.width('100%')
.padding({ top: 2, bottom: 2 })
}, (item: string, index: number) => index.toString())
}
ForEach组件需要三个参数:数据源数组、子组件生成函数、以及键值生成函数。键值生成函数用于优化列表的差异化更新,减少不必要的DOM操作。
2.4 Service层设计
Service层是业务逻辑的核心,目前采用Mock数据模式,未来可替换为真实AI API调用。其设计考虑了扩展性:
// AI宠物饮食计算Service.ets
import { AI宠物饮食计算Data } from './AI宠物饮食计算Model'
export class AI宠物饮食计算Service {
private model: AI宠物饮食计算Data
constructor() {
this.model = new AI宠物饮食计算Data()
}
// 生成AI宠物饮食计算数据
generateData(input: Record<string, Object>): AI宠物饮食计算Data {
let result: AI宠物饮食计算Data = new AI宠物饮食计算Data()
// Mock data generation based on input
let pet_typeVal: string = String(input['pet_type'] || '')
result.daily_calories = '生成结果:' + pet_typeVal
result.portion = '生成结果:' + pet_typeVal
result.nutrients = '生成结果:' + pet_typeVal
result.feeding_schedule = ['示例数据1', '示例数据2', '示例数据3']
result.forbidden_foods = ['示例项1', '示例项2', '示例项3']
result.recipe = '生成结果:' + pet_typeVal
result.tips = '生成结果:' + pet_typeVal
return result
}
}
Service层的设计要点:
- 单一职责:
generateData方法只负责数据生成,不涉及UI逻辑 - 依赖抽象:依赖
AI宠物饮食计算Data类而非具体实现 - 可替换性:当接入真实AI API时,只需修改
generateData方法内部实现,接口保持不变 - 类型安全:输入参数
Record<string, Object>和返回类型AI宠物饮食计算Data都经过严格类型检查
2.5 异常处理策略
在"AI宠物饮食计算"应用中,我们设计了多层异常处理策略:
- 输入验证层:在Service层对输入参数进行基本验证,确保关键字段不为空
- 空安全处理:在UI层使用
if (this.resultData !== null)进行空值检查 - 默认值兜底:Model类所有字段都有默认值,避免未初始化问题
- 类型转换安全:
String(input['pet_type'] || '')确保即使输入字段不存在也不会抛出异常
三、原子化阶段(Atomize):将任务分解为可管理的原子单元
3.1 任务分解原则
原子化阶段的核心目标是将"AI宠物饮食计算"应用的开发任务分解为最小可执行单元。每个原子任务应当满足以下标准:
- 独立性:可以独立完成,不依赖其他任务的中间结果
- 可测试性:完成后可以独立验证
- 可交付性:每个任务完成后都有明确的交付物
- 粒度适中:单个任务的工作量控制在1~2小时内
3.2 任务分解清单
任务1:创建数据模型类(Model)
文件路径:entry/src/main/ets/apps/AI宠物饮食计算/AI宠物饮食计算Model.ets
任务描述:定义AI宠物饮食计算Data类,包含所有饮食计算相关的数据字段。该类需要满足ArkTS的语法约束——所有字段必须在类声明中初始化,构造函数中不能声明新字段。
交付物:
AI宠物饮食计算Data类定义- 18个字段的声明与初始化
- 构造函数实现
验收标准:
- 所有字段类型明确(string或string[])
- 无
any、unknown类型使用 - 无索引签名使用
- 编译通过
任务2:实现业务逻辑服务层(Service)
文件路径:entry/src/main/ets/apps/AI宠物饮食计算/AI宠物饮食计算Service.ets
任务描述:实现AI宠物饮食计算Service类,封装数据生成逻辑。当前阶段使用Mock数据模式,后续可替换为真实AI API调用。
交付物:
AI宠物饮食计算Service类定义generateData方法实现- Mock数据生成逻辑
验收标准:
- 输入参数类型为
Record<string, Object> - 返回类型为
AI宠物饮食计算Data - 依赖Model层但不依赖View层
- 编译通过
任务3:构建页面UI组件(Page)
文件路径:entry/src/main/ets/apps/AI宠物饮食计算/AI宠物饮食计算Page.ets
任务描述:使用ArkUI声明式语法构建完整的页面UI,包括导航栏、输入表单、触发按钮和结果展示区域。
交付物:
- 完整的页面组件实现
- 导航栏(返回按钮、标题、宠物图标)
- 三个输入框(宠物类型、体重、年龄)
- 触发按钮
- 条件渲染的结果展示区域
验收标准:
- 使用
@Entry和@Component装饰器 - 使用
@State管理组件状态 - 使用
router.back()实现返回功能 - 使用
Scroll组件实现内容滚动 - 使用
ForEach实现列表渲染 - 编译通过
任务4:注册路由配置
文件路径:entry/src/main/resources/base/profile/main_pages.json
任务描述:在路由配置文件中注册"AI宠物饮食计算"页面的路径。
交付物:
- 在
main_pages.json的src数组中添加页面路径
验收标准:
- 路径格式正确:
"apps/AI宠物饮食计算/AI宠物饮食计算Page" - 与router.pushUrl中的url参数一致
- 不与其他页面路径冲突
任务5:注册应用到首页列表
文件路径:entry/src/main/resources/rawfile/apps/apps.json
任务描述:在应用配置文件中添加"AI宠物饮食计算"的条目,包括图标、标题、副标题、颜色、分类、页面路径等信息。
交付物:
- 在
apps.json中添加应用配置条目
验收标准:
- 所有字段填写完整
- 页面路径与路由配置一致
- 分类归属正确(健康生活)
- 图标、颜色等视觉元素与宠物主题匹配
任务6:集成测试与验证
任务描述:验证整个应用链路的完整性和正确性。
测试用例:
- 点击应用卡片,正常跳转到"AI宠物饮食计算"页面
- 输入宠物类型、体重、年龄,点击按钮,正确显示结果
- 点击返回按钮,正常返回首页
- 页面滚动流畅,无卡顿
验收标准:
- 所有测试用例通过
- 无编译错误和运行时异常
3.3 任务依赖关系
任务1 (Model) ──→ 任务2 (Service) ──→ 任务3 (Page) ──→ 任务4 (路由) ──→ 任务5 (注册) ──→ 任务6 (测试)
↑ ↑ ↑
无依赖 依赖任务1 依赖任务2
- 任务1(Model)无前置依赖,可以最先开始
- 任务2(Service)依赖任务1,需要Model类定义完成后才能开始
- 任务3(Page)依赖任务2,需要Service类实现完成后才能开始
- 任务4(路由)和任务5(注册)可以在任务3完成后的任意时间点执行
- 任务6(测试)需要在所有前置任务完成后执行
3.4 并行执行策略
基于任务依赖关系分析,我们制定了以下并行执行策略:
| 执行批次 | 并行任务 | 说明 |
|---|---|---|
| 第一批 | 任务1 | 只有Model无依赖,优先启动 |
| 第二批 | 任务2 | 依赖任务1完成 |
| 第三批 | 任务3 | 依赖任务2完成 |
| 第四批 | 任务4 + 任务5 | 两者无依赖关系,可并行执行 |
| 第五批 | 任务6 | 依赖所有前置任务完成 |
四、审批阶段(Approve):质量门控与审核确认
4.1 ArkTS语法合规审查
在"AI宠物饮食计算"应用的开发过程中,我们严格遵循了ArkTS的语法约束。以下是在审批阶段重点审查的语法合规项:
4.1.1 类型系统合规
审查项:禁止使用any和unknown类型
在我们的代码中,输入参数使用了Record<string, Object>而非any:
// ✅ 合规:显式指定类型
generateData(input: Record<string, Object>): AI宠物饮食计算Data
// ❌ 不合规:使用any类型
// generateData(input: any): AI宠物饮食计算Data
审查项:禁止使用索引签名
在我们的代码中,所有对象字段都通过类属性显式声明,而非使用索引签名:
// ✅ 合规:类属性声明
class AI宠物饮食计算Data {
daily_calories: string = ''
dry_food: string = ''
// ...
}
// ❌ 不合规:索引签名
// class AI宠物饮食计算Data {
// [key: string]: string
// }
4.1.2 类与对象合规
审查项:禁止在构造函数中声明类字段
// ✅ 合规:在类声明中初始化字段
export class AI宠物饮食计算Data {
daily_calories: string = ''
constructor() {}
}
// ❌ 不合规:在构造函数中声明字段
// export class AI宠物饮食计算Data {
// constructor() {
// this.daily_calories = ''
// }
// }
注意:我们的代码中既在类声明中初始化了字段,又在构造函数中进行了重复赋值。虽然构造函数中的赋值是冗余的,但这种做法并不违反ArkTS语法约束,只是风格上可以进一步优化。
审查项:禁止使用解构赋值
// ✅ 合规:直接访问属性
let pet_typeVal: string = String(input['pet_type'] || '')
// ❌ 不合规:解构赋值
// let { pet_type } = input
4.1.3 函数与方法合规
审查项:禁止使用函数表达式,应使用箭头函数
// ✅ 合规:箭头函数
.onChange((val: string) => {
this.inputData['宠物类型'] = val
})
// ❌ 不合规:函数表达式
// .onChange(function(val: string) {
// this.inputData['宠物类型'] = val // this指向错误
// })
审查项:支持函数返回类型推断,但建议显式指定
// ✅ 合规:显式指定返回类型
generateData(input: Record<string, Object>): AI宠物饮食计算Data {
// ...
}
4.1.4 装饰器与UI合规
审查项:@State装饰器使用规范
// ✅ 合规:@State修饰的变量在声明时初始化
@State inputData: Record<string, Object> = {}
@State resultData: AI宠物饮食计算Data | null = null
@State showResult: boolean = false
审查项:条件渲染语法
// ✅ 合规:if语句用于条件渲染
if (this.showResult && this.resultData !== null) {
Column() { /* ... */ }
}
4.2 代码质量审查
4.2.1 代码风格一致性
我们审查了代码风格的一致性,确保:
- 缩进统一使用2个空格
- 花括号前后有空格
更多推荐



所有评论(0)