鸿蒙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…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
