当前位置: 首页 > news >正文

鸿蒙HarmonyOS开发规范-完善中

代码规范

  1. 所有文件,包括自动生成的编译文件package.json都要格式化(IDE快捷键Ctrl+Alt+L);
  2. 函数命名,C++大驼峰,TS、JS小驼峰,函数命名注意动宾结构;
  3. 静态常量需使用全大写,文件目录使用全小写(不建议包含特殊字符如"-“和”_"等);
  4. 类名使用大驼峰,函数的参数、全局变量和局部变量都使用小驼峰,命名要规范化,见名知意;
  5. if语句后必须跟“{”,哪怕只有一行代码;
  6. 有break或return的条件,先break或return再走其他的逻辑;
  7. 条件判断,当一个分支达成条件时及时返回,不需要再走其他分支;
  8. 代码中避免出现魔鬼数字,需补上注释,或者用符合语义的名词常量代替,如下:
  // One minute has 60 seconds.let time = 60const ONE_MINUTE = 60let time = ONE_MINUTE
  1. 字符串拼接使用模板字符串;
  2. 组件使用,除了宽高属性可以在一行,其他的属性必须换行;
  3. TS、JS中关于是否添加";“的问题,风格要统一,建议添加”;";
  4. 字符串和图片资源等的使用,支持" r " 使用的,全部使用 " r"使用的,全部使用" r"使用的,全部使用"r"引用;
  5. 新增文件注意开源协议、版权检查;
  6. 截图要使用真机效果图;
  7. readme中使用“.”,不要用“、”,检查错别字;
  8. 异步方法中需要返回方法的返回值,不用声明变量,直接return,如下:
  return await this.mediaTest.getFileAssets(fetchOp)
  1. 方法中的参数需要类型声明;
  2. import 文件顺序,同类型放一起;
  3. string.json中description要写简要描述,zh下要用中文;
  4. TS、JS语言缩进为2格,C++语言缩进为4格;
  5. 涉及应用截图时,图片不能包含人物、关键信息、网络等有侵权风险的资源;
  6. 工程中不要配置签名信息,禁止上传local.properties和package-lock.json等系统自动生成的文件;
  7. 规范日志格式,统一用[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)}...
}
  1. 注释“//”后要加一个空格;如果注释跟在代码后面,则“//”前要加一个空格;
  // 正确示例let a = 10let a = 10 // 正确示例
  1. 代码中避免出现中文字符,要使用资源代替,符合国际化开发标准;
  2. 应用包名统一使用“com.samples.xxx”,“xxx”为特性名称;

ReadMe编写规范

  1. 标题:以特性名称命名;

  2. 介绍:介绍sample用了哪些包,具有哪些功能,给出完整包名并附上链接;

  3. 效果预览:屏幕截屏或者视频,文件不超过4个;

    3.1 使用说明:介绍应用的使用说明,具体的操作步骤和用法信息,示例如下:

    1. 在主界面,可以点击图片、视频、文档、音频等按钮进入对应目录的文件列表浏览界面;
    2. 在文件列表浏览界面,点击“+”按钮,可以添加文件;
    3. 在文件列表浏览界面,长按列表项会出现删除图片,点击删除图标可以删除文件;
    4. 在图片文件列表界面,点击图片可以进入图片预览界面。
  4. 工程目录:给出项目中关键的目录结构并描述它们的作用,示例如下:

    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                                  // 日志工具
    
  5. 具体实现:
    先描述功能都在哪个模块,再具体描述如何实现这些功能的,以及在哪里使用他们,附上文件链接;示例如下:

    • 增添文件、删除文件、查找指定类型文件文件和预览图片的功能接口封装在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()。
  6. 相关权限:介绍应用的使用权限,附上链接;

  7. 依赖: 介绍对其他sample的依赖,附上sample链接;

  8. 约束与限制:

    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)级别(相关权限级别可通过[权限定义列表]查看),需要配置高权限签名,可参考[特殊权限配置方法];
    
  9. 下载:给出单独下载本工程的命令,在代码中替换工程目录并以/结尾,如下面示例中的 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工程,应该区分开场景业务逻辑和特性相关封装接口,规则如下:

  1. 包名命名规则为"com.samples.特性名",工程名命名规则为特性名称,与Readme标题保持一致;
  2. 特性接口封装放在Library模块下,能够独立编译成har包复用;
  3. 场景业务逻辑,展示Library模块中特性接口的使用,放在entry目录中;
  4. entry/src/main/ets/目录下的pages目录中,只放一个Index.ets,作为入口页面;
  5. entry/src/main/ets/目录下创建场景业务目录,存放该场景相关的业务逻辑和页面代码;
  6. 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自动化用例编写规范

  1. 用例命名规范为:“包名_测试功能_序号”,如“MyApp_StartAbility_001”,序号表示测试StartAbility功能的第1个用例;
  2. 用例的开头和结尾都需要有日志打印;
  3. 打印必须包括用例名称的关键字,用例中每条断言语句前必须添加日志,打印参数信息;
  4. DOMAIN设置为0xF811;
  5. 用例名称中的包名和日志中的包名单独用常量表示,方便包名变更整改;
  6. 每条用例前需要添加注释;
  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>
  1. IssueNo管理issue信息;
  2. Description描述修改变更内容;
  3. Sig统一使用SIG_Sample;
  4. Feature or Bugfix,如果是需求选择Feature,问题选择Bugfix;
  5. Signed-off-by,注明开发者账号和邮箱;

相关文章:

鸿蒙HarmonyOS开发规范-完善中

