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

本书为 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 年,但其中关于可维护性的原则至今仍适用。书中强调的代码一致性、文档重要性、测试覆盖率等理念,是现代前端工程化的基石。
特别是在团队协作中,遵循统一的编码规范比个人的编程习惯更重要。正如作者所说:"代码写出来是要被人阅读的,其次才是让机器执行。"