Sii库编写规范
本文档详细介绍了如何编写高质量的Sii库,包括代码规范、文档要求、版本管理等最佳实践。
目录
库类型限制
支持的功能性库
库中心仅支持功能性代码库,包括:
- 数学计算库 - 提供数学函数和算法
- 数据处理库 - 提供数据操作和转换功能
- 工具函数库 - 提供通用工具和辅助函数
- 算法库 - 提供各种算法实现
- 系统接口库 - 提供系统级功能接口
不支持的库类型
库中心不支持以下类型的库:
- SiiUI Web代码 - 包含UI组件和Web界面的代码
- 样式和主题库 - CSS、样式相关的代码
- Web应用代码 - 完整的Web应用程序
库内容要求
上传的库必须:
- ✅ 包含纯功能性代码
- ✅ 提供可复用的函数和类
- ✅ 使用
share关键字共享所有对外函数 - ✅ 不依赖特定的UI框架
- ✅ 可以在任何Sii环境中使用
- ❌ 不包含UI组件定义
- ❌ 不包含Web界面代码
- ❌ 不包含样式和布局代码
函数共享要求
重要:库中的所有对外函数必须使用share关键字:
// ✅ 正确:使用share共享函数
share func add(a: int, b: int): int {
back a + b;
}
// ❌ 错误:没有share的函数无法被外部调用
func internalHelper(x: int): int {
back x * 2;
}
- 没有
share的函数只能在库内部使用 - 只有
share的函数才能被外部调用 - 使用
share控制方法的访问权限
详细语法:关于
share关键字的具体用法,请参考 模块与引用文档。
库依赖管理
重要:如果库引用了其他库,必须在文件开头注释说明:
/*
* 库依赖说明:
* - math-utils v1.2.0: 提供基础数学运算
* - string-utils v2.1.0: 提供字符串处理功能
* - data-utils v1.0.5: 提供数据处理功能
*/
// 引用其他库
cite { math } from lib.math-utils;
cite { strin } from lib.string-utils;
// 库的主要功能
share func complexCalculation(x: int, y: int): int {
let result = math.add(x, y);
back result;
}
依赖注释要求:
- 必须在文件开头使用多行注释说明
- 必须包含库名称和具体版本号
- 必须说明每个依赖库的用途
- 便于其他开发者了解库的依赖关系
详细引用语法:关于
cite关键字的具体用法和语法,请参考 模块与引用文档。
功能性库编写指南
数学计算库示例
// math-utils.sii - 数学工具库
// 注意:所有对外函数都必须使用share关键字
share func add(a: int, b: int): int {
back a + b;
}
share func multiply(a: int, b: int): int {
back a * b;
}
share func power(base: int, exp: int): int {
// 计算幂运算
back base ^ exp;
}
// 内部辅助函数(不需要share)
func validateNumber(num: int): bool {
back num >= 0;
}
数据处理库示例
// data-utils.sii - 数据处理库
// 所有对外函数都使用share关键字
share func getArrayLength(arr: arr): int {
back arr.length;
}
share func getFirstItem(arr: arr): unknown {
if (arr.length > 0) {
back arr[0];
}
back null;
}
share func isEmpty(arr: arr): bool {
back arr.length == 0;
}
工具函数库示例
// string-utils.sii - 字符串工具库
// 所有对外函数都使用share关键字
share func getStringLength(str: string): int {
back str.length;
}
share func toUpperCase(str: string): string {
back str.toUpperCase();
}
share func contains(str: string, substring: string): bool {
back str.contains(substring);
}
算法库示例
// algorithms.sii - 算法库
// 所有对外函数都使用share关键字
share func findMax(arr: arr): int {
let max = arr[0];
forloop (let i = 1; i < arr.length; i = i + 1) {
if (arr[i] > max) {
max = arr[i];
}
}
back max;
}
详细语法:关于
forloop循环的用法,请参考 控制流程文档。
share func findMin(arr: arr): int {
let min = arr[0];
forloop (let i = 1; i < arr.length; i = i + 1) {
if (arr[i] < min) {
min = arr[i];
}
}
back min;
}
库基本结构
简化库结构
your-library/
├── README.md # 库说明文档
└── your-library.sii # 库的主要代码文件
必需文件
每个Sii库只需要包含以下文件:
README.md- 库的基本介绍和使用说明your-library.sii- 库的主要代码文件
库文件命名
- 库文件名应该与库名一致
- 使用小写字母和连字符:
math-utils.sii - 避免使用下划线或驼峰命名
命名规范
库名规范
- 使用小写字母和连字符:
my-awesome-library - 避免使用下划线或驼峰命名
- 名称应具有描述性,能清楚表达库的功能
- 避免与现有库重名
函数命名
// ✅ 推荐:使用动词开头,描述功能
func calculateArea(width: int, height: int): int {
back width * height;
}
// ✅ 推荐:布尔函数使用is/has/can开头
func isValidEmail(email: string): bool {
back email.contains("@");
}
// ✅ 推荐:数组操作函数使用动词
func addItem(item: int): void {
push item: int => items[0];
}
// ❌ 避免:命名不清晰
func calc(w: int, h: int): int {
back w * h;
}
变量命名
// ✅ 推荐:使用有意义的名称
let userCount: int = 0;
let isUserLoggedIn: bool = false;
let currentUserName: string = "";
// ❌ 避免:使用缩写或无意义名称
let cnt: int = 0;
let flag: bool = false;
let str: string = "";
类命名
// ✅ 推荐:使用PascalCase
class UserManager {
// 类定义
}
class DataProcessor {
// 类定义
}
// ❌ 避免:使用小写或下划线
class user_manager {
// 类定义
}
详细语法:关于类的定义和使用,请参考 面向对象编程文档。
代码规范
缩进和格式
// ✅ 推荐:使用4个空格缩进
func calculateSum(a: int, b: int): int {
let result: int = a + b;
back result;
}
类型注解
// ✅ 推荐:明确指定类型
func addNumbers(a: int, b: int): int {
back a + b;
}
// ✅ 推荐:简单类定义
class User {
name: string;
age: int;
}
详细语法:关于Sii语言的数据类型和类型注解,请参考 数据类型文档。
错误处理
// ✅ 推荐:适当的错误处理
func divide(a: int, b: int): int {
if (b == 0) {
print("错误:除数不能为零");
back 0;
}
back a / b;
}
详细语法:关于条件语句和错误处理,请参考 控制流程文档。
注释规范
// 单行注释:描述函数功能
func calculateSum(a: int, b: int): int {
let sum: int = a + b;
back sum;
}
/*
* 多行注释:详细说明函数用途
* 这个函数计算两个数的和
*/
func add(a: int, b: int): int {
back a + b;
}
文档要求
README.md 模板
# 库名称
简短描述库的功能和用途。
## 安装
```bash
sii install 库名称
快速开始
cite "库名称" from "库名称.sii";
// 基本使用示例
let result = calculateArea(10, 20);
print(result);
API 文档
函数名
参数:
param1: type- 参数描述param2: type- 参数描述
返回值: type - 返回值描述
示例:
let result = functionName(param1, param2);
许可证
MIT License
### 代码注释
```sii
/**
* 计算两个数的和
* @param a 第一个数
* @param b 第二个数
* @returns 两数之和
*/
func add(a: int, b: int): int {
back a + b;
}
/**
* 用户管理类
* 提供用户注册、登录、信息管理等功能
*/
class UserManager {
private users: arr = [];
/**
* 注册新用户
* @param userData 用户数据
* @returns 注册是否成功
*/
func registerUser(userData: obj): bool {
// 实现逻辑
back true;
}
}
最佳实践
性能优化
// ✅ 推荐:缓存重复计算的值
func calculateSum(a: int, b: int): int {
let result: int = a + b;
back result;
}
内存管理
// ✅ 推荐:及时清理资源
func processData(data: string): string {
let result: string = data;
// 处理完成后及时清理
back result;
}
错误处理
// ✅ 推荐:提供有意义的错误信息
func validateEmail(email: string): bool {
if (email.length == 0) {
print("邮箱地址不能为空");
back false;
}
if (!email.contains("@")) {
print("邮箱地址格式不正确");
back false;
}
back true;
}
数组操作最佳实践
// ✅ 推荐:安全的数组操作
func getArrayLength(arr: arr): int {
if (arr != null) {
back arr.length;
}
back 0;
}
详细语法:关于数组的操作和语句,请参考 数组与语句文档。
函数设计原则
// ✅ 推荐:单一职责原则
func calculateArea(width: int, height: int): int {
back width * height;
}
func calculatePerimeter(width: int, height: int): int {
back 2 * (width + height);
}
模块化设计
// ✅ 推荐:按功能分组
// math.sii - 数学函数
share func add(a: int, b: int): int {
back a + b;
}
// string.sii - 字符串函数
share func getLength(str: string): int {
back str.length;
}
常见问题
Q: 如何处理向后兼容性?
A: 在添加新功能时,确保不破坏现有API。如果需要重大更改,考虑创建新的主版本。
Q: 库的大小限制是多少?
A: 建议单个库文件不超过1MB,总库大小不超过10MB。
Q: 如何处理依赖关系?
A: 在 package.json 中明确声明所有依赖,避免循环依赖。
Q: 如何编写好的示例代码?
A: 示例应该简洁明了,展示库的核心功能,包含必要的注释。
Q: 为什么不能上传SiiUI Web代码?
A: 库中心专门用于功能性代码库,不支持UI相关代码。在编写SiiUI Web代码时可以调用库,方便开发者快速构建Web项目。
Q: 如何判断我的库是否符合要求?
A: 检查以下几点:
- 库是否只包含纯功能性代码?
- 是否不依赖特定的UI框架?
- 是否可以在任何Sii环境中使用?
- 是否提供了可复用的函数和类?
- 是否所有对外函数都使用了
share关键字?
Q: 为什么必须使用share关键字?
A: share关键字是Sii库系统的核心机制:
- 没有
share的函数只能在库内部使用 - 只有
share的函数才能被外部调用 - 使用
share可以控制方法的访问权限 - 这是库编写的基本要求
Q: 如何正确引用其他库?
A: 引用其他库时需要遵循以下规范:
- 在文件开头使用多行注释说明所有依赖库
- 必须包含库名称和具体版本号
- 说明每个依赖库的用途
- 使用
cite语句引用库文件 - 便于其他开发者了解依赖关系
Q: 如果我的库包含UI代码怎么办?
A: 将功能性代码和UI代码分离:
- 功能性代码可以上传到库中心
- UI代码应该放在其他专门的平台
- 在库的文档中说明UI代码的位置
总结
遵循这些规范将帮助您创建高质量、易维护的Sii库。记住,好的库不仅仅是功能正确,还要易于理解、使用和维护。
重要提醒:
- 所有对外函数必须使用
share关键字 - 没有
share的函数无法被外部调用 - 使用
share控制方法的访问权限 - 引用其他库时必须在文件开头注释说明依赖关系
- 必须包含库名称和具体版本号
- 这是库编写的基本要求
Sii语言具有独特的语法特性,如 back 语句、esle if 条件、forloop 循环、数组操作语句等,在编写库时要充分利用这些特性,同时保持代码的可读性和一致性。
如有疑问,请参考官方文档。