编程中的命名约定 — camelCase、snake_case 及更多
你第一次打开一个代码库,在同一个文件中看到了 getUserName、get_user_name 和 GetUserName。你立刻知道出了问题。命名约定是那些在团队协作之前看似微不足道,但之后变得至关重要的事情之一。
一致的命名不是个人偏好问题。它的目的是让下一个接触代码的人能够读懂它——而那个人通常是六个月后的你自己。
为什么命名约定很重要
当项目缺乏一致的命名时,三件事会崩溃:
- 可读性下降 — 当变量风格每隔几行就变化一次时,你的大脑会浪费周期来解析格式而不是理解逻辑
- 团队协作分裂 — Pull request 变成了关于风格而非内容的战场。由于没有可预测的模式,新开发人员的入职需要更长时间
- 工具无法正常工作 — 代码检查器、自动补全、代码生成器和重构工具都依赖于可预测的命名模式
你选择哪种约定远不如选择一种并坚持下去重要。一个在所有地方都使用一致 snake_case 的代码库比混合三种不同风格的代码库好得多。
命名约定完全指南
camelCase
第一个单词小写,后续每个单词首字母大写。没有分隔符。
// JavaScript / TypeScript
const userName = "Alice";
let itemCount = 42;
function getUserProfile(userId) {
return fetchData(`/users/${userId}`);
}
使用场景: JavaScript、TypeScript 和 Java 使用 camelCase 作为变量、函数名和方法名。Swift 中也是局部变量和函数参数的默认写法。
PascalCase
每个单词首字母大写。也称为 UpperCamelCase。
// TypeScript / C#
class UserProfile {
firstName: string;
lastName: string;
}
interface DatabaseConnection {
host: string;
port: number;
}
// React 组件
function NavigationBar({ items }: NavProps) {
return <nav>{/* ... */}</nav>;
}
使用场景: C# 对几乎所有公共成员使用 PascalCase — 类、方法、属性。TypeScript 和 JavaScript 将其用于类、接口、类型别名和枚举。React 要求组件名使用 PascalCase,因为 JSX 需要区分组件和 HTML 元素。
在 Go 中,PascalCase 具有特殊含义:以大写字母开头的标识符是导出的(公共的)。
snake_case
所有单词小写,用下划线分隔。
# Python
user_name = "Alice"
item_count = 42
def get_user_profile(user_id):
return fetch_data(f"/users/{user_id}")
class UserProfile:
def __init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name
使用场景: Python 对几乎所有内容使用 snake_case,类名除外。Ruby 遵循相同的模式。Rust 对变量、函数和模块使用 snake_case。数据库架构几乎普遍使用 snake_case 作为表名和列名。
SCREAMING_SNAKE_CASE
全部大写加下划线。保留给常量和不应更改的值。
// 大多数语言中的常量
const MAX_RETRY_COUNT = 3;
const API_BASE_URL = "https://api.example.com";
const DEFAULT_TIMEOUT_MS = 5000;
使用场景: 几乎所有语言都使用 SCREAMING_SNAKE_CASE 作为常量。全大写格式是一个通用信号,表示"不要重新赋值"。
kebab-case
全部小写,用连字符作为分隔符。
/* CSS 类名 */
.navigation-bar {
background-color: #1a1a2e;
}
.user-profile-card {
border-radius: 8px;
}
# CLI 标志
npm install --save-dev eslint
git commit --no-verify
使用场景: CSS 和 HTML 强烈倾向于 kebab-case。URL slug 使用它。CLI 工具和命令行标志也遵循它。
大多数编程语言中不能将 kebab-case 用于变量名,因为连字符会被解释为减号运算符。
dot.case
用点分隔单词。
// Java 包名
package com.example.userservice.controllers;
import org.springframework.boot.SpringApplication;
使用场景: Java 包命名、文件扩展名、Spring Boot 等框架中的配置属性键。
Title Case
每个主要单词大写。"and"、"the"、"of"等次要单词除非在短语开头,否则保持小写。
使用场景: UI 标题、页面标题、菜单项、文档部分和专有名词。
path/case
用斜杠分隔单词,遵循文件系统或命名空间约定。
使用场景: 文件系统路径、模块路径、命名空间层次和 URL 路由结构。
各语言约定对照表
| 语言 | 变量 / 函数 | 类 / 类型 | 常量 | 文件 |
|---|---|---|---|---|
| JavaScript / TypeScript | camelCase | PascalCase | SCREAMING_SNAKE_CASE | kebab-case 或 camelCase |
| Python | snake_case | PascalCase | SCREAMING_SNAKE_CASE | snake_case |
| Go | camelCase(未导出) | PascalCase(已导出) | PascalCase 或 ALL_CAPS | snake_case |
| Rust | snake_case | PascalCase | SCREAMING_SNAKE_CASE | snake_case |
| Java | camelCase | PascalCase | SCREAMING_SNAKE_CASE | PascalCase |
| C# | camelCase(私有) | PascalCase(公共) | PascalCase | PascalCase |
| Ruby | snake_case | PascalCase | SCREAMING_SNAKE_CASE | snake_case |
| CSS | kebab-case | — | — | kebab-case |
| SQL | snake_case(列) | — | 大写(关键字) | snake_case |
| PHP | camelCase | PascalCase | SCREAMING_SNAKE_CASE | PascalCase |
常见错误及修复方法
1. 在同一作用域中混合约定
// ❌ 不一致
const user_name = "Alice";
const itemCount = 42;
const MaxRetries = 3;
// ✅ 一致的 camelCase
const userName = "Alice";
const itemCount = 42;
const maxRetries = 3;
2. 对语言使用错误的约定
# ❌ 在 Python 中使用 camelCase
def getUserProfile(userId):
userName = fetchUser(userId)
return userName
# ✅ 使用 Python 期望的 snake_case
def get_user_profile(user_id):
user_name = fetch_user(user_id)
return user_name
3. 缩写和首字母缩略词
// ❌ 首字母缩略词处理不一致
const XMLParser = new XmlParser();
const htmlToJSON = convert(HTMLString);
// ✅ 将首字母缩略词视为单词
const xmlParser = new XmlParser();
const htmlToJson = convert(htmlString);
4. 布尔值名称没有 is/has/can 前缀
// ❌ 歧义的布尔值
const active = true;
// ✅ 明确的布尔值意图
const isActive = true;
约定间的自动转换
当你在不同语言之间工作时,手动转换命名约定既繁琐又容易出错。
我们的字符串大小写转换器可以自动处理这个问题。粘贴任何标识符,一键在 camelCase、PascalCase、snake_case、kebab-case 等之间转换。
延伸阅读
- JSON 格式化最佳实践 — 像命名变量一样干净地组织你的数据
- 正则表达式速查表 — 用于验证和文本处理的模式匹配参考
- SQL 格式化最佳实践 — 编写可读的 SQL 查询
准备好自动转换命名约定了吗? 试试我们的字符串大小写转换器 — 粘贴任何标识符,在 camelCase、snake_case、PascalCase、kebab-case 等之间转换。无需注册,不向服务器发送数据,完全免费。