核心一句话总结
代码整洁不是“强迫症”,是让你少加班、少背锅、少被同事吐槽的“保命技能”,本质是把代码写得“人能看懂、机能运行、后续好改”,拒绝“屎山代码”从这本书开始。
适合人群
刚入行的编程小白(避免走歪路)、写代码全靠“凑活”的中级程序员(拯救你的烂代码)、被祖传代码折磨的资深开发者(学会重构救赎自己);不适合追求“炫技”、觉得“能跑就行”的摆烂选手。
最大收获
告别“写时爽、改时亡”的痛苦,掌握代码命名、函数、类、注释的底层逻辑,学会用整洁代码降低维护成本,甚至靠优雅的代码提升职场竞争力(毕竟没人愿意和写“垃圾代码”的人组队)。
开篇灵魂拷问:你写的代码,3个月后自己还能看懂吗?
相信每个程序员都有过这样的崩溃时刻:3个月前赶项目写的代码,今天打开一看——“这是谁写的?逻辑乱七八糟,变量名鬼都看不懂,注释更是一句没有”,愣了半天发现:哦,原来是我自己写的。
《代码整洁之道》的作者罗伯特·马丁(老马丁),就是看不惯大家写“烂代码”,专门写了这本书“治病救人”。他开篇就吐槽:“很多程序员觉得‘代码能跑就行’,殊不知,糟糕的代码就像家里的垃圾,堆得越多,清理起来越费劲,最后要么自己跑路,要么逼走同事”。
本章核心:代码的“可读性”比“可运行性”更重要——代码是写给人看的,机器只是顺便能跑;整洁的代码,是程序员的基本素养,也是团队协作的“通行证”。
核心干货:整洁代码的6个“保命技巧”(附反例+正例,一看就会)
技巧1:命名——别瞎起名字,不然同事会骂你“没文化”
老马丁说:“好的命名,本身就是注释”。很多程序员犯的最大错误,就是给变量、函数、类起名字太随意,比如用a、b、c、temp、aaa这种“密码式”命名,仿佛在给后人“埋坑”。
❌ 反面例子(看完想打人):
// 请问这个函数是干嘛的?变量a、b、c是什么?鬼知道!
public int f(int a, int b) {
int c = a + b;
return c * 2;
}
✅ 正面例子(清爽到哭):
// 命名直接说明功能,不用额外注释
public int calculateDoubleSum(int firstNumber, int secondNumber) {
int sum = firstNumber + secondNumber;
return sum * 2;
}
重点提炼:
- 变量/函数/类名,要“见名知意”,用完整的英文单词,别用缩写(除非是大家公认的,比如URL、ID);
- 避免“模糊命名”,比如不用data、info、value这种万能词,要具体(比如userName、orderId);
- 命名要统一风格,比如驼峰命名(userName)、帕斯卡命名(ClassName),别混着来(不然像穿衣服乱搭)。
实践指南:
以后写代码,先想3秒“这个名字能让同事一眼看懂吗?”,想不通就换,别嫌麻烦——毕竟,你今天偷的懒,明天就要花10倍时间补。
技巧2:函数——别写“超级无敌巨无霸函数”,拆分才是王道
有没有见过这样的代码:一个函数写了500行,从头读到尾,眼睛都花了,不知道它到底做了什么;改一个小bug,牵一发而动全身,改完还出一堆新问题。这就是“巨无霸函数”的危害,老马丁骂它是“代码界的垃圾食品”——吃着方便(写的时候不用动脑子),消化起来巨难。
核心原则:一个函数只做一件事,并且把这件事做好。函数的长度最好控制在20行以内,超过就拆分,别硬撑。
❌ 反面例子(巨无霸现场):
// 一个函数又查用户、又判断权限、又返回结果,乱成一锅粥
public String userLogin(String username, String password) {
// 1. 查数据库
User user = userDao.selectByUsername(username);
if (user == null) {
return "用户不存在";
}
// 2. 判断密码
if (!user.getPassword().equals(password)) {
return "密码错误";
}
// 3. 判断权限
if (user.getRole() != 1) {
return "没有登录权限";
}
// 4. 生成token
String token = JwtUtil.generateToken(user.getId());
return token;
}
✅ 正面例子(拆分后清爽无比):
// 拆分后,每个函数只做一件事,逻辑清晰,改起来也方便
public String userLogin(String username, String password) {
User user = getUserByUsername(username);
checkUserExists(user);
checkPassword(user, password);
checkUserPermission(user);
return generateLoginToken(user);
}
// 查用户
private User getUserByUsername(String username) {
return userDao.selectByUsername(username);
}
// 检查用户是否存在
private void checkUserExists(User user) {
if (user == null) {
throw new RuntimeException("用户不存在");
}
}
// 检查密码
private void checkPassword(User user, String password) {
if (!user.getPassword().equals(password)) {
throw new RuntimeException("密码错误");
}
}
// 检查权限
private void checkUserPermission(User user) {
if (user.getRole() != 1) {
throw new RuntimeException("没有登录权限");
}
}
// 生成token
private String generateLoginToken(Long userId) {
return JwtUtil.generateToken(userId);
}
实践指南:
写函数时,时刻问自己“这个函数是不是只做了一件事?”,如果有“并且、还有、另外”这种词,就说明该拆分了。拆分后的函数,不仅好读,还方便复用和测试——比如生成token的函数,其他地方也能直接用,不用重复写代码。
技巧3:注释——别写“废话注释”,也别写“没注释”
很多程序员对注释有两个极端:要么一句注释没有,让别人猜破头;要么写一堆废话注释,比如“// 定义一个变量a”“// 循环从0到10”,纯属浪费空间。老马丁说:“注释的作用是解释‘为什么这么做’,而不是‘做了什么’——代码本身就应该说明‘做了什么’”。
❌ 反面例子(废话+无意义):
// 定义一个变量i,用于循环
int i = 0;
// 循环10次
for (i = 0; i < 10; i++) {
// 打印i的值
System.out.println(i);
}
✅ 正面例子(注释精准,直击重点):
// 循环10次,用于初始化用户默认权限(因权限表需批量插入基础数据)
for (int i = 0; i < 10; i++) {
System.out.println("初始化权限:" + i);
}
重点提炼:
- 不写“废话注释”:代码能看懂的,坚决不写注释;
- 必写“关键注释”:复杂的逻辑、特殊的处理、临时的妥协(比如“这里这么写是为了兼容旧版本,后续要优化”),必须写注释;
- 注释要及时更新:代码改了,注释也要改,别让注释和代码“脱节”(不然会误导别人,比没注释还坑)。
技巧4:类——别写“万能类”,要做“专一的类”
就像人不能既要当医生、又要当老师、还要当厨师一样,类也不能“什么都干”。很多程序员喜欢写一个“万能类”,比如叫Utils、Common、Tool,里面塞了各种不相干的方法,从字符串处理到数据库操作,从文件上传到加密解密,堪称“代码杂货铺”。
核心原则:单一职责原则——一个类只负责一个功能领域,比如User类只处理用户相关的逻辑,Order类只处理订单相关的逻辑,别混在一起。
❌ 反面例子(万能类灾难):
// 万能工具类,什么都干,后续维护就是噩梦
public class CommonUtils {
// 字符串处理
public static String trim(String str) {
return str.trim();
}
// 数据库查询
public static User selectUser(Long id) {
return userDao.selectById(id);
}
// 文件上传
public static String uploadFile(MultipartFile file) {
// 上传逻辑
}
// 加密
public static String encrypt(String str) {
// 加密逻辑
}
}
✅ 正面例子(类职责单一):
// 只处理字符串相关逻辑
public class StringUtils {
public static String trim(String str) {
return str.trim();
}
public static boolean isEmpty(String str) {
return str == null || str.length() == 0;
}
}
// 只处理用户相关逻辑
public class UserDao {
public User selectById(Long id) {
return jdbcTemplate.queryForObject("select * from user where id = ?", new Object[]{id}, new BeanPropertyRowMapper<>(User.class));
}
}
实践指南:
创建类之前,先想清楚“这个类的核心职责是什么?”,如果有两个以上不相关的功能,就拆分出多个类。这样做的好处是,后续修改某个功能时,不会影响到其他功能,也方便测试和复用。
技巧5:错误处理——别用try-catch“掩盖错误”,要优雅处理
很多程序员写错误处理,就像“鸵鸟埋头”——用try-catch把错误包起来,然后什么都不做,或者只打印一句“出错了”,这样的代码,出了问题根本找不到原因,排查起来比登天还难。
老马丁说:“错误处理也是代码的一部分,要优雅、清晰,让别人知道错误是什么、为什么出错、怎么解决”。
❌ 反面例子(错误处理摆烂):
try {
// 可能出错的代码
userDao.insert(user);
} catch (Exception e) {
// 啥也不做,掩盖错误
}
✅ 正面例子(优雅处理错误):
try {
userDao.insert(user);
} catch (DuplicateKeyException e) {
// 明确错误类型,给出具体提示,方便排查
log.error("用户插入失败:用户名已存在,用户名={}", user.getUsername(), e);
throw new BusinessException("用户名已存在,请更换用户名");
} catch (Exception e) {
// 其他未知错误,记录日志,抛出通用异常
log.error("用户插入失败:未知错误,用户信息={}", JSON.toJSONString(user), e);
throw new RuntimeException("系统异常,请联系管理员");
}
重点提炼:
- 不要捕获所有异常(catch (Exception e)),要精准捕获具体的异常(比如DuplicateKeyException、NullPointerException);
- 捕获异常后,要记录日志(包含错误信息、上下文,比如用户信息、参数),方便排查;
- 不要掩盖错误,要抛出有意义的异常提示,让调用者知道怎么处理(比如给前端返回“用户名已存在”)。
技巧6:重构——别等“屎山”堆成了再重构,要“边写边改”
很多程序员都有一个误区:“先把代码写出来,能跑就行,重构以后再说”。结果就是,代码越写越乱,“屎山”越堆越高,到最后,没人敢动,只能重新写一遍,白白浪费时间和精力。
老马丁强调:“重构不是‘事后补救’,而是‘日常习惯’——写代码就像打扫房间,边写边整理,才能保持整洁”。重构的核心是“小步快跑”,每次修改一点,测试一点,确保代码能正常运行,不引入新的bug。
实践指南:
- 写代码时,发现不好的命名、冗长的函数、混乱的逻辑,立刻修改,别拖延;
- 每次提交代码前,花5分钟检查一下,重构一下冗余的代码;
- 重构时,遵循“保持功能不变”的原则,只优化代码结构,不改变代码的功能。
全书框架总结(极简版,方便复习)
- 核心理念:代码整洁是程序员的基本素养,整洁代码 = 可阅读 + 可维护 + 可扩展;
- 基础规范:命名、函数、类、注释、格式,这5个方面是整洁代码的“基石”;
- 进阶技巧:错误处理、边界条件、单元测试、重构,这4个方面是让代码“更优雅”的关键;
- 团队协作:整洁代码不仅是个人习惯,更是团队规范,需要所有人共同遵守。
个人思考(批判性+实用性)
1. 认同的点
老马丁说的“代码是写给人看的”,真的太戳我了。以前我写代码,总觉得“能跑就行”,命名随便起,函数随便写,结果每次改代码,都要花半天时间理解自己写的东西,更别说同事了。看完这本书,开始刻意规范自己的代码,发现不仅同事夸我代码好懂,自己改bug也快了很多,加班都少了。
2. 可以灵活调整的点
书中有些规范比较“严格”,比如函数不能超过20行,实际开发中,偶尔有25-30行的函数,只要逻辑清晰、拆分不开,也不用死磕——整洁代码的核心是“清晰、可维护”,而不是“死板遵守规则”。
3. 避坑提醒
不要为了“整洁”而“过度优化”,比如把一个简单的函数拆分成五六个小函数,反而增加了阅读难度;也不要盲目追求“炫技”,用复杂的语法和设计模式,反而让代码变得晦涩——适合自己、适合团队、适合项目的代码,才是最好的代码。
实践指南(看完就能用,落地性拉满)
- 今日行动:打开自己最近写的代码,找出3个可以优化的地方(比如一个糟糕的命名、一个冗长的函数、一句废话注释),立刻重构;
- 长期习惯:每次写代码,遵循“命名见名知意、函数只做一件事、注释精准、类职责单一”这4个原则,写一段,检查一段;
- 团队协作:和同事约定统一的代码规范(比如命名风格、注释要求、函数长度),避免每个人写的代码都有自己的风格,导致团队维护成本飙升;
- 进阶提升:结合书中的单元测试、重构技巧,每周抽1小时,优化自己的旧代码,慢慢养成“整洁代码”的习惯。
结尾彩蛋
写整洁代码,不是为了“装高手”,而是为了“放过自己”——毕竟,没有人愿意一辈子和“屎山代码”打交道,也没有人愿意因为写烂代码被同事吐槽、被领导批评。
记住:你今天写的每一行整洁代码,都是在给未来的自己“减负”。从现在开始,告别“凑活”,写优雅的代码,做一个让同事尊敬、让自己轻松的程序员~