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 = ''              // 喂养技巧建议
}

这个数据模型的设计遵循了以下几个原则:

  1. 字段类型明确:所有字段都是stringstring[]类型,避免了ArkTS不支持的anyunknown类型
  2. 默认值初始化:所有字段在声明时都赋予了默认值,避免了ArkTS中不支持确定性赋值断言(let v!: T)的问题
  3. 构造函数冗余初始化:虽然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.resultDatathis.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() {
    // 结果展示内容
  }
}

showResultfalseresultDatanull时,整个结果区域不会出现在组件树中,这不仅节省了内存,还避免了空指针访问。

列表渲染用于展示喂养时间表和禁忌食物清单:

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层的设计要点:

  1. 单一职责generateData方法只负责数据生成,不涉及UI逻辑
  2. 依赖抽象:依赖AI宠物饮食计算Data类而非具体实现
  3. 可替换性:当接入真实AI API时,只需修改generateData方法内部实现,接口保持不变
  4. 类型安全:输入参数Record<string, Object>和返回类型AI宠物饮食计算Data都经过严格类型检查

2.5 异常处理策略

在"AI宠物饮食计算"应用中,我们设计了多层异常处理策略:

  1. 输入验证层:在Service层对输入参数进行基本验证,确保关键字段不为空
  2. 空安全处理:在UI层使用if (this.resultData !== null)进行空值检查
  3. 默认值兜底:Model类所有字段都有默认值,避免未初始化问题
  4. 类型转换安全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[])
  • anyunknown类型使用
  • 无索引签名使用
  • 编译通过
任务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.jsonsrc数组中添加页面路径

验收标准

  • 路径格式正确:"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 类型系统合规

审查项:禁止使用anyunknown类型

在我们的代码中,输入参数使用了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个空格
  • 花括号前后有空格
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