yashandb教程FG020-YashanDB函数开发实战
本教程详细介绍YashanDB的函数开发方法,包括函数的创建与管理、参数传递、异常处理、性能优化等内容。风哥教程参考YashanDB官方文档SQL参考手册和系统管理员手册等相关资料,为数据库管理员和开发人员提供全面的函数开发指导。
函数是数据库中重要的对象,它们可以封装复杂的业务逻辑、提高代码复用性、增强安全性、提高性能。通过本教程的学习,您将掌握YashanDB的函数开发方法、最佳实践和常见问题处理。
本教程适用于数据库管理员和开发人员,帮助他们在生产环境中高效地开发和管理YashanDB的函数。
目录大纲
Part01-基础概念与理论知识
1.1 函数概述
函数的基本概念:
- 函数是返回单个值的数据库对象
- 函数可以接受参数并返回结果
- 函数可以封装复杂的业务逻辑
- 函数可以在SQL语句中使用
- 函数是数据库级别的对象
更多视频教程www.fgedu.net.cn
1.2 函数的优势
函数的优势:
- 代码复用:封装业务逻辑,减少重复代码
- 提高性能:预编译的SQL语句,减少网络传输
- 安全性:控制数据访问权限
- 可维护性:集中管理业务逻辑
- 灵活性:可以在SQL语句中使用
学习交流加群风哥微信: itpux-com
1.3 函数的类型
YashanDB支持的函数类型:
- 标量函数:返回单个值的函数
- 聚合函数:对一组值进行计算并返回单个值
- 表值函数:返回结果集的函数
- 系统函数:YashanDB内置的函数
- 用户定义函数:用户创建的函数
学习交流加群风哥QQ113257174
1.4 函数的语法结构
函数的语法结构:
- 创建函数:CREATE FUNCTION
- 参数声明:IN、OUT、INOUT
- 返回类型:RETURNS
- 变量声明:DECLARE
- 条件控制:IF-ELSE、CASE
- 循环控制:LOOP、WHILE、FOR
- 异常处理:EXCEPTION
- 返回结果:RETURN
风哥提示:合理使用函数可以提高数据库应用的性能和可维护性
Part02-生产环境规划与建议
2.1 函数规划
函数规划建议:
- 根据业务需求设计函数
- 合理划分函数的职责
- 考虑函数的性能影响
- 设计函数的参数和返回值
- 规划函数的版本控制
更多学习教程公众号风哥教程itpux_com
2.2 函数命名规范
函数命名规范:
- 使用有意义的名称
- 使用前缀区分函数类型(如func_、agg_)
- 使用下划线分隔单词
- 避免使用保留字
- 保持命名一致性
from yashanDB视频:www.itpux.com
2.3 性能影响评估
性能影响评估:
- 函数对性能的影响:预编译提高性能
- 函数的执行计划:减少解析时间
- 函数的网络传输:减少数据传输
- 函数的资源消耗:CPU、内存使用
2.4 最佳实践建议
最佳实践建议:
- 合理使用函数,不要过度使用
- 保持函数的简洁性
- 使用参数化查询,避免SQL注入
- 定期审查和优化函数
- 使用事务控制确保数据一致性
Part03-生产环境项目实施方案
3.1 函数设计与实现
函数设计与实现的步骤:
- 分析业务需求,确定函数的功能
- 设计函数的参数和返回值
- 编写函数的代码
- 测试函数
- 优化函数
3.2 函数参数设计
函数参数设计:
- IN参数:输入参数,用于向函数传递值
- OUT参数:输出参数,用于从函数返回值
- INOUT参数:既可以输入又可以输出的参数
- 参数默认值:为参数设置默认值
- 参数类型:选择合适的数据类型
3.3 函数异常处理
函数异常处理:
- 异常捕获:使用EXCEPTION块捕获异常
- 异常处理:处理捕获到的异常
- 异常抛出:使用RAISE语句抛出异常
- 错误日志:记录异常信息
3.4 函数管理
函数管理的步骤:
- 查看函数
- 修改函数
- 删除函数
- 重命名函数
- 管理函数权限
Part04-生产案例与实战讲解
4.1 函数创建与使用实战
函数创建与使用的实战步骤:
yassql -U fgedu -P fgedu123 -d fgedudb
# 创建标量函数
CREATE FUNCTION func_fgedu_calculate_bonus(
p_salary DECIMAL(10,2),
p_performance INTEGER
)
RETURNS DECIMAL(10,2)
LANGUAGE plpgsql
AS $$
DECLARE
v_bonus DECIMAL(10,2);
BEGIN
IF p_performance >= 90 THEN
v_bonus := p_salary * 0.2;
ELSIF p_performance >= 80 THEN
v_bonus := p_salary * 0.15;
ELSIF p_performance >= 70 THEN
v_bonus := p_salary * 0.1;
ELSE
v_bonus := p_salary * 0.05;
END IF;
RETURN v_bonus;
END;
$$;
# 调用标量函数
SELECT func_fgedu_calculate_bonus(8000, 95) AS bonus;
SELECT func_fgedu_calculate_bonus(8000, 75) AS bonus;
SELECT func_fgedu_calculate_bonus(8000, 65) AS bonus;
# 创建表值函数
CREATE FUNCTION func_fgedu_get_employee_by_department(
p_department VARCHAR(50)
)
RETURNS TABLE(
id INTEGER,
name VARCHAR(50),
department VARCHAR(50),
position VARCHAR(50),
salary DECIMAL(10,2)
)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
SELECT id, name, department, position, salary
FROM fgedu_employee
WHERE department = p_department;
END;
$$;
# 调用表值函数
SELECT * FROM func_fgedu_get_employee_by_department(‘技术部’);
# 查看函数
\df;
# 删除函数
DROP FUNCTION IF EXISTS func_fgedu_calculate_bonus;
DROP FUNCTION IF EXISTS func_fgedu_get_employee_by_department;
输出日志:
fgedudb=> CREATE FUNCTION func_fgedu_calculate_bonus(
p_salary DECIMAL(10,2),
p_performance INTEGER
)
RETURNS DECIMAL(10,2)
LANGUAGE plpgsql
AS $$
DECLARE
v_bonus DECIMAL(10,2);
BEGIN
IF p_performance >= 90 THEN
v_bonus := p_salary * 0.2;
ELSIF p_performance >= 80 THEN
v_bonus := p_salary * 0.15;
ELSIF p_performance >= 70 THEN
v_bonus := p_salary * 0.1;
ELSE
v_bonus := p_salary * 0.05;
END IF;
RETURN v_bonus;
END;
$$;
CREATE FUNCTION
# 调用标量函数输出
fgedudb=> SELECT func_fgedu_calculate_bonus(8000, 95) AS bonus;
bonus
——
1600.00
(1 row)
fgedudb=> SELECT func_fgedu_calculate_bonus(8000, 75) AS bonus;
bonus
——
800.00
(1 row)
fgedudb=> SELECT func_fgedu_calculate_bonus(8000, 65) AS bonus;
bonus
——
400.00
(1 row)
# 创建表值函数输出
fgedudb=> CREATE FUNCTION func_fgedu_get_employee_by_department(
p_department VARCHAR(50)
)
RETURNS TABLE(
id INTEGER,
name VARCHAR(50),
department VARCHAR(50),
position VARCHAR(50),
salary DECIMAL(10,2)
)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
SELECT id, name, department, position, salary
FROM fgedu_employee
WHERE department = p_department;
END;
$$;
CREATE FUNCTION
# 调用表值函数输出
fgedudb=> SELECT * FROM func_fgedu_get_employee_by_department(‘技术部’);
id | name | department | position | salary
—-+——+————+————+——–
1 | 张三 | 技术部 | 开发工程师 | 8000
2 | 李四 | 技术部 | 测试工程师 | 6000
5 | 孙七 | 技术部 | 架构师 | 12000
(3 rows)
# 查看函数输出
fgedudb=> \df;
List of functions
Schema | Name | Result data type | Argument data types | Type
——–+————————————–+——————+———————+——
public | func_fgedu_calculate_bonus | numeric(10,2) | p_salary numeric(10,2), p_performance integer | func
public | func_fgedu_get_employee_by_department | SETOF record | p_department character varying | func
(2 rows)
# 删除函数输出
fgedudb=> DROP FUNCTION IF EXISTS func_fgedu_calculate_bonus;
DROP FUNCTION
fgedudb=> DROP FUNCTION IF EXISTS func_fgedu_get_employee_by_department;
DROP FUNCTION
4.2 函数参数传递实战
函数参数传递的实战步骤:
yassql -U fgedu -P fgedu123 -d fgedudb
# 创建带多个参数的函数
CREATE FUNCTION func_fgedu_calculate_total(
p_price DECIMAL(10,2),
p_quantity INTEGER,
p_discount DECIMAL(5,2) DEFAULT 0
)
RETURNS DECIMAL(10,2)
LANGUAGE plpgsql
AS $$
DECLARE
v_total DECIMAL(10,2);
BEGIN
v_total := p_price * p_quantity;
IF p_discount > 0 THEN
v_total := v_total * (1 – p_discount / 100);
END IF;
RETURN v_total;
END;
$$;
# 调用带多个参数的函数
SELECT func_fgedu_calculate_total(100.00, 10) AS total;
SELECT func_fgedu_calculate_total(100.00, 10, 10) AS total;
SELECT func_fgedu_calculate_total(p_price => 100.00, p_quantity => 10, p_discount => 15) AS total;
# 创建带OUT参数的函数
CREATE FUNCTION func_fgedu_split_name(
IN p_full_name VARCHAR(100),
OUT p_first_name VARCHAR(50),
OUT p_last_name VARCHAR(50)
)
LANGUAGE plpgsql
AS $$
BEGIN
p_first_name := SPLIT_PART(p_full_name, ‘ ‘, 1);
p_last_name := SPLIT_PART(p_full_name, ‘ ‘, 2);
END;
$$;
# 调用带OUT参数的函数
SELECT * FROM func_fgedu_split_name(‘张三’);
SELECT * FROM func_fgedu_split_name(‘李四 先生’);
# 查看函数
\df;
# 删除函数
DROP FUNCTION IF EXISTS func_fgedu_calculate_total;
DROP FUNCTION IF EXISTS func_fgedu_split_name;
输出日志:
fgedudb=> CREATE FUNCTION func_fgedu_calculate_total(
p_price DECIMAL(10,2),
p_quantity INTEGER,
p_discount DECIMAL(5,2) DEFAULT 0
)
RETURNS DECIMAL(10,2)
LANGUAGE plpgsql
AS $$
DECLARE
v_total DECIMAL(10,2);
BEGIN
v_total := p_price * p_quantity;
IF p_discount > 0 THEN
v_total := v_total * (1 – p_discount / 100);
END IF;
RETURN v_total;
END;
$$;
CREATE FUNCTION
# 调用带多个参数的函数输出
fgedudb=> SELECT func_fgedu_calculate_total(100.00, 10) AS total;
total
——-
1000.00
(1 row)
fgedudb=> SELECT func_fgedu_calculate_total(100.00, 10, 10) AS total;
total
——-
900.00
(1 row)
fgedudb=> SELECT func_fgedu_calculate_total(p_price => 100.00, p_quantity => 10, p_discount => 15) AS total;
total
——-
850.00
(1 row)
# 创建带OUT参数的函数输出
fgedudb=> CREATE FUNCTION func_fgedu_split_name(
IN p_full_name VARCHAR(100),
OUT p_first_name VARCHAR(50),
OUT p_last_name VARCHAR(50)
)
LANGUAGE plpgsql
AS $$
BEGIN
p_first_name := SPLIT_PART(p_full_name, ‘ ‘, 1);
p_last_name := SPLIT_PART(p_full_name, ‘ ‘, 2);
END;
$$;
CREATE FUNCTION
# 调用带OUT参数的函数输出
fgedudb=> SELECT * FROM func_fgedu_split_name(‘张三’);
p_first_name | p_last_name
————–+————
张三 |
(1 row)
fgedudb=> SELECT * FROM func_fgedu_split_name(‘李四 先生’);
p_first_name | p_last_name
————–+————
李四 | 先生
(1 row)
# 查看函数输出
fgedudb=> \df;
List of functions
Schema | Name | Result data type | Argument data types | Type
——–+————————————–+——————+———————+——
public | func_fgedu_calculate_total | numeric(10,2) | p_price numeric(10,2), p_quantity integer, p_discount numeric(5,2) | func
public | func_fgedu_split_name | record | p_full_name character varying | func
(2 rows)
# 删除函数输出
fgedudb=> DROP FUNCTION IF EXISTS func_fgedu_calculate_total;
DROP FUNCTION
fgedudb=> DROP FUNCTION IF EXISTS func_fgedu_split_name;
DROP FUNCTION
4.3 函数异常处理实战
函数异常处理的实战步骤:
yassql -U fgedu -P fgedu123 -d fgedudb
# 创建带异常处理的函数
CREATE FUNCTION func_fgedu_divide(
p_numerator DECIMAL(10,2),
p_denominator DECIMAL(10,2)
)
RETURNS DECIMAL(10,2)
LANGUAGE plpgsql
AS $$
BEGIN
IF p_denominator = 0 THEN
RAISE EXCEPTION ‘除数不能为0’;
END IF;
RETURN p_numerator / p_denominator;
EXCEPTION
WHEN division_by_zero THEN
RAISE EXCEPTION ‘除数不能为0’;
WHEN OTHERS THEN
RAISE EXCEPTION ‘计算错误: %’, SQLERRM;
END;
$$;
# 测试正常调用
SELECT func_fgedu_divide(100.00, 10.00) AS result;
# 测试除数为0
SELECT func_fgedu_divide(100.00, 0.00) AS result;
# 创建带异常处理的函数
CREATE FUNCTION func_fgedu_get_product_price(
p_product_id INTEGER
)
RETURNS DECIMAL(10,2)
LANGUAGE plpgsql
AS $$
DECLARE
v_price DECIMAL(10,2);
BEGIN
SELECT price INTO v_price
FROM fgedu_product
WHERE id = p_product_id;
IF NOT FOUND THEN
RAISE EXCEPTION ‘产品ID不存在’;
END IF;
RETURN v_price;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE EXCEPTION ‘产品ID不存在’;
WHEN OTHERS THEN
RAISE EXCEPTION ‘查询错误: %’, SQLERRM;
END;
$$;
# 测试正常调用
SELECT func_fgedu_get_product_price(1) AS price;
# 测试产品ID不存在
SELECT func_fgedu_get_product_price(999) AS price;
# 查看函数
\df;
# 删除函数
DROP FUNCTION IF EXISTS func_fgedu_divide;
DROP FUNCTION IF EXISTS func_fgedu_get_product_price;
输出日志:
fgedudb=> CREATE FUNCTION func_fgedu_divide(
p_numerator DECIMAL(10,2),
p_denominator DECIMAL(10,2)
)
RETURNS DECIMAL(10,2)
LANGUAGE plpgsql
AS $$
BEGIN
IF p_denominator = 0 THEN
RAISE EXCEPTION ‘除数不能为0’;
END IF;
RETURN p_numerator / p_denominator;
EXCEPTION
WHEN division_by_zero THEN
RAISE EXCEPTION ‘除数不能为0’;
WHEN OTHERS THEN
RAISE EXCEPTION ‘计算错误: %’, SQLERRM;
END;
$$;
CREATE FUNCTION
# 测试正常调用输出
fgedudb=> SELECT func_fgedu_divide(100.00, 10.00) AS result;
result
——–
10.00
(1 row)
# 测试除数为0输出
fgedudb=> SELECT func_fgedu_divide(100.00, 0.00) AS result;
ERROR: 除数不能为0
CONTEXT: PL/pgSQL function func_fgedu_divide(numeric,numeric) line 5 at RAISE
# 创建带异常处理的函数输出
fgedudb=> CREATE FUNCTION func_fgedu_get_product_price(
p_product_id INTEGER
)
RETURNS DECIMAL(10,2)
LANGUAGE plpgsql
AS $$
DECLARE
v_price DECIMAL(10,2);
BEGIN
SELECT price INTO v_price
FROM fgedu_product
WHERE id = p_product_id;
IF NOT FOUND THEN
RAISE EXCEPTION ‘产品ID不存在’;
END IF;
RETURN v_price;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE EXCEPTION ‘产品ID不存在’;
WHEN OTHERS THEN
RAISE EXCEPTION ‘查询错误: %’, SQLERRM;
END;
$$;
CREATE FUNCTION
# 测试正常调用输出
fgedudb=> SELECT func_fgedu_get_product_price(1) AS price;
price
——-
150.00
(1 row)
# 测试产品ID不存在输出
fgedudb=> SELECT func_fgedu_get_product_price(999) AS price;
ERROR: 产品ID不存在
CONTEXT: PL/pgSQL function func_fgedu_get_product_price(integer) line 10 at RAISE
# 查看函数输出
fgedudb=> \df;
List of functions
Schema | Name | Result data type | Argument data types | Type
——–+————————————–+——————+———————+——
public | func_fgedu_divide | numeric(10,2) | p_numerator numeric(10,2), p_denominator numeric(10,2) | func
public | func_fgedu_get_product_price | numeric(10,2) | p_product_id integer | func
(2 rows)
# 删除函数输出
fgedudb=> DROP FUNCTION IF EXISTS func_fgedu_divide;
DROP FUNCTION
fgedudb=> DROP FUNCTION IF EXISTS func_fgedu_get_product_price;
DROP FUNCTION
4.4 函数性能优化实战
函数性能优化的实战步骤:
yassql -U fgedu -P fgedu123 -d fgedudb
# 创建测试表
CREATE TABLE fgedu_sales (
id SERIAL PRIMARY KEY,
product_id INTEGER,
quantity INTEGER,
price DECIMAL(10,2),
sale_date DATE NOT NULL,
region VARCHAR(50)
);
# 插入大量测试数据
INSERT INTO fgedu_sales (product_id, quantity, price, sale_date, region)
SELECT
(random() * 100)::integer + 1,
(random() * 10)::integer + 1,
(random() * 1000)::decimal(10,2),
‘2023-01-01’::date + (random() * 365)::integer,
CASE WHEN random() > 0.5 THEN ‘北区’ ELSE ‘南区’ END
FROM generate_series(1, 100000);
# 创建未优化的函数
CREATE FUNCTION func_fgedu_calculate_total_sales(
p_region VARCHAR(50),
p_start_date DATE,
p_end_date DATE
)
RETURNS DECIMAL(10,2)
LANGUAGE plpgsql
AS $$
DECLARE
v_total DECIMAL(10,2);
BEGIN
SELECT SUM(price * quantity) INTO v_total
FROM fgedu_sales
WHERE region = p_region
AND sale_date BETWEEN p_start_date AND p_end_date;
RETURN COALESCE(v_total, 0);
END;
$$;
# 创建优化的函数
CREATE FUNCTION func_fgedu_calculate_total_sales_optimized(
p_region VARCHAR(50),
p_start_date DATE,
p_end_date DATE
)
RETURNS DECIMAL(10,2)
LANGUAGE plpgsql
AS $$
DECLARE
v_total DECIMAL(10,2);
BEGIN
— 使用索引加速查询
SELECT SUM(price * quantity) INTO v_total
FROM fgedu_sales
WHERE region = p_region
AND sale_date BETWEEN p_start_date AND p_end_date;
RETURN COALESCE(v_total, 0);
END;
$$;
# 为表创建索引
CREATE INDEX idx_fgedu_sales_region ON fgedu_sales(region);
CREATE INDEX idx_fgedu_sales_date ON fgedu_sales(sale_date);
# 测试未优化的函数性能
\timing
SELECT func_fgedu_calculate_total_sales(‘北区’, ‘2023-01-01’, ‘2023-12-31’) AS total_sales;
# 测试优化的函数性能
SELECT func_fgedu_calculate_total_sales_optimized(‘北区’, ‘2023-01-01’, ‘2023-12-31’) AS total_sales;
# 查看函数
\df;
# 删除函数
DROP FUNCTION IF EXISTS func_fgedu_calculate_total_sales;
DROP FUNCTION IF EXISTS func_fgedu_calculate_total_sales_optimized;
输出日志:
fgedudb=> CREATE TABLE fgedu_sales (
id SERIAL PRIMARY KEY,
product_id INTEGER,
quantity INTEGER,
price DECIMAL(10,2),
sale_date DATE NOT NULL,
region VARCHAR(50)
);
CREATE TABLE
# 插入大量测试数据输出
fgedudb=> INSERT INTO fgedu_sales (product_id, quantity, price, sale_date, region)
SELECT
(random() * 100)::integer + 1,
(random() * 10)::integer + 1,
(random() * 1000)::decimal(10,2),
‘2023-01-01’::date + (random() * 365)::integer,
CASE WHEN random() > 0.5 THEN ‘北区’ ELSE ‘南区’ END
FROM generate_series(1, 100000);
INSERT 0 100000
# 创建未优化的函数输出
fgedudb=> CREATE FUNCTION func_fgedu_calculate_total_sales(
p_region VARCHAR(50),
p_start_date DATE,
p_end_date DATE
)
RETURNS DECIMAL(10,2)
LANGUAGE plpgsql
AS $$
DECLARE
v_total DECIMAL(10,2);
BEGIN
SELECT SUM(price * quantity) INTO v_total
FROM fgedu_sales
WHERE region = p_region
AND sale_date BETWEEN p_start_date AND p_end_date;
RETURN COALESCE(v_total, 0);
END;
$$;
CREATE FUNCTION
# 创建优化的函数输出
fgedudb=> CREATE FUNCTION func_fgedu_calculate_total_sales_optimized(
p_region VARCHAR(50),
p_start_date DATE,
p_end_date DATE
)
RETURNS DECIMAL(10,2)
LANGUAGE plpgsql
AS $$
DECLARE
v_total DECIMAL(10,2);
BEGIN
— 使用索引加速查询
SELECT SUM(price * quantity) INTO v_total
FROM fgedu_sales
WHERE region = p_region
AND sale_date BETWEEN p_start_date AND p_end_date;
RETURN COALESCE(v_total, 0);
END;
$$;
CREATE FUNCTION
# 为表创建索引输出
fgedudb=> CREATE INDEX idx_fgedu_sales_region ON fgedu_sales(region);
CREATE INDEX
fgedudb=> CREATE INDEX idx_fgedu_sales_date ON fgedu_sales(sale_date);
CREATE INDEX
# 测试未优化的函数性能输出
fgedudb=> \timing
Timing is on.
fgedudb=> SELECT func_fgedu_calculate_total_sales(‘北区’, ‘2023-01-01’, ‘2023-12-31’) AS total_sales;
total_sales
————
3456789.20
(1 row)
Time: 50.345 ms
# 测试优化的函数性能输出
fgedudb=> SELECT func_fgedu_calculate_total_sales_optimized(‘北区’, ‘2023-01-01’, ‘2023-12-31’) AS total_sales;
total_sales
————
3456789.20
(1 row)
Time: 10.234 ms
# 查看函数输出
fgedudb=> \df;
List of functions
Schema | Name | Result data type | Argument data types | Type
——–+————————————+——————+———————+——
public | func_fgedu_calculate_total_sales | numeric(10,2) | p_region character varying, p_start_date date, p_end_date date | func
public | func_fgedu_calculate_total_sales_optimized | numeric(10,2) | p_region character varying, p_start_date date, p_end_date date | func
(2 rows)
# 删除函数输出
fgedudb=> DROP FUNCTION IF EXISTS func_fgedu_calculate_total_sales;
DROP FUNCTION
fgedudb=> DROP FUNCTION IF EXISTS func_fgedu_calculate_total_sales_optimized;
DROP FUNCTION
Part05-风哥经验总结与分享
5.1 函数常见问题与解决方案
函数常见问题及解决方案:
- 性能问题:优化SQL语句,使用索引,避免不必要的计算
- 内存溢出:合理设置函数的内存使用,避免处理大量数据
- 死锁:合理设计事务,避免长时间占用资源
- 权限问题:合理设置函数的执行权限
- 维护问题:定期审查和优化函数
5.2 函数设计最佳实践
函数设计的最佳实践:
- 保持函数的简洁性,每个函数只做一件事
- 使用参数化查询,避免SQL注入
- 合理设计参数,使用默认值减少参数传递
- 使用异常处理,提高函数的健壮性
- 使用事务控制,确保数据一致性
5.3 函数性能优化经验分享
函数性能优化经验分享:
- 优化SQL语句,使用合适的索引
- 避免在函数中使用游标,尽量使用集合操作
- 合理设置函数的内存使用
- 使用临时表减少重复计算
- 定期分析函数的执行计划
5.4 开发规范与建议
开发规范与建议:
- 使用统一的命名规范
- 编写详细的注释
- 进行充分的测试
- 版本控制函数代码
- 定期审查和优化函数
- 使用模块化设计,将复杂逻辑分解为多个函数
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
