HarmonyOS应用开发:三层工程架构

引言

在HarmonyOS应用开发过程中,随着项目规模的增长,代码的组织结构显得尤为重要。
DevEco Studio创建出的默认工程仅包含一个entry类型的模块,如果直接使用平级目录进行模块管理,工程逻辑结构较混乱且模块间的一栏关系不够清晰,不利于多人开发及维护。

本文将介绍一种经过实践验证的三层工程架构方案,帮助开发者构建清晰、可维护、可扩展的HarmonyOS应用工程结构。

在这里插入图片描述

三层工程架构设计

在这里插入图片描述

1. commons(公共能力层)

用于存放公共基础能力集合(如工具库、公共配置等)。commons层可编译成一个或多个HAR包或HSP包,只可以被products和features依赖,不可以反向依赖。

定位:公共基础能力集合,是整个应用的基石

职责

  • 提供工具类和工具方法(网络请求、存储、日志等)
  • 定义公共配置和常量
  • 封装基础UI组件
  • 提供通用业务逻辑封装

编译形式:HAR包或HSP包

依赖规则

  • 只可以被products和features层依赖
  • 不可以反向依赖其他层
  • 不可以依赖products层

目录示例
在这里插入图片描述

2. features(基础特性层)

用于存放基础特性集合(如应用中相对独立的各个功能的UI及业务逻辑实现等)。各个feature高内聚、低耦合、可定制,供产品灵活部署。不需要单独部署的feature通常编译为HAR包或HSP包,供products或其它feature使用。需要单独部署的feature通常编译为Feature类型的HAP包,和products下Entry类型的HAP包进行组合部署。features层可以横向调用及依赖common层,同时可以被products层不同设备形态的HAP所依赖,但是不能反向依赖products层。

定位:基础特性集合,包含应用中相对独立的功能模块

职责

  • 实现具体的业务功能模块
  • 提供高内聚、低耦合的特性实现
  • 支持可定制和灵活部署

编译形式

  • 不需要单独部署的feature:HAR包或HSP包
  • 需要单独部署的feature:Feature类型的HAP包

依赖规则

  • 可以横向调用及依赖commons层
  • 可以被products层不同设备形态的HAP所依赖
  • 不能反向依赖products层
  • features之间可以有限度的横向调用

目录示例

在这里插入图片描述

3. products(产品定制层)

用于针对不同设备形态进行功能和特性集成。products层各个子目录各自编译为一个Entry类型的HAP包,作为应用主入口。products层不可以横向调用。

定位:针对不同设备形态进行功能和特性集成

职责

  • 作为应用主入口
  • 集成features层的各个功能模块
  • 针对不同设备进行UI适配和功能定制

编译形式:Entry类型的HAP包

依赖规则

  • 可以依赖commons层和features层
  • 不可以横向调用其他product模块
  • 不可以被其他层反向依赖

目录示例
在这里插入图片描述

工程目录迁移

根据三层工程架构示意图配置工程目录

步骤一:

根据第二节的三层工程架构示意图,首先在工程目录Project下,创建三个文件夹commons、features、products。
在这里插入图片描述

步骤二:

在features目录下创建三个模块,分别是quickstart、map、learning
在这里插入图片描述

步骤三:

创建commons层模块,与创建features层的模块一样,在commons文件夹中,创建两个模块utils和uicomponents,创建时同样选择Static Library,这两个模块存放一些公用的工具或者ui组件,在需要用到时使用

步骤四:

将entry模块放入products层,products层主要根据产品定制层内结构,这里我们需要将工程名改成default,通过右键选择refactor-> rename,选择Rename module

原工程迁移至quickstart模块

步骤1:

原来entry模块中的功能,都只是quickstart模块对应的功能,需要将entry对应的文件复制到quickstart模块中

步骤2:

将quickstart模块中的默认生成的components文件夹删除,其他模块也建议一并删除默认内容,需要使用时再根据具体的目录结构进行创建。

步骤3:

同时需要删除对应模块内Index.ets文件里面的导出声明export语句,因为对应的MainPage已经被删除。

步骤4:

将default模块中pages、model、util、view移入quickstart模块的ets目录中

步骤5:

将default模块中rawfile移入quickstart模块的resources资源目录中

products层配置修改

步骤1:

接下来需要对文件结构进行调整,由于default内的pages移走,需要重新创建一个pages目录,用于应用的根页面,并新建一个page页面

步骤2:

在pages中右键新建一个empty page并命名为Index

