javascript工具函数应是单一职责、无状态、纯函数的“螺丝钉”:按语义垂直拆分为过滤校验、转换组装、聚合计算、安全操作四类,参数≤3个且语义明确,命名动词开头直击行为,复杂逻辑抽为接口或柯里化函数。

在复杂业务中写 JavaScript 工具函数,关键不是“把一堆逻辑塞进一个函数”,而是让每个函数只做一件明确的事、不依赖外部状态、不修改输入、调用方能轻松替换或测试——它该是业务的“螺丝钉”,不是“总控台”。
按语义垂直拆分,拒绝万能工具函数
别写 utils.js 里堆满 formatDate、deepClone、getUserName 这类混杂逻辑的函数。复杂场景下,集合处理、数据转换、校验规则天然分层:
-
过滤与校验类(如
userFilter.js):只封装用户相关筛选逻辑,例如filterActiveUsers(users, { deptId })、hasDuplicateEmails(users) -
转换与组装类(如
orderDtoAssembler.js):专注OrderEntity[] → OrderSummary[],不查数据库、不发请求、不写日志 -
聚合计算类(如
metricsCalculator.js):提供sumTotalAmount(orders)、countByStatus(orders),输入纯数组,输出确定值 -
安全操作类(如
safeArrayUtils.js):专做空安全遍历、不可变合并、null-aware map 等,不掺业务含义
函数必须无状态、参数扁平、输入即输出
高内聚的前提是可预测。所有工具函数应是“纯函数”:相同输入,永远返回相同结果,不读写全局变量、不修改入参、不依赖时间或随机数。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 禁止用
static cache = new Map()在函数内部缓存——缓存策略由调用方或专用CacheService控制 - 参数控制在 3 个以内。优先接收原始数据 + 明确语义的对象,比如:
calculateUserScore(users, { minActiveDays: 7, weight: { login: 0.3, order: 0.7 } })
而不是传config或context这种模糊字段 - 对必填参数做前置校验:
if (!Array.isArray(users)) throw new TypeError('users must be an array'),不静默返回空数组或undefined
命名动词开头,直击行为意图
名字不是为了分类,而是为了告诉调用方“它干了什么”。一眼看懂,不用点进去查源码。
- ✅
toGroupedByDept(users)—— 动作(转为)、结构(按部门分组)、输入类型(users)全清晰 - ✅
removeExpiredAndLock(inventories, now)—— 两个动作、一个条件,语义完整 - ❌
process(users)、handleData(input)、utilMethod()—— 完全无法推断行为
用柯里化+接口隔离替代硬编码业务规则
当某个“工具函数”开始需要查 API、读 localStorage、判断风控状态时,说明它已超出工具范畴——这时要后退一步,把它变成接口或工厂函数。
- 用柯里化固化默认配置,返回预设行为的新函数:
const apiRequest = createRequest({ baseUrl: '/api', timeout: 5000 });<br>apiRequest({ url: '/users' }); - 对跨域/多租户等场景,支持多级柯里化:
const tenantApi = createClient({ auth: 'token' })({ tenantId: 't-123' }); - 真正复杂的规则(如“可发货订单”需查库存+验风控)应抽成接口:
interface ShippableOrderChecker { canShip(order: Order): Promise<boolean> }</boolean>,工具函数只负责调用它,不实现它
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










