为什么你的代码总是难读?可能是命名出了问题

📅 发布时间:2026/7/8 6:21:32 👁️ 浏览次数:
为什么你的代码总是难读?可能是命名出了问题
在阅读《重构改善既有代码的设计》时第一条坏味道就是Mysterious Name神秘命名。很多代码的问题其实不是逻辑复杂而是名字太差。好的命名应该清晰表达变量的用途和业务含义。在所有重构手法中改名Rename是最常用、也最值得投入时间的操作。如果你发现自己想不出一个好名字往往说明代码背后可能存在设计问题。一、为什么命名这么重要代码阅读的成本大部分来自理解变量含义。例如letdata{}letobj{}lettemp[]这些名字几乎没有提供任何信息。而如果写成letcustomer{}letorderList[]lettotalPrice0读者几乎不用思考就能理解代码。所以命名的本质是降低理解成本。二、如何命名实践经验结合书中的建议和自己的实践我总结了几个常用原则。1. 表达业务含义而不是技术细节不要写data obj tmp而是customer orderList totalPrice命名应该反映业务语义。2. 避免无意义缩写例如usr cfg msgLst可读性很差。更好的写法user config messageList除非是非常通用的缩写idurlapidb否则尽量避免。3. 命名体现数据结构名字最好能反映数据结构。例如customer // 单个对象 customers // 数组 customerList // 列表对于 Map / DictionarycustomerById userById productIndex这种命名在大型代码库中非常常见。4. 在 JS/TS 中补充类型信息《重构》里提到一句话在 JavaScript 这样的动态类型语言中我喜欢把类型信息也放进名字里。例如aCustomer我觉得这个实践在 JS / TS 中仍然有价值。常见命名模式单个对象customer aCustomer集合customers customerListMap / 字典customerMap customerById productIndex布尔值isActive hasPermission canEdit即使在TypeScript 时代命名依然重要。因为很多代码库虽然用了 TS但实际写法仍然接近 JS。而好的命名可以显著降低阅读成本。事实上很多源码如 Vue / React也大量采用这种实践。5. 根据作用域控制命名长度命名不是越长越好而是与作用域匹配。局部表达式例如array.map(xx.id)一个字母完全没问题。短函数参数functionsum(a, b){returna b}简短即可。跨函数或复杂业务变量如果变量在多个函数中使用就需要更明确的命名currentLoginUser selectedCustomerList pendingPaymentOrders三、封装变量Encapsulate Variable书中的另一个建议是如果变量被广泛使用可以考虑封装变量。核心思想是不要让变量被随意修改。例如letprice100改为functiongetPrice(){returnprice}functionsetPrice(value){pricevalue}这样可以控制修改入口降低耦合更容易维护本质上就是将数据访问收敛到函数中。四、注意“已发布变量”书中还有一个非常重要的概念Published Variable已发布变量如果变量已经被外部代码使用就不能随便重构。例如npm 包 APISDK 导出变量服务接口字段window/global 全局配置示例window.APP_CONFIG如果你直接重命名很可能会导致外部系统崩溃。正确做法应该是兼容迁移旧变量 -标记废弃 -用户迁移 -大版本删除例如// deprecated window.APP_CONFIGconfig window.appConfigconfig等用户迁移完成后在下一次 major version 删除旧变量。五、引申代码所有权边界这背后其实是一个更大的设计理念代码所有权边界Ownership Boundary一个真实系统往往包含librarySDKAPI服务数据库如果没有明确的边界就无法判断哪些代码可以安全重构哪些不可以。所以重构的前提是清楚代码的边界。六、安全重命名的一种技巧如果变量是不可变的可以采用一种更安全的方式重命名。例如const oldVarPUBLIC_KEY_STRING步骤1️⃣ 新建变量const newVarPUBLIC_KEY_STRINGconst oldVarnewVar2️⃣ 逐步替换使用代码3️⃣ 每次修改后运行测试4️⃣ 最终删除旧变量这样做的原因是JavaScript 可能存在动态访问obj[oldVar]如果直接替换很容易漏掉。因此重命名之后一定要跑测试。七、IDE 的重命名重构很多人会用全局搜索替换。但这其实不是重构功能很容易改错。现代 IDE 都支持语义级 Rename。常见快捷键IntelliJ IDEAShift F6VSCodeF2VSCode 依赖Language Server Protocol (LSP)才能正确识别符号引用。总结好的命名本质是让代码更容易理解。核心原则1️⃣ 表达业务语义而不是技术细节2️⃣ 避免无意义缩写3️⃣ 命名体现数据结构4️⃣ 在 JS/TS 中适当补充类型信息5️⃣ 根据作用域控制命名长度另外要注意已发布变量不要随便重构理解代码所有权边界使用 IDE 的 Rename 功能