步骤3:

此时自动在main_page.json中自动生成一个页面配置pages/Index,由于默认工程初始包含了Index页面(之前移入了quickstart模块中),在这里需要删除重复的页面配置。

products层引用quickstart模块

步骤1:

在quickstart模块中,找到Index.ets,并修改名称为QuickStartPage,同时需要删除页面上的@Entry标识

步骤2:

为了让其他模块能够引用到这个组件,还需要使用export导出这个组件

步骤3:

在quickstart模块中,根目录下找到Index.ets,这个文件的作用是统一导出该模块内,需要导出的UI组件或者类等内容
在Index.ets中导出QuickStartPage,这样其他模块就能够访问到quickstart模块中的组件

步骤4:

回到default模块中,这个模块是整个工程的顶级模块,其依赖底下的features层内模块,现在可以配置依赖,让其可以使用quickstart内的组件并展示
在default模块的oh-package.json5文件中,写入以下依赖内容,这里需要注意不是工程级别的oh-package.json,需要先找到default模块
在oh-package.json5文件中,dependencies中写入对quickstart模块的依赖,因为后续还会使用map和learning模块的内容,这里一并配置好依赖,方便后续使用。

步骤5:

配置完后,会提示需要安装依赖,可以通过Run "ohpm install"执行安装过程。

步骤6:

在default模块中的pages/Index.ets中,清除build函数内默认的内容

步骤7:

在Index中引入QuickStartPage,并且在build方法中新增Column组件,在Column中使用QuickStartPage展示快速入门的内容。

总结

三层工程架构为HarmonyOS应用开发提供了清晰、可维护、可扩展的工程组织方案。通过将应用划分为commons、features、products三个层次,不仅解决了传统单层结构的各种问题,还为团队协作、功能扩展和多设备适配提供了良好的基础。

在实际项目中,建议根据具体业务需求和团队规模适当调整架构细节,但保持层次清晰和依赖规范的原则不变。这种架构模式尤其适合中大型HarmonyOS应用项目的开发,能够显著提高开发效率和代码质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95814.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

phpMyAdmin文件包含漏洞复现:原理详解+环境搭建+渗透实战(windows CVE-2018-12613)

目录 一、CVE-2018-12613漏洞 1、漏洞简介 2、漏洞原理 (1)漏洞触发点与正常逻辑 (2)过滤逻辑缺陷与绕过方式 二、渗透准备 1、访问phpmyadmin靶场 2、登录phpmyadmin 3、获取session文件位置 三、渗透准备 1、读取敏感…

Jakarta EE(基于 JPA)在 IntelliJ IDEA 中开发简单留言板应用的实验指导

Jakarta EE(基于 JPA)在 IntelliJ IDEA 中开发简单留言板应用的实验指导摘要:Jakarta EE 并不仅限于使用 H2 数据库,它支持任何符合 JDBC 或 JPA 标准的数据库,例如 MySQL、PostgreSQL、Oracle 等。H2 通常用于开发测试…

Gitea:轻量级的自托管Git服务

