鸿蒙HarmonyOS开发规范-完善中
代码规范
- 所有文件,包括自动生成的编译文件package.json都要格式化(IDE快捷键Ctrl+Alt+L);
- 函数命名,C++大驼峰,TS、JS小驼峰,函数命名注意动宾结构;
- 静态常量需使用全大写,文件目录使用全小写(不建议包含特殊字符如"-“和”_"等);
- 类名使用大驼峰,函数的参数、全局变量和局部变量都使用小驼峰,命名要规范化,见名知意;
- if语句后必须跟“{”,哪怕只有一行代码;
- 有break或return的条件,先break或return再走其他的逻辑;
- 条件判断,当一个分支达成条件时及时返回,不需要再走其他分支;
- 代码中避免出现魔鬼数字,需补上注释,或者用符合语义的名词常量代替,如下:
// One minute has 60 seconds.let time = 60const ONE_MINUTE = 60let time = ONE_MINUTE
- 字符串拼接使用模板字符串;
- 组件使用,除了宽高属性可以在一行,其他的属性必须换行;
- TS、JS中关于是否添加";“的问题,风格要统一,建议添加”;";
- 字符串和图片资源等的使用,支持" r " 使用的,全部使用 " r"使用的,全部使用" r"使用的,全部使用"r"引用;
- 新增文件注意开源协议、版权检查;
- 截图要使用真机效果图;
- readme中使用“.”,不要用“、”,检查错别字;
- 异步方法中需要返回方法的返回值,不用声明变量,直接return,如下:
return await this.mediaTest.getFileAssets(fetchOp)
- 方法中的参数需要类型声明;
- import 文件顺序,同类型放一起;
- string.json中description要写简要描述,zh下要用中文;
- TS、JS语言缩进为2格,C++语言缩进为4格;
- 涉及应用截图时,图片不能包含人物、关键信息、网络等有侵权风险的资源;
- 工程中不要配置签名信息,禁止上传local.properties和package-lock.json等系统自动生成的文件;
- 规范日志格式,统一用[Sample_包名]开头,如时钟日志,使用[Sample_Clock],日志打印需要使用Hilog接口,建议封装单独的Logger类 ,示例如下:
import hilog from '@ohos.hilog'
...
class Logger {private domain: number = 0xFF00private prefix: string = '[Sample_Clock]'private format: string = '%{public}, %{public}'...debug(...args: any[]) {hilog.debug(this.domain, this.prefix, this.format, args)}...
}
- 注释“//”后要加一个空格;如果注释跟在代码后面,则“//”前要加一个空格;
// 正确示例let a = 10let a = 10 // 正确示例
- 代码中避免出现中文字符,要使用资源代替,符合国际化开发标准;
- 应用包名统一使用“com.samples.xxx”,“xxx”为特性名称;
ReadMe编写规范
-
标题:以特性名称命名;
-
介绍:介绍sample用了哪些包,具有哪些功能,给出完整包名并附上链接;
-
效果预览:屏幕截屏或者视频,文件不超过4个;
3.1 使用说明:介绍应用的使用说明,具体的操作步骤和用法信息,示例如下:
- 在主界面,可以点击图片、视频、文档、音频等按钮进入对应目录的文件列表浏览界面;
- 在文件列表浏览界面,点击“+”按钮,可以添加文件;
- 在文件列表浏览界面,长按列表项会出现删除图片,点击删除图标可以删除文件;
- 在图片文件列表界面,点击图片可以进入图片预览界面。
-
工程目录:给出项目中关键的目录结构并描述它们的作用,示例如下:
entry/src/main/ets/ |---Application |---filemanager | |---data | | |---FileDataSource.ets // 懒加载数据格式 | |---pages | | |---audio | | | |---AudioFileList.ets // 音频列表页面 | | |---common | | | |---FileList.ets // 同类型文件列表展示页面,接收文件类型,展示特定类型的文件列表 | | |---document | | | |---DocumentFileList.ets // 文档列表页面 | | |---image | | | |---ImageFileList.ets // 图片列表页面 | | | |---ImagePreview.ets // 图片预览页面 | | |---video | | | |---VideoFileList.ets // 视频列表页面 | | |---FileManagerHome.ets // 首页主体内容 |---MainAbility |---pages | |---index.ets // 首页 Library/src/main/ets/ |---filemanager | |---components | | |---ThumbnailImage.ets // 缩略图组件 | |---fileio | | |---FileIoManager.ts // 文件管理,待开发 | |---medialibrary | | |---MediaLibraryManager.ts // 主要封装了mediaLibrary库相关的接口,实现相关功能,如:对文件的增、删、查和图片预览功能 | |---userfilemanager | | |---UserFileManager.ts // 封装userFileManager库相关的接口 | |---FileManager.ts // 文件管理接口,统一封装了各模块对外提供的功能接口 |---mock // 本地数据 |---utils // 日志工具
-
具体实现:
先描述功能都在哪个模块,再具体描述如何实现这些功能的,以及在哪里使用他们,附上文件链接;示例如下:-
增添文件、删除文件、查找指定类型文件文件和预览图片的功能接口封装在MediaLibraryManager,源码参考:MediaLibraryManager.ts
- 使用mediaLibrary.getMediaLibrary来获取MediaLibrary对象;
- 读取每个文件的数据:使用MediaLibrary.getFileAssets读取满足条件的文件集合FetchFileResult,然后调用FetchFileResult.getFirstObject();
- 创建模拟文件:使用MediaLibrary.getPublicDirectory()获取系统预定的目录,然后使用MediaLibrary.createAsset();
- 删除指定路径的文件:使用MediaLibrary.deleteAsset();
- 获取预览图:使用image.createImageSource()创建指定的文件资源ImageSource,然后调用ImageSource.createPixelMap(),接口参考:@ohos.multimedia.image 。
-
在Library模块中通过封装FileManager向外提供功能接口,如MediaLibraryManager.getPixelMapByFileAsset(),源码参考:FileManager.ts
- 如效果预览中的图片列表,读取指定类型的文件:在FileList.ets
中调用FileManager.getFileAssets(); - 创建模拟文件:在FileList.ets
中调用FileManager.createTxtFileAsset(); - 删除指定路径的文件:在FileList.ets
中调用FileManager.deleteFileAsset(); - 获取缩略图:在ThumbnailImage.ets 中调用FileManager.getThumbnail();
- 如效果预览中的图片预览,获取预览图:在ImagePreview.ets 中调用FileManager.getPixelMapByFileAsset()。
- 如效果预览中的图片列表,读取指定类型的文件:在FileList.ets
-
-
相关权限:介绍应用的使用权限,附上链接;
-
依赖: 介绍对其他sample的依赖,附上sample链接;
-
约束与限制:
6.1 支持应用运行的操作系统版本和设备,示例如下:
本示例仅支持标准系统上运行,支持设备:RK3568;
6.2 API版本、SDK版本(如果依赖Full SDK,附上替换链接),示例如下:
本示例仅支持APIXX版本SDK,版本号:3.X.X.X;(如果涉及Full SDK还需加上:本涉及涉及使用系统接口:XXX,需要手动替换Full SDK才能编译通过,具体操作可参考[替换指南]。)
6.3 支持的IDE版本,示例如下:
本示例需要使用DevEco Studio 3.0 Beta4 (Build Version: 3.0.0.992, built on July 14, 2022)才可编译运行;
6.4 高等级APL特殊签名说明,示例如下:
本示例涉及[相关权限]为system_basic(或者system_core)级别(相关权限级别可通过[权限定义列表]查看),需要配置高权限签名,可参考[特殊权限配置方法];
-
下载:给出单独下载本工程的命令,在代码中替换工程目录并以/结尾,如下面示例中的 FileManager/FileManager,示例如下:
如需单独下载本工程,执行如下命令:
git init git config core.sparsecheckout true echo FileManager/FileManager/ > .git/info/sparse-checkout git remote add origin https://gitee.com/openharmony/applications_app_samples.git git pull origin master
ReadMe模板链接
工程结构规范
Sample工程,应该区分开场景业务逻辑和特性相关封装接口,规则如下:
- 包名命名规则为"com.samples.特性名",工程名命名规则为特性名称,与Readme标题保持一致;
- 特性接口封装放在Library模块下,能够独立编译成har包复用;
- 场景业务逻辑,展示Library模块中特性接口的使用,放在entry目录中;
- entry/src/main/ets/目录下的pages目录中,只放一个Index.ets,作为入口页面;
- entry/src/main/ets/目录下创建场景业务目录,存放该场景相关的业务逻辑和页面代码;
- Library/src/main/ets/目录下创建特性目录,目录下包括components(对外开放的控件目录)、feature(特性封装逻辑目录)、Feature.ts(对外开放的特性接口)等;
以FileManager特性为例,工程示例结构如下:
entry/src/main/ets/ // 场景业务逻辑放在entry目录下
|---Application // 应用级逻辑
|---MainAbility // 元能力组件
|---filemanager // 场景业务功能(如果存在多个场景,则放在同级目录下)
| |---data // 场景业务逻辑相关类或数据
| |---pages // 场景业务逻辑相关页面
|---pages // UI页面
| |---Index.ets // pages下只保留一个Index.ets,作为入口页面
|---utils // 共用的工具类或者模块
Library/src/main/ets/ // 特性接口封装放在Library模块下,能够独立编译成har包复用
|---filemanager // 特性相关封装类
| |---components // 特性相关UI控件类,需要对外开放(部分特性涉及对外提供复用UI控件)
| | |---FileImage.ets
| |---fileio // 封装了特性相关接口,如果存在多个模块,放在多个目录下如fileio、medialibrary、userfilemanager,不对外开放
| | |---FileIoManager.ts
| |---medialibrary
| |---userfilemanager
| |---FileManager.ts // 对外开放的特性接口,无具体实现(实现在fileio、medialibrary等模块中)
|---mock // 模拟数据
|---utils // 特性相关工具类
UI自动化用例编写规范
- 用例命名规范为:“包名_测试功能_序号”,如“MyApp_StartAbility_001”,序号表示测试StartAbility功能的第1个用例;
- 用例的开头和结尾都需要有日志打印;
- 打印必须包括用例名称的关键字,用例中每条断言语句前必须添加日志,打印参数信息;
- DOMAIN设置为0xF811;
- 用例名称中的包名和日志中的包名单独用常量表示,方便包名变更整改;
- 每条用例前需要添加注释;
import hilog from '@ohos.hilog';...const TAG = '[Sample_MyApp]'const DOMAIN = 0xF811const BUNDLE = 'MyApp_'.../*** 介绍用例测试的功能和场景等信息*/it(BUNDLE + 'StartAbility_001', function() {hilog.info(DOMAIN, TAG, BUNDLE + "StartAbility_001, begin")...// 介绍单一步骤的功能hilog.info(DOMAIN, TAG, BUNDLE + "StartAbility_001, code:" + code)expect(0).asserEqual(code)...hilog.info(DOMAIN, TAG, BUNDLE + "StartAbility_001, end")})
PR提交格式规范
示例如下:
IssueNo: #I56EH7:关联问题
Description: 描述问题.
Sig: sig-systemapplications
Feature or Bugfix: Bugfix
Binary Source: NoSigned-off-by: jiangwensai <jiangwensai@huawei.com>
- IssueNo管理issue信息;
- Description描述修改变更内容;
- Sig统一使用SIG_Sample;
- Feature or Bugfix,如果是需求选择Feature,问题选择Bugfix;
- Signed-off-by,注明开发者账号和邮箱;
相关文章:
鸿蒙HarmonyOS开发规范-完善中
代码规范 所有文件,包括自动生成的编译文件package.json都要格式化(IDE快捷键CtrlAltL);函数命名,C大驼峰,TS、JS小驼峰,函数命名注意动宾结构;静态常量需使用全大写,文…...

神经网络压缩图像
简介 典型的压缩管道由四个组件组成: 编码:输入图像 x x x通过编码器函数 ε \varepsilon ε,将其转换为潜在表示 z z z。 量化:截断 z z z以丢弃一些不重要的信息 熵编码:使用某种形式的熵编码(例如&…...
Catagory(rt)
继承(IMP融合):支持super命令码;继承推荐重写 分类(IMP替换):不支持super命令码;分类推荐组合 //替换(原来没了/破坏掉原来IMP/分类(替换特性)) 情况1: 自封装(组件化)开源库>分类推荐组合 情况2:逆向分析> 有意替换>分类IMP替换 #import "CatagoryViewContro…...

Games104 现代游戏引擎3
Sprite Animation 序列帧动画 自由度(degrees of freedom,DoF)对于刚体而言描述它的运动需要3个位移3个旋转,一共6个自由度 顶点动画(per-vertex animation)利用网格的顶点来控制运动。此时网格上的每个顶…...

【云计算】混合云分类
《混合云》系列,共包含以下 3 篇文章: 【云计算】混合云概述【云计算】混合云分类【云计算】混合云组成、应用场景、风险挑战 😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀Ὠ…...

探索分布式系统监控zabbix------------自动发现与自动注册
目录 一、部署 zabbix 服务端 二、部署 zabbix 客户端 2.1环境准备 2.2服务端和客户端都配置时间同步 (ntp) 2.2.1服务端zbx-server 2.2.2服务端zabbix-agent01客户端 2.3客户端配置时区,与服务器保持一致 2.4设置 zabbix 的下载源&…...

权限管理Ranger详解
文章目录 一、Ranger概述与安装1、Ranger概述1.1 Ranger介绍1.2 Ranger的目标1.3 Ranger支持的框架1.4 Ranger的架构1.5 Ranger的工作原理 2、Ranger安装2.1 创建系统用户和Kerberos主体2.2 数据库环境准备2.3 安装RangerAdmin2.4 启动RangerAdmin 二、Ranger简单使用1、安装 R…...

WPF Extended.Wpf.Toolkit 加载界面
1、NuGet 中安装 Extended.Wpf.Toolkit 。 2、在MainWindow.xaml中添加xmlns:tk"http://schemas.xceed.com/wpf/xaml/toolkit" 。 MainWindow.xaml 代码如下。 <Window x:Class"WPF_Extended_Wpf_Toolkit_Loading.MainWindow" xmlns"ht…...

【切换网络连接后】VMware虚拟机网络配置【局域网通信】
初次安装Linux虚拟机以及切换网络都需要配置虚拟机网络, 从而使得win主机内通过远程连接工具能够连接该虚拟机, 而不是在虚拟机内操作。 本片文章你将了解到网络切换后如何配置虚拟机网络的一些基础操作,以及局域网通信的一些基础知识。 …...

革新鞋服零售:数据驱动的智能商品管理 解锁库存优化与高效增长
国内鞋服零售企业经过多年的发展,已经形成诸多家喻户晓的品牌,但近年来一些企业的库存问题也时常显现,高库存不仅困扰着品牌商,也使一些多年合作良好的经销商深受其害,当下的订货会制度在初期帮助企业解决了盲目生产的…...

word文件的创建时间和修改时间可以更改吗?答案是肯定的 文件属性修改的方法
一,引言 在日常生活和工作中,我们经常需要处理各种Word文件。有时,由于某些原因,我们可能需要更改Word文件的创建时间和修改时间。虽然这听起来可能有些复杂,但实际上,通过一些简单的方法和工具࿰…...

redisson -- 延迟队列RDelayedQueue
1.maven配置 <!-- 用于管理起步工程的依赖管理 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.11</version><relativePath/> </parent…...

Flex弹性盒子布局案例(认识弹性布局)
一、导航菜单 此示例创建了一个水平导航菜单,其中链接在 Flex 容器中等距分布。 HTML结构: <nav class"nav-menu"><a href"#">Home</a><a href"#">About</a><a href"#">…...

【ros2】ros1和ros2可以同时在一台机器上运行吗
可以,ROS 1 和 ROS 2 是两个不同版本的 Robot Operating System (ROS),它们分别有着各自的架构、消息传递机制以及配套工具集。尽管存在这些差异,ROS 1 和 ROS 2 可以在同一台 Ubuntu 系统上共存并独立运行。以下是一些关键点来说明如何实现这…...
PMSM MATLAB
// s-function搭建变参数PMSM模型 ///...

笔记本电脑上的聊天机器人: 在英特尔 Meteor Lake 上运行 Phi-2
对应于其强大的能力,大语言模型 (LLM) 需要强大的算力支撑,而个人计算机上很难满足这一需求。因此,我们别无选择,只能将它们部署至由本地或云端托管的性能强大的定制 AI 服务器上。 为何需要将 LLM 推理本地化 如果我们可以在典配…...

【Web】陇原战“疫“2021网络安全大赛 题解
目录 CheckIN eaaasyphp EasyJaba CheckIN 拿到附件,贴出关键代码 func getController(c *gin.Context) {cmd : exec.Command("/bin/wget", c.QueryArray("argv")[1:]...)err : cmd.Run()if err ! nil {fmt.Println("error: ", …...

010Node.js自定义模块通过exports的使用,两种暴露的方法及区别(二)
module/request.js var obj{get:function(){console.log(从服务器获取数据);},post:function(){console.log(提交数据);} }exports.xxxxobj;//方法一 { xxxx: { get: [Function: get], post: [Function: post] } }//module.exportsobj;//方法二 //{ get: [Function: g…...

【CVE-2010-2883】进行钓鱼攻击的研究
最近作业中研究APT攻击,了解到2011年前后披露的LURID-APT,其中敌手利用了各种版本的文件查看器的漏洞实现攻击。CVE-2010-2883就是其中被利用的一个adobe reader的漏洞。特此复现,更好的研究和防范APT攻击。 本文仅仅是对相关漏洞利用的学习…...
【Python】如何在Ubuntu上设置Python脚本开机自启
你不知道我为什么狠下心 盘旋在你看不见的高空里 多的是 你不知道的事 蝴蝶眨几次眼睛 才学会飞行 夜空洒满了星星 但几颗会落地 我飞行 但你坠落之际 很靠近 还听见呼吸 对不起 我却没捉紧你 🎵 王力宏《你不知道的事》 前置要求 确保你的Ub…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...