Skip to main content

代码整洁之道 - Robert C. Martin

lp6nDX

本书由面向对象技术专家 Robert C. Martin(Bob 大叔)撰写,是软件工程领域的经典著作。书中通过大量实例展示了如何编写可读性强、易于维护的高质量代码,提出了变量命名、函数设计、注释使用、代码格式等最佳实践。

关于作者

Robert C. Martin(Bob 大叔) 是软件工程领域的传奇人物:

  • 敏捷宣言发起人之一:2001 年参与起草敏捷软件开发宣言
  • 面向对象设计先驱:在 C++ 和 Java 领域有 40 余年从业经验
  • 技术作家:著有《代码整洁之道》《敏捷软件开发》《架构整洁之道》等经典著作
  • 演讲家:在全球各大技术会议发表主题演讲,影响数百万开发者
  • Clean Code 理念倡导者:推动代码质量职业素养运动

经典摘录

糟糕的代码或许能运行,但混乱的代码会拖垮整个开发团队。

你唯一知道的需求就是现在的需求。未来的需求来临时再去重构,不要过早优化。

代码的阅读次数远多于编写次数。编写代码时花在思考上的时间应该多于花在打字上的时间。

团队 velocity 下降的主要原因就是代码混乱。混乱的代码就像利息,时间越长,支付的利息就越高。

真正的敏捷意味着快速变化,而只有整洁的代码才能快速变化。

注释是代码失败的补偿。能不用注释就不要用,用代码本身表达意图。

核心原则

1. 有意义的命名

// 糟糕的命名
let d; // 经过的天数
let zy = 0;

// 好的命名
let elapsedDays = 0;
let retryCount = 0;

// 避免误导
const accountList = []; // 实际上是数组,不是 List 类型
const userInfoObject = {}; // 冗余

// 推荐
const accounts = [];
const user = {};

2. 函数设计

函数应该短小:理想的函数长度不超过 20 行

// 不好的做法:函数过长
function processUser(user) {
// 验证用户
if (!user || !user.id) {
throw new Error('Invalid user');
}
// 格式化名字
const firstName = user.firstName.trim();
const lastName = user.lastName.trim();
const fullName = `${firstName} ${lastName}`;
// 检查权限
if (!user.hasPermission('edit')) {
return null;
}
// 保存数据
database.save({ fullName, ...user });
// 发送通知
notification.send(user.email, 'Profile Updated');
// 记录日志
logger.info(`User ${user.id} updated profile`);
return { success: true };
}

// 推荐的做法:拆分为多个小函数
function processUser(user) {
validateUser(user);
const fullName = formatFullName(user);
checkPermission(user, 'edit');
saveUserData({ fullName, ...user });
sendUpdateNotification(user);
logUserActivity(user.id, 'profile_updated');
return { success: true };
}

3. 注释的正确使用

// 坏注释:重复代码
// 检查用户是否有效
if (user && user.id) {
// ...
}

// 坏注释:被删除的代码留下的注释
// TODO: 以后可能需要这个功能
// const oldFeature = getLegacyFeature();

// 好注释:解释为什么这样做
// 由于浏览器兼容性问题,需要使用 XMLHttpRequest 而不是 fetch
// 参考:https://github.com/issue/123
const request = new XMLHttpRequest();

// 好注释:警示后果
// 警告:这个测试会修改数据库,运行前请确保使用测试环境
runDatabaseTest();

4. 错误处理

// 不推荐:返回错误码
function divide(a, b) {
if (b === 0) {
return -1; // 错误码
}
return a / b;
}

// 推荐:抛出异常
function divide(a, b) {
if (b === 0) {
throw new DivisionByZeroError('除数不能为零');
}
return a / b;
}

// 更好的做法:使用 Try-Catch-Finally
try {
const result = riskyOperation();
processResult(result);
} catch (e) {
logger.error('Operation failed:', e);
notifyUser('操作失败,请稍后重试');
} finally {
cleanup();
}

读书心得

《代码整洁之道》不仅仅是一本技术书籍,更是一本关于职业素养的指南。Bob 大叔在书中反复强调:写出整洁的代码是程序员的职业责任,而不是可选项。

书中很多原则看似简单,但真正做到需要持续的练习和自我约束。特别是以下几点对我影响深远:

  1. 童子军规则:让营地比你来时更干净。每次修改代码时,都让它变得更好一点。

  2. 三步法则:先让它工作,再让它正确,最后让它快速。不要跳过前两步直接追求性能。

  3. 单一职责:一个函数只做一件事,一个类只有一个改变的理由。

在团队协作中,整洁的代码能显著降低沟通成本,提高开发效率。正如书中所说:混乱不是代码的必然产物,而是开发者懒惰和匆忙的结果。