Clean Code 读书笔记

引言

前阵子把《Clean Code》又刷了一遍,这本书算是编程界的经典了,Robert C. Martin 大叔写的。之前刚入行的时候读过,当时觉得挺有道理,但很多点没真正理解透彻。这次重读,发现以前踩过的坑、见过的烂代码,简直就是书里活生生的例子。今天把我的笔记整理一下,分享给还没读过的朋友,咱们一起聊聊这本书的核心观点。

命名的重要性

先说说命名吧。很多人觉得变量名随便起一个就好,反正是给自己看的。但我告诉你,代码是写给人看的,顺带让机器执行一下而已。

书里有句话特别有意思:"代码的命名就是最小的注释"。想想看,如果你看到这样的代码:

d = 12  # 天数

你是不是想问,这 d 到底是啥?但如果你写成:

days_since_last_login = 12

是不是一目了然?

我总结了几个起名的原则:

- 名符其实:名字要能说明白它是什么,别藏着掖着

- 避免误导:别用 accountList 结果是个数组,数组本身不是 List

- 做有意义的区分a1, a2, a3 这种名字等于没起

- 使用可读的命名:别为了省字符搞缩写,除非是众所周知的

函数的艺术

接下来聊聊函数。这本书对函数的描述让我印象特别深:"函数应该做一件事,并且做好这件事"

什么意思呢?就是你别写一个函数又是验证输入、又是处理业务逻辑、又是写数据库、还顺带发个邮件。这谁受得了?

还有几个小技巧特别实用:

1. 函数要短:理想情况下,一个函数不超过 20 行。当然这不是硬性规定,但越短越容易理解和测试

2. 一个函数只做一层抽象:别一会儿是高层逻辑,一会又深入细节

3. 参数越少越好:没有参数最好,一个两个也能接受,三个以上就是危险信号了

看个例子感受一下:

// 糟糕的写法

public void processUser(String name, String email, String phone,

String address, boolean sendEmail) {

// 验证、存储、发邮件全混在一起...

}

// 好的写法

public void registerUser(User user) {

validateUser(user);

saveUser(user);

if (user.wantsNotification()) {

sendWelcomeEmail(user);

}

}

是不是清晰多了?

注释与代码

这部分我以前理解错了。我以为写注释是个好习惯,结果书里告诉我:"最好的注释就是没有注释"

别急,听我解释。书里不是说你不能写注释,而是说如果你需要用注释来解释代码在做什么,那说明你的代码本身写得不够清楚。注释是用来解释为什么这么做的,而不是解释做了什么

看看这两种:

// 糟糕

// 遍历用户列表

users.forEach(user => {

// 检查是否成年

if (user.age >= 18) {

// 添加到结果

result.push(user);

}

});

// 好的

// 法律规定未满18岁不能参与活动

const eligibleUsers = users.filter(user => user.isAdult());

第二种代码本身就是文档,注释只是补充背景信息。

还有几种注释是书里明确反对的:

- 过时的注释(代码改了,注释没改)

- 标记性的注释(比如 // TODO: fix this 放了一年)

- 注释掉的代码(直接删掉不行吗?)

格式化与可读性

这个可能很多人忽视。我以前觉得代码能跑就行,格式不重要。后来看了项目里有人用不同的缩进风格、有的行尾加空格有的不加,合并代码的时候那叫一个酸爽。

书里强调的一致性原则我特别认同:

- 垂直方向:相关的代码放在一起,变量声明靠近使用位置

- 水平方向:保持一致的缩进,运算符周围加空格

- 团队统一:整个团队用同一套格式化规则

现在很多 IDE 都支持自动格式化,Prettier、ESLint 这些工具用起来,别手动调了。

错误处理

最后聊聊错误处理。这部分我以前也做得不好,经常 try-catch 抓个异常然后啥也不干,或者直接 e.printStackTrace()

书里给了我几个思路:

1. 别返回 null:返回空集合或者用 Optional,也别传 null 进去

2. 异常要具体:别什么错都抛 Exception,具体问题具体对待

3. try-catch 要封装:把业务逻辑和错误处理分开,别混在一起

# 不好的写法

try:

result = risky_operation()

except Exception as e:

print(e) # 然后呢?

好的写法

def get_user(user_id):

try:

return user_repository.find(user_id)

except UserNotFoundError:

return None # 或者抛出更具体的异常让上层处理

总结

读完这本书最大的感受是:代码是写给人看的。我们花的时间大部分不是写新代码,而是读旧代码、改旧代码。所以让代码干净、易读,其实是在帮未来的自己,也是在帮团队的同事。

这本书不教你怎么实现某个功能,它教的是怎么把代码写得更专业。如果你刚入行,强烈建议读一读;如果你工作几年了,重读一遍也会有新的收获。毕竟,代码质量这件事,永远都有进步空间。

好了,这就是我的笔记,希望对你有帮助。咱们评论区聊聊,你遇到过哪些让你头疼的"烂代码"?