作者主张绝不应把有副作用的调用塞进 if 条件里,比如 if (enqueueMessage(message)) 或 if (flushQueue() == 0)。if 的唯一职责是判断条件真假,而不是借求值顺带执行动作;把返回值赋给有名字的变量,代码才像英语一样可读。他以生产代码 if (!categorySeen.add(categoryID)) continue; 为例,说明读者会把 add() 误读成 contains(),三重否定再加 continue 更是让人无法理解。
核心要点
if 的唯一职责是测试条件真假,不应借求值执行动作。
直接使用返回值会让人搞不清语义:真代表入队成功,还是队列已满?
把返回值赋给有名字的变量,代码更接近自然语言。
生产代码 if (!categorySeen.add(categoryID)) continue; 会被误读成 contains(),三重否定难以理解。