为什么代码整洁很重要
“花在阅读代码和编写代码上的时间比例远超 10:1。” —— Robert C. Martin
我们大部分时间都在阅读代码,而不是写代码。整洁的代码让阅读更轻松,让维护成本更低,让 Bug 更少。
有意义的命名
避免误导
// ❌ 坏命名
const d: number; // 消逝的时间?距离?数据?
const accountList: Account[]; // 如果不是 List 类型呢?
let a = 1, l = 1, I = 1; // 看起来一样
// ✅ 好命名
const elapsedTimeInDays: number;
const accounts: Account[];
使用可搜索的名称
// ❌ 难以搜索
for (let i = 0; i < 34; i++) {
// 34 是什么?
}
// ✅ 意图明确
const MAX_CLASSES_PER_STUDENT = 34;
for (let i = 0; i < MAX_CLASSES_PER_STUDENT; i++) {
// ...
}
函数应该短小精悍
第一规则:函数应该短小
// ❌ 一个函数做了太多事
function processUser(users: User[]) {
users.forEach(user => {
if (user.active) {
if (user.age > 18) {
if (user.role === 'admin') {
// 30 行代码...
}
}
}
});
}
// ✅ 拆分为小函数
function processUsers(users: User[]): void {
users
.filter(isActiveAdultAdmin)
.forEach(processAdminUser);
}
function isActiveAdultAdmin(user: User): boolean {
return user.active && user.age > 18 && user.role === 'admin';
}
函数应该只做一件事
判断标准:你能否将函数中的部分代码提取为独立的函数? 如果能,它就做了不止一件事。
注释的哲学
好注释
- 法律信息
- 对意图的解释
- 警告
- TODO 注释
坏注释
// ❌ 多余的注释
// 创建用户
function createUser() { }
// ❌ 误导性注释
// 检查用户是否有效
function validateUser(user) {
return user.name !== ''; // 实际只检查了 name
}
// ✅ 用代码表达意图
function isUserNameProvided(user: User): boolean {
return user.name.trim().length > 0;
}
错误处理
// ❌ 嵌套的错误处理
function getData() {
try {
const data = fetch();
try {
const parsed = parse(data);
return parsed;
} catch (e) {
log(e);
return null;
}
} catch (e) {
log(e);
return null;
}
}
// ✅ 抽取错误处理
function getData(): Result<Data> {
return Result.try(() => parse(fetch()));
}
对我编程习惯的改变
读完这本书后,我开始刻意练习:
- 命名时多花 30 秒 — 好名字胜过好注释
- 函数限制在 20 行内 — 超过就考虑拆分
- 参数不超过 3 个 — 超过就用对象封装
- 消除嵌套 — 用 early return 减少层级
总结
整洁代码的核心原则:
- 可读性优先 — 代码是写给人看的
- 单一职责 — 每个函数/类只做一件事
- 表达意图 — 用命名和结构代替注释
- 持续重构 — 让代码随时间变得更好
“让你的代码比你接手时更干净。” —— 童子军规则