欢迎光临我的个人博客查看最新文章:rivers blog 在当今的软件开发世界中,代码托管平台是必不可少的工具。而对于寻求自主控制和数据隐私的团队与开发者来说,Gitea提供了一个完美的解决方案。 1、 Gitea简介 Gitea(发音为ɡɪˈti…

深度学习-----简单入门卷积神经网络CNN的全流程

(一)卷积神经网络(CNN)的核心思想传统全连接网络的缺陷图像平铺展开后,旋转或位置变化会导致输入差异大,难以识别举例:手写数字“8”在不同位置或旋转后的识别困难(图像在计算机中是…

Scikit-learn Python机器学习 - 特征降维 压缩数据 - 特征选择 - 单变量特征选择 SelectKBest - 选择Top K个特征

锋哥原创的Scikit-learn Python机器学习视频教程: 2026版 Scikit-learn Python机器学习 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 课程介绍 本课程主要讲解基于Scikit-learn的Python机器学习知识,包括机器学习概述,特征工程(数据…

Datawhale AI夏令营复盘[特殊字符]:我如何用一个Prompt,在Coze Space上“画”出一个商业级网页?

文章摘要 本文详细记录了我在Datawhale AI夏令营期间,如何另辟蹊径,使用Coze(扣子空间)和精心设计的Prompt,从零开始构建一个专业的“智能SEO Agent”产品网页的完整过程。文章将完整展示我编写的“万字”级Prompt&…

SVN和Git两种版本管理系统对比

一、SVN(Subversion)简介SVN是一种集中式版本控制系统。它有一个中心仓库(repository),所有的代码变更都记录在这个中心仓库中。每个开发者从中心仓库检出(checkout)代码到本地工作副本&#xf…

【机器学习】综合实训(一)

项目一 鸢尾花分类该项目需要下载scikit-learn库,下载指令如下:pip install scikit-learn快速入门示例:鸢尾花分类# 导入必要模块 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklea…

vulhub通关笔记1—docker unauthorized-rce

1.docker unauthorized-rce 基本情况 docker swarm是一个将docker集群变成单一虚拟的docker host工具,使用标准的Docker API,能够方便docker集群的管理和扩展,由docker官方提供: 需要在每台机器上安装docker,并且运行…

zotero扩容

最近出差,想要把本地的主机上的文件同步到笔记本,发现zotero不够用,然后寻找了一些zotero扩容的方法,这里记录一下,方便以后查阅。 zotero扩容创建账户登录账户进一步扩容设置Apps Connection设置zoterozotero自带同步…

Kafka基础理论

Kafka概述 kafka是一个分布式的基于发布/订阅模式的消息队列,主要用于大数据实时处理领域。kafka采取了发布/订阅模式,消息的发布者不会将消息直接发送给特定的订阅者,而是将发布的消息分为不同的类别,订阅者只接受感兴趣的消息。…

苍穹外卖项目实战(day-5完整版)-记录实战教程及问题的解决方法

Redis基本操作及下载安装包(Redis及可视化工具),都在我的上一篇文章:Redis基本知识及简单操作,这里不再赘述 店铺营业状态修改功能 (1)需求分析与设计 (2)SpringDataRe…

第R8周:RNN实现阿尔兹海默病诊断

数据集包含2149名患者的广泛健康信息,每名缓则的ID范围从4751到6900不等,该数据集包含人口统计详细信息,生活方式因素、病史、临床测量、认知和功能评估、症状以及阿尔兹海默症的诊断。 一、准备工作 1、硬件准备 import numpy as np import …

MySQL复制技术的发展历程

在互联网应用不断发展的二十多年里,MySQL 一直是最广泛使用的开源关系型数据库之一。它凭借开源、轻量、灵活的优势,支撑了无数网站、移动应用和企业系统。支撑 MySQL 长期发展的关键之一,就是 复制(Replication)技术。…

C++从字符串中移除前导零

该程序用于去除字符串开头的零字符。当输入"0000123456"时,程序会输出"123456"。核心函数removeZero()通过while循环找到第一个非零字符的位置,然后使用erase()方法删除前面的所有零。主函数读取输入字符串并调用该函数处理。程序简…

【面试题】C++系列(一)

本专栏文章持续更新,新增内容使用蓝色表示。C面向对象的三大特性:封装,继承,多态(1)封装是将数据和函数组合到一个类里。主要目的是隐藏内部的实现细节,仅暴露必要的接口给外部。通过封装&#…

当没办法实现从win复制东西到Linux虚拟机时的解决办法

① 先确认是否已安装bash复制sudo apt list --installed | grep open-vm-tools如果 没有任何回显 → 没装,跳到 ③如果看到 open-vm-tools 已安装 → 继续 ②② 启动正确的服务(单词别打错)bash复制systemctl status vmtoolsd # 查看…

用Markdown写自动化用例:Gauge实战全攻略!

你作为一名自动化测试工程师,正在为一个复杂的Web应用编写测试脚本:传统工具要求写大量代码,维护起来像解谜游戏,团队非技术成员完全插不上手。这时,Gauge这个“自动化神器”如魔法般出现——它允许用Markdown写可读的…

Unity开发保姆级教程:C#脚本+物理系统+UI交互,3大模块带你通关游戏开发

文章目录基础概念Unity开发环境搭建版本选择:为什么2021 LTS是最佳起点?三步安装:从下载到项目创建界面认知:5分钟掌握核心操作区配置优化:让开发更顺畅验证环境:创建你的第一个CubeC#基础语法与Unity脚本结…

Depth Anything V2论文速读

这篇论文主要讲了两方面1.为了解决模型在正常标注的现实图像上训练的缺陷问题、提出了新的模型训练数据和训练方法真实标记图像存在缺点:标签噪声(深度传感器可能存在空洞、玻璃等物体反射导致精度不准确)、标签细节粗糙(深度图边…