0%

组件设计与SDK开发基本规范

SDK 和组件的设计过程中从 设计原则代码规范文档规范第三方依赖处理原则版本管理规范 五个大的方面来讨论。
SDK 一般包含文档、范例、工具。

设计原则

首先我们遵循软件 六大设计原则23种设计模式 来解决我们在开发中遇到的问题,在 SDK组件化 的设计中同样适用。
六大设计原则:

  • 单一职责原则(Single Responsibility Principle
    单一职责原则的定义是:应该有且仅有一个原因引起类的变更。
  • 开闭原则(Open Closed Principle
  • 里氏替换原则(Liskov Substitution Principle
  • 迪米特法则(Law of Demeter),又叫“最少知道法则”
  • 接口隔离原则(Interface Segregation Principle
  • 依赖倒置原则(Dependence Inversion Principle

优秀设计

  • SDK 必须要遵从原生、简短、执行迅速、代码干净、易读、可测试的原则。
  • 一个接口尽量只做一件事。
  • SDK 所包含的接口数量越少越好,接口参数越少越好,调用流程越少越好 向后兼容。
  • SDK 产品往往是迭代的,向后兼容非常重要。

兼容性

  • 一般出现接口兼容性的问题主要是由于最初需求考虑不完善,导致后面进行方案优化时引起接口的变更,使之前的接口成为历史的老大难问题,最终造成删除难度大。
  • 在确定开发方案时,就需要考虑到一部分接入方使用了该功能,需要保证该功能正常读取。一部分接入方没有使用到该功能,要确保无异常出现。一般这种兼容性问题会决定开发方案的技术实现。

参数设计

  • 一些固定的参数可以通过 config 配置参数在 SDK 初始化的时候设置。
  • 接口参数尽量少。
  • 参数过多,可合并成一个对象。
  • 能同步调用就尽量同步调用,返回结果能不回调就不要回调。
  • 多线程能自己处理就自己处理。

性能高效

  • 良好的性能带来良好的体验,性能优化也是很关键的一个环节。
  • 内存占用,内存抖动。
  • 多线程控制。
  • 避免主线程阻塞。
  • 电量消耗。

回调设计

  • 减少全局回调;必须全局回调的分模块回调
  • 回调接口尽可能少
  • 异常情况回调
  • 错误回调:错误码+错误信息 组合返回

日志设计

  • 核心逻辑处理需要 loglog 可配置
  • 可控制打印 log 级别

注释

  • 代码注释要规范和清楚
  • 接口注释要特别完善
  • 注释形式要统一
  • 注释内容要准确整洁

Swift 注释示例:

1
2
3
4
5
6
7
8
/// 描述文字
/// 补充文字描述
/// - warning: 警告信息
/// - version: 对类的说明 标明该类模块的版本
/// - Parameters: 参数信息
/// - params: 对方法的说明 对方法中某参数的说明
/// - see: `RLMAPIKeyAuth`
/// - returns: 对方法的说明 对方法返回值的说明

输出

  • 示例代码,维护一份准确的示例代码是一劳永逸的事情,可避免很多不必要的打扰。

代码规范

代码规范可以参考的规范有很多,这里推荐官方各种语言规范。

命名规范

代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。正确的英文拼写和语法可以让阅读者易于理解,避免歧义。

包规范

  • 包名全部小写,连续的单词只是简单地连接起来,不使用下划线,采用反域名命名规则,全部使用小写字母。
  • 类、方法、变量的范围尽可能缩小(能用 private 不用 public,能用局部变量就不用全局变量)
  • 模块划分依据高内聚,低耦合的原则。

类名

  • 类名都以 UpperCamelCase 风格编写。
  • 类名通常是名词或名词短语,接口名称有时可能是形容词或形容词短语。现在还没有特定的规则或行之有效的约定来命名注解类型。

方法名

  • 方法名都以 lowerCamelCase 风格编写。
  • 方法名通常是动词或动词短语。

常量名

  • 常量名命名模式为 CONSTANT_CASE,全部字母大写,用下划线分隔单词。

资源规范

  • 资源命名使用下划线分隔的小写字母
  • 所有资源需要有前缀区分,避免引入应用后出现资源名冲突

文档规范

  • 内容准确完整,一个优秀的 SDK 开发人员在编写文档前会做充分的接口场景调用验证,已保证内容的准确和完整。
  • 易读易用,SDK 开发人员作为文档的第一个读者和使用者,在使用文档过程中应该有意识的降低自己的姿态,时常假想一个很 low 的开发者在阅读自己文档时候的样子,通过积极阅读和不断改进确保一个不是很擅长编程的开发者也能使用我们的 SDK
  • 精简文档,一个优秀的 SDK 开发人员会通过减少重复、避免冗余、整洁代码等措施来精简文档的内容,同时这也减少了文档的维护成本。
  • 更新日志文档

描述清楚相对上个版本的所有变更(优化项酌情考虑是否添加),如:

1
2
3
4
v2.23.2
修复xxx崩溃的偶发性bug
调整xxx列表页面ui
增加xxx的接口,详情看接口文档

如果 API 变动较大,需提供变更对照文档:
接口文档/集成指南

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
一般文档结构如下:
产品简介
功能说明
适配版本
开发包内容
接入准备
相关key的申请等
相关配置
manifest配置
混淆配置
依赖配置 …
接口调用
接口详情
示例代码
FAQ
依赖冲突 …

测试报告
在实际的接入过程中,有很多接入方需要提供相关的性能测试说明,这部分的内容需要及早准备。测试报告的工作可以研发和测试一起协助进行输出,最终方便后续的支持工作,降低维护成本。

第三方依赖管理

  • 能用系统的 API 解决的,就不要使用第三方,减少对其他库的依赖;
  • 最小可用性原则,即用最少的代码,如无必要勿增实体;
  • 最少依赖性原则,即用最低限度的外部依赖,如无必要勿增依赖。

SDK 开发中,需要尽量避免依赖第三方库,使用通用的自带的官方库能满足需求即可,以免引起不必要的冲突或者三方库。如果确实因为项目需要,要引入一些开源库,可以通过源码集成的形式引入,再更改一下包名,避免集成冲突。

版本管理规范

版本号规则

使用三位版本号,每位版本号最高三位数字:(1999).(0999)如:1.0.12
版本号递增原则:

  • 第三位:bug修复,极小的变更
  • 第二位:一般的功能迭代
  • 第一位:项目重构,功能变更较大,需团队共同确定

命名规则

遵循以下命名规则可避免不同 sdk 命名冲突:

  • 所有资源命名前缀:xxx_xxx_
  • demo 项目命名:demo,包名:cn.xxx.sdk.xxx.demo sdk
  • 项目命名:XxxSDK,包名:cn.xxx.sdk.xxx

打包原则

包必须符合以下原则和规范:

  • 对外提供的包不能包含任何编译生成的文件和目录
  • 使用脚本一键打包,提升打包效率,降低手动打包带来的出错率
  • 打包脚本需与项目其他脚本分离,尽量职责单一 包中尽量提供示例工程, 示例工程必须让开发者以最低的成本运行起来
  • 打包指令根据实际情况调整,打完的包需亲测有效才可对外发布

参考文章:

坚持原创技术分享,您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道