Skip to main content

编写可维护的 JavaScript - Nicholas C. Zakas

J4ESp7

本书为 JavaScript 资深专家、《JavaScript 高级程序设计》作者 Nicholas C. Zakas 作品。JavaScript 代码的可维护性是决定项目长期成功的关键因素。本书从代码风格、编程惯例、自动化、测试、部署等方面介绍了如何编写可维护的 JavaScript 代码,帮助开发者构建高质量、可持续演进的大型 JavaScript 项目。

关于作者

Nicholas C. Zakas 是前端领域的权威专家,拥有丰富的从业经验和深厚的技术造诣:

  • Box 公司前首席前端架构师:负责构建和维护大规模 Web 应用
  • YUI 核心贡献者:曾参与 Yahoo! User Interface (YUI) 库的开发
  • 技术作家:著有《JavaScript 高级程序设计》《JavaScript 权威指南》等多本经典著作
  • ESLint 创始人:开发了 JavaScript 应用最广泛的代码检查工具,推动代码质量标准化
  • 社区影响力:长期倡导可维护代码实践,其著作被全球数百万开发者学习和参考

Zakas 以其清晰的技术表达和实用的工程建议闻名,他始终强调:代码的价值不在于它能被机器执行,而在于它能被人理解和维护。

经典摘录

任何傻瓜都能写出计算机可以理解的代码。唯有写出人类容易理解的代码,才是优秀的程序员。

可维护的代码是指:其他开发人员(或 6 个月后的你)能够快速理解、修改和调试的代码。

一致性是代码可读性的基石。当团队成员遵循相同的编码约定时,代码库看起来就像出自一人之手。

核心要点

1. 代码风格

  • 缩进:统一使用 4 个空格,不要混用 tab 和空格
  • 分号:始终使用分号终止语句,避免自动分号插入的陷阱
  • 命名:变量和函数使用驼峰式,构造函数使用大驼峰,常量使用大写蛇形
// 好的命名
var itemCount = 0;
function calculateTotalPrice() { }
const MAX_RETRY_COUNT = 3;

// 避免的命名
var item_count = 0; // 风格不一致
function CalculateTotalPrice() { } // 易与构造函数混淆
var maxretrycount = 3; // 难以阅读

2. 松散耦合

模块之间应保持独立,避免循环依赖和全局变量污染:

// 不推荐:紧耦合
function processOrder(order) {
// 直接依赖全局对象
AppConfig.api.sendOrder(order);
UIModule.updateOrderStatus(order.id);
}

// 推荐:依赖注入
function processOrder(order, apiClient, uiUpdater) {
apiClient.sendOrder(order);
uiUpdater.updateOrderStatus(order.id);
}

3. 防御性编程

始终假设输入可能无效,提前验证参数:

// 不推荐:没有参数验证
function getUserById(id) {
return database.find(id);
}

// 推荐:防御性编程
function getUserById(id) {
if (typeof id !== 'number' || id <= 0) {
throw new TypeError('Expected a positive number for id');
}
return database.find(id);
}

4. 错误处理

// 不推荐:吞掉错误
try {
riskyOperation();
} catch (e) {
// 什么都不做
}

// 推荐:记录并处理错误
try {
riskyOperation();
} catch (e) {
console.error('Operation failed:', e.message);
throw e; // 或返回默认值
}

读书心得

这本书虽然出版于 2013 年,但其中关于可维护性的原则至今仍适用。书中强调的代码一致性文档重要性测试覆盖率等理念,是现代前端工程化的基石。

特别是在团队协作中,遵循统一的编码规范比个人的编程习惯更重要。正如作者所说:"代码写出来是要被人阅读的,其次才是让机器执行。"