菜单

函数行为

相关源文件

本文档详细介绍了 JavaScript 中管理函数行为的最佳实践,涵盖了单一职责、避免副作用和处理条件逻辑等原则。有关函数参数和形参的信息,请参阅 函数参数

函数行为原则概述

干净的函数遵循几个核心行为原则,这些原则使代码更易于阅读、维护和测试。这些原则构成了 JavaScript 应用程序中优秀函数设计的基础。

函数行为原则图

来源:README.md290-322 README.md595-696 README.md355-422 README.md800-907 README.md427-507 README.md1006-1035

单一职责原则

单一职责原则 (SRP) 可能是函数设计中最重要的规则。函数应该只做一件事,并做好。这使得它们更容易理解、测试和维护。

函数职责比较

来源:README.md290-322

实施指南

当函数具有单一职责时

  1. 它只执行一项任务或操作
  2. 它在单一抽象级别上运行
  3. 它可以用清晰、明确的目的来描述

坏例子:一个同时获取客户数据并发送电子邮件的函数违反了 SRP。

好例子:分解为专用函数——一个用于过滤活动客户,另一个用于实际的电子邮件发送过程。

来源:README.md290-322

避免副作用

副作用会使函数变得不可预测且更难测试。纯函数接收输入并返回输出,而不修改外部状态。

纯函数与非纯函数

来源:README.md595-696

常见的副作用

  1. 修改输入参数

    • 与其修改作为参数传递的数组或对象,不如创建并返回新的副本
  2. 修改全局状态

    • 避免在函数内更改全局变量
    • 相反,将所有所需数据作为参数传入并返回结果
  3. 意外的状态变异

    • 注意 JavaScript 的对象引用
    • 使用展开运算符或类似 Object.assign() 的方法来创建副本

来源:README.md595-696

状态变异示例

处理数组和对象(可变数据类型)时,请始终创建新的副本,而不是直接修改输入。

不良实践

良好实践

来源:README.md644-696

抽象和组织

函数应在一致的抽象级别上运行,并得到妥善组织,以创建可读的代码。

抽象级别图

来源:README.md355-422

正确抽象的指导原则

  1. 一致的抽象级别

    • 函数应调用同一抽象级别的其他函数
    • 不要将高级操作与低级实现细节混合
  2. 函数命名

    • 名称应清楚地表明函数的作用
    • 好的名称可以消除对解释性注释的需求
  3. 函数组织

    • 相关函数应在代码中分组
    • 辅助函数应靠近使用它们的函数

来源:README.md355-422 README.md427-507

处理条件

条件逻辑会迅速使函数变得复杂。干净的函数以保持清晰度和单一职责的方式处理条件。

条件逻辑方法

来源:README.md800-907

封装条件

将复杂的条件逻辑提取到具有描述性名称的函数中

良好

来源:README.md800-821

多态优先于复杂条件

在处理基于类型或属性的不同行为时,优先选择多态(使用类继承或对象组合),而不是复杂的 if/switch 语句。

示例:与其使用 switch 语句根据飞机类型确定飞行高度计算,不如为每种飞机类型创建专用类,并让它们各自实现高度计算方法。

来源:README.md851-907

函数式编程原则

JavaScript 支持函数式编程概念,这些概念可以带来更干净、更易于维护的代码。

函数式与命令式方法

函数式方法命令式方法
声明式风格过程式风格
使用 map、filter、reduce 等数组方法使用循环并变异变量
最小化状态更改经常修改外部状态
强调做什么强调如何做
更易于测试更难测试

来源:README.md735-796

实际示例

命令式(坏)

函数式(好)

来源:README.md735-796

代码维护注意事项

避免死代码

删除不再使用的代码,而不是将其注释掉。Git 等版本控制系统会保存您的历史记录,因此无需在注释中保留未使用的代码。

不要过度优化

过早优化会导致代码更复杂、可读性更差。现代 JavaScript 引擎已经优化了许多常见模式。

来源:README.md978-1035

实现模式与反模式

模式反模式为什么很重要
函数只做一件事具有多重职责的函数更易于测试、理解和维护
没有副作用的纯函数修改外部状态的函数可预测的行为,易于调试
一致的抽象级别混合高低级别操作更清晰的代码组织
封装的条件复杂的内联条件自文档化代码
描述性的函数名模糊或误导性的名称降低读者的认知负担
使用多态处理特定类型的行为大型 switch/if 语句更具扩展性的设计
使用默认对象手动属性检查更简洁,不易出错
函数式编程方法命令式状态变异不易因状态更改而出错

来源:README.md290-907

结论

函数行为是干净代码的关键方面。通过关注单一职责、避免副作用、保持一致的抽象级别以及妥善处理条件,您可以创建更容易理解、测试和维护的函数。

本文档中概述的原则为编写干净函数奠定了基础,这将使代码库随着时间的推移更易于维护,并减少处理代码的开发人员的认知负担。