7A Philosophy of Software Design

命名

命名哲学

命名策略一致性精确性避免歧义

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第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 需要最精确。


五、思考与练习

审查你代码中的命名,找出可以改进的地方。

如何在团队中建立一致的命名规范?

好的命名和好的注释哪个更重要?


7/7命名
0%