第7章:命名(Naming)
一、导读
1.1 本章学习目标
第7章讲解命名——软件设计中最被低估的技能。好的命名能大幅降低理解代码的成本。
本章的核心学习目标包括:
- 理解命名的重要性
- 掌握命名的原则
- 学会使用一致的命名
- 理解命名与精度的关系
1.2 为什么本章如此重要
命名是程序员每天都在做的事。变量名、方法名、类名、文件名——每一个命名决策都影响代码的可读性。好的命名让代码自解释,坏的命名让人困惑。
1.3 核心问题引导
为什么命名如此重要?
好的命名有什么特征?
如何保持一致性?
命名的精度应该如何把握?
二、核心概念详解
2.1 命名的重要性
命名的影响:
1. 可读性
- 好的命名让代码像散文
- 坏的命名让代码像密码
2. 可维护性
- 好的命名减少理解成本
- 坏的命名增加认知负荷
3. 沟通
- 好的命名成为团队语言
- 坏的命名导致误解
例:
// 坏命名
int d; // 什么?
void process(String s, int t); // 处理什么?
// 好命名
int elapsedDays;
void sendNotification(String emailAddress, int retryCount);2.2 命名原则
原则1:精确
- 名字应该精确描述它代表的东西
- 避免模糊的名字
// 模糊
getData() // 什么数据?从哪里?
handle() // 处理什么?怎么处理?
// 精确
getUserById(long id)
handlePaymentTimeout(Order order)
原则2:一致
- 相同概念使用相同的名字
- 在整个项目中保持一致
// 不一致
getUser() // 一个地方
findUser() // 另一个地方
fetchUser() // 又一个地方
// 一致
getUser() // 统一使用 getUser
原则3:避免歧义
- 名字不应该有多种解释
- 避免缩写(除非是广泛理解的)
// 歧义
int count; // 什么的 count?
void run(); // 运行什么?
// 明确
int activeUserCount;
void runBackgroundTask();
原则4:使用领域术语
- 使用业务领域的术语
- 而不是技术术语
// 技术术语
void persist(Entity entity);
void mutate(State state);
// 领域术语
void saveOrder(Order order);
void confirmPayment(Payment payment);2.3 一致性策略
一致性的重要性:
- 减少认知负荷
- 降低学习成本
- 减少错误
如何保持一致:
1. 建立命名规范
- 类名:PascalCase
- 方法名:camelCase
- 常量:UPPER_SNAKE_CASE
- 布尔值:is/has/can 前缀
2. 使用代码审查
- 审查命名一致性
- 提出改进建议
3. 使用工具
- Lint 规则检查命名
- IDE 重命名功能
4. 渐进式改进
- 发现不一致时修复
- 不追求一步到位2.4 命名的精度
精度 vs 长度:
太短(精度不够):
int n; // 不知道是什么
String s; // 不知道是什么
太长(冗余):
int numberOfActiveUsersInTheSystem; // 太啰嗦
恰到好处:
int activeUserCount; // 精确且简洁
经验法则:
- 作用域越小,名字可以越短
- 循环变量:i, j, k 是可以的
- 长作用域:需要更精确的名字
- 公共 API:需要最精确的名字三、实战案例
3.1 案例一:改善命名
java
// 改善前
public class Svc {
public Map<String, Object> proc(Map<String, Object> data) {
List<Map<String, Object>> items = (List) data.get("i");
int total = 0;
for (Map<String, Object> item : items) {
total += (int) item.get("p") * (int) item.get("q");
}
data.put("t", total);
return data;
}
}
// 改善后
public class OrderProcessor {
public OrderSummary process(OrderRequest request) {
List<OrderLine> lines = request.getLines();
Money totalAmount = Money.ZERO;
for (OrderLine line : lines) {
Money lineTotal = line.getUnitPrice().multiply(line.getQuantity());
totalAmount = totalAmount.add(lineTotal);
}
return new OrderSummary(request.getOrderId(), totalAmount);
}
}四、本章小结
命名重要性:影响可读性、可维护性、沟通。
命名原则:精确、一致、避免歧义、使用领域术语。
一致性策略:命名规范、代码审查、工具、渐进改进。
精度把握:作用域越小可以越短,公共 API 需要最精确。
五、思考与练习
审查你代码中的命名,找出可以改进的地方。
如何在团队中建立一致的命名规范?
好的命名和好的注释哪个更重要?