上个月你让它写的函数叫
get_user_data,这个月它写的叫fetchUser。不是你要求不一致——是你没建立"命名的肌肉记忆"。
用 AI 编程助手最恼人的瞬间之一:同一个项目、同一个功能、同一个开发者,AI 每次生成的命名风格都不同。
# 上个月 AI 写的
def get_user_data(user_id):
user_profile = db.query(User).filter_by(id=user_id).first()
return user_profile
# 这个月 AI 写的
def fetchUser(userId):
profile = db.query(User).filter_by(id=userId).first()
return profile不是功能有问题——是名的失配让代码库变成混搭风格的衣服。 每一块单独看都没问题,拼在一起时它的注意力全花在"这叫 user_profile 还是 profile"的转换上。
大多数人的做法:写一份命名规范文档。"函数用小写加下划线"、"类用大驼峰"、"常量全大写"。
这份文档 AI 读了。然后它写 get_user_data 和 user_profile——都符合规范,但它们不在同一层。
get_user_data 是动作,user_profile 是实体。规范管了格式,没管语义。
# ❌ 命名规范(告诉 AI 格式,没告诉含义)
函数用 snake_case
变量用 snake_case
类用 PascalCase
# ✅ 命名清单(告诉 AI 具体用什么)
## 用户模块命名清单
函数:
- get_user(id) # 获取单个用户
- list_users(filters) # 获取用户列表
- create_user(data) # 创建用户
- update_user(id, data) # 更新用户
- delete_user(id) # 删除用户
变量:
- user # 单个用户对象
- users # 用户列表
- user_input # 用户输入(未处理)
- user_data # 用户数据(已处理)
- user_id # 用户 ID
- user_email # 用户邮箱
永远不要用:
- fetchUser, getUserProfile(camelCase)
- usr, u(缩写)
- profile(用 user_profile)清单不是"规则",是"字典"。 AI 不需要理解为什么这样命名——它只需要在生成代码时查字典,查到就用,没查到就问你。
# 每新增一个模块,花 3 分钟补充命名清单
# 不是提前设计所有命名——是做一点补一点
# 模块:订单
新增函数:place_order, cancel_order, refund_order
新增变量:order, order_items, order_status
# 就这样,不需要完整规划,用到再补AI 大概率会读你的命名文档。但它在生成代码时,更直接的参考是项目里已有的代码。
如果在项目里已经有一个文件用 get_user_data,AI 在看这个文件后生成新代码时,自然会倾向用 get_user_data 而不是 fetchUser。
这就是"命名标杆":项目中的某个文件或模块,作为 AI 的风格参考源。
# 在项目根目录放一个 NAMING_EXAMPLE.py
# 这个文件不参与运行,纯粹作为风格参考
# NAMING_EXAMPLE.py
# 注意:这个文件不是用来执行的,是给 AI 看命名风格的
def get_user(user_id: int) -> dict:
"""获取单个用户"""
user = db.query(User).filter_by(id=user_id).first()
return user
def list_users(page: int, per_page: int) -> list:
"""分页获取用户列表"""
users = db.query(User).offset((page - 1) * per_page).limit(per_page)
return users
# ↑ AI 看到这些后生成的代码会自然用 get_xxx, list_xxx 模式
# 而不是 fetchXxx / getXxxList 之类的混搭每次让 AI 写新模块前,加一行:
命名风格参照 NAMING_EXAMPLE.py。如果 NAMING_EXAMPLE.py 中没有对应的命名模式,请先问我。一行指令,搞定整个模块的命名一致性。
AI 有时候会给你惊喜——用一个更"优雅"的名字替代你清单里的名字。
# 你的清单里
用户输入变量:user_input
# AI 写代码时觉得
user_payload # 更专业
payload # 更简洁这种"创新"有两种情况:
第二种情况是命名一致性的头号杀手。
# 给 AI 一条硬规则
## 命名策略
1. 清单已有的名字,直接用。不允许"优化"或"简写"。
原因:一致性的价值 > 单个名字的优雅度。
2. 如果你认为清单中的名字确实不合适:
→ 先在回答中说明理由
→ 等我确认后再改
→ 确认后,同步更新命名清单
3. 清单中没有的名字:
→ 参照 NAMING_EXAMPLE.py 的风格
→ 如果仍不确定,问我关键在第一条:清单已有的名字,"不允许优化"。 这挡住了 AI 最大的命名问题源——在毫无必要的情况下"换个更好的名字"。
花在命名一致性上的时间看起来是"非功能性的"——不产生新功能,不修复 bug。
但它在三个维度上产生真实回报:
# 1. 阅读成本
# 一个命名一致的代码库,AI 每次新对话进入状态的速度快 3-5 倍
# 不需要"翻译"不同的命名风格
# 2. 重构成本
# 你想把 user_profile 重命名为 user_data
# 如果全项目用的都是 user_profile → 一次 grep + 批量替换
# 如果有 userProfile / profile / usr_prof / user_info → 六次 grep + 手动判断
# 3. AI 代码质量
# 当 AI 只看到一种命名模式时,它生成的代码更准确
# 当它看到三四种混搭时,它会混搭着用——结果就是更多的混搭1. 给当前项目写一份"命名清单"(不是规范,是字典)
→ 先只写核心模块(用户、订单、商品),10 分钟够
2. 建一个 NAMING_EXAMPLE.py
→ 放 3-5 个关键函数的签名,就够了
3. 在 SOUL.md 里加一条:
→ "清单已有的名字,直接用。不允许优化或简写。"命名一致性的秘密:不是靠 AI 记住你的风格——是靠你的"字典 + 标杆 + 禁止创新"三板斧,让 AI 每次生成代码时只有一个选择。
本文所有示例均已脱敏处理。你的项目里,getUserData 和 fetch_user_info 在同一个文件里共存吗?欢迎评论区坦白。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。