代码规范 所有文件&#xff0c;包括自动生成的编译文件package.json都要格式化&#xff08;IDE快捷键CtrlAltL&#xff09;&#xff1b;函数命名&#xff0c;C大驼峰&#xff0c;TS、JS小驼峰&#xff0c;函数命名注意动宾结构&#xff1b;静态常量需使用全大写&#xff0c;文…...

神经网络压缩图像

简介 典型的压缩管道由四个组件组成&#xff1a; 编码&#xff1a;输入图像 x x x通过编码器函数 ε \varepsilon ε&#xff0c;将其转换为潜在表示 z z z。 量化&#xff1a;截断 z z z以丢弃一些不重要的信息 熵编码&#xff1a;使用某种形式的熵编码&#xff08;例如&…...

Catagory(rt)

继承(IMP融合):支持super命令码;继承推荐重写 分类(IMP替换):不支持super命令码;分类推荐组合 //替换(原来没了/破坏掉原来IMP/分类(替换特性)) 情况1: 自封装(组件化)开源库>分类推荐组合 情况2:逆向分析> 有意替换>分类IMP替换 #import "CatagoryViewContro…...

Games104 现代游戏引擎3

Sprite Animation 序列帧动画 自由度&#xff08;degrees of freedom&#xff0c;DoF&#xff09;对于刚体而言描述它的运动需要3个位移3个旋转&#xff0c;一共6个自由度 顶点动画&#xff08;per-vertex animation&#xff09;利用网格的顶点来控制运动。此时网格上的每个顶…...

【云计算】混合云分类

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

探索分布式系统监控zabbix------------自动发现与自动注册

目录 一、部署 zabbix 服务端 二、部署 zabbix 客户端 2.1环境准备 2.2服务端和客户端都配置时间同步 &#xff08;ntp&#xff09; 2.2.1服务端zbx-server 2.2.2服务端zabbix-agent01客户端 2.3客户端配置时区&#xff0c;与服务器保持一致 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虚拟机以及切换网络都需要配置虚拟机网络&#xff0c; 从而使得win主机内通过远程连接工具能够连接该虚拟机&#xff0c; 而不是在虚拟机内操作。 本片文章你将了解到网络切换后如何配置虚拟机网络的一些基础操作&#xff0c;以及局域网通信的一些基础知识。 …...

革新鞋服零售:数据驱动的智能商品管理 解锁库存优化与高效增长

国内鞋服零售企业经过多年的发展&#xff0c;已经形成诸多家喻户晓的品牌&#xff0c;但近年来一些企业的库存问题也时常显现&#xff0c;高库存不仅困扰着品牌商&#xff0c;也使一些多年合作良好的经销商深受其害&#xff0c;当下的订货会制度在初期帮助企业解决了盲目生产的…...

word文件的创建时间和修改时间可以更改吗?答案是肯定的 文件属性修改的方法

一&#xff0c;引言 在日常生活和工作中&#xff0c;我们经常需要处理各种Word文件。有时&#xff0c;由于某些原因&#xff0c;我们可能需要更改Word文件的创建时间和修改时间。虽然这听起来可能有些复杂&#xff0c;但实际上&#xff0c;通过一些简单的方法和工具&#xff0…...

redisson -- 延迟队列RDelayedQueue

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

Flex弹性盒子布局案例(认识弹性布局)

一、导航菜单 此示例创建了一个水平导航菜单&#xff0c;其中链接在 Flex 容器中等距分布。 HTML结构&#xff1a; <nav class"nav-menu"><a href"#">Home</a><a href"#">About</a><a href"#">…...

【ros2】ros1和ros2可以同时在一台机器上运行吗

可以&#xff0c;ROS 1 和 ROS 2 是两个不同版本的 Robot Operating System (ROS)&#xff0c;它们分别有着各自的架构、消息传递机制以及配套工具集。尽管存在这些差异&#xff0c;ROS 1 和 ROS 2 可以在同一台 Ubuntu 系统上共存并独立运行。以下是一些关键点来说明如何实现这…...

PMSM MATLAB

// s-function搭建变参数PMSM模型 ///...

笔记本电脑上的聊天机器人: 在英特尔 Meteor Lake 上运行 Phi-2

对应于其强大的能力&#xff0c;大语言模型 (LLM) 需要强大的算力支撑&#xff0c;而个人计算机上很难满足这一需求。因此&#xff0c;我们别无选择&#xff0c;只能将它们部署至由本地或云端托管的性能强大的定制 AI 服务器上。 为何需要将 LLM 推理本地化 如果我们可以在典配…...

【Web】陇原战“疫“2021网络安全大赛 题解

目录 CheckIN eaaasyphp EasyJaba CheckIN 拿到附件&#xff0c;贴出关键代码 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攻击&#xff0c;了解到2011年前后披露的LURID-APT&#xff0c;其中敌手利用了各种版本的文件查看器的漏洞实现攻击。CVE-2010-2883就是其中被利用的一个adobe reader的漏洞。特此复现&#xff0c;更好的研究和防范APT攻击。 本文仅仅是对相关漏洞利用的学习…...

【Python】如何在Ubuntu上设置Python脚本开机自启

你不知道我为什么狠下心 盘旋在你看不见的高空里 多的是 你不知道的事 蝴蝶眨几次眼睛 才学会飞行 夜空洒满了星星 但几颗会落地 我飞行 但你坠落之际 很靠近 还听见呼吸 对不起 我却没捉紧你 &#x1f3b5; 王力宏《你不知道的事》 前置要求 确保你的Ub…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...