四种代码命名规范详解:驼峰、帕斯卡、下划线与匈牙利命名法

发布时间:2026/10/19 4:25:05
四种代码命名规范详解:驼峰、帕斯卡、下划线与匈牙利命名法 我前段时间接手了一个老项目的维护工作打开代码库的一瞬间整个人有点懵。同一个业务模块里userName、user_name、UserName、strUserName四种写法并存光是猜某个字段到底是字符串还是对象就翻了好几个文件。这种体验相信不少朋友都遇到过。今天想把这个日常学习里绕不开的话题聊透驼峰命名法、帕斯卡命名法、匈牙利命名法、下划线命名法。这四种命名规则几乎是所有编程语言的基础约定但很多人只是“见过”并没有真正理解它们各自的适用场景、设计出发点以及为什么有些规范到今天反而成了反面教材。这篇内容适合刚入门的新手也适合正在带团队、想统一代码规范的开发者希望你看完能少踩几个命名上的坑。1. 为什么命名值得当回事一个让人头大的真实场景1.1 命名是代码里最容易被低估的“架构决策”很多人觉得命名随便写写就行反正功能能跑大不了加注释。但实际做项目久了你会发现命名规则的影响范围远远超过一个变量名的外观。它直接影响你读代码的速度、重构的胆量、协作时互相理解的效率甚至影响bug出现的概率。我给你举个例子。某跨平台系统的老代码里有这样一段let d new Date(); let y d.getFullYear(); let m d.getMonth() 1; let day d.getDate(); let str Today is y - m - day;d、y、m、str这种缩写写的时候挺爽但三周之后你自己回来看都要花时间推断到底是什么意思。如果这段代码被十个人接力维护每个人都要重新“解码”一遍。时间成本就这样被悄悄消耗掉了。反过来如果项目里统一用清晰、有语义的命名比如const today new Date(); const year today.getFullYear(); const month today.getMonth() 1; const dayOfMonth today.getDate(); const dateString Today is ${year}-${month}-${dayOfMonth};阅读成本几乎为零。这就是命名的价值它是代码里最廉价的“文档”但绝大多数人都不舍得花这几秒钟。1.2 好的命名到底解决了什么问题命名本质上是在做两件事沟通和约束。沟通是指你写的代码不只是给机器看的更是给人看的。机器只看语法对不对而人需要理解你的意图。一个清晰的命名让后来者不需要追问“这个字段是什么含义”“这个变量能不能修改”“这个函数会不会有副作用”。好名字就是无声的回答。约束是指命名规范可以提前发现一些低级错误。比如匈牙利命名法最初的设计目的就是为了让变量名携带类型信息从而避免你拿一个字符串去参与数字运算。后面我会详细展开这一点。还有一个很容易被忽略的作用命名规范影响重构成本。如果代码里全是data1、data2、temp这种名字你想做一次安全的重构几乎是寸步难行因为你根本不清楚每个变量的职责。反之命名清晰时你可以放心地用IDE的重命名功能全局替换也不会出错。2. 四种常见命名规范一次讲透在动手写代码之前先花几分钟把这四种命名的写法、样例、适用场景和坑点都捋清楚。这是很多教程不会细讲的。2.1 驼峰命名法lower camelCase写法第一个单词首字母小写后续每个单词首字母大写单词之间不加分隔符。例如userName、orderId、getUserList。这是 JavaScript、Java、Swift 等语言中最常见的变量和函数命名风格。你在写前端组件、后端接口、业务逻辑时基本都会用到它。它的优势在于紧凑且不依赖下划线或连字符在命名空间比较短的场景下非常直观。同时大小写的变化本身就提供了一种“视觉分词”userName和username一眼能区分出来避免歧义。需要注意的一个点是连续缩写词的处理。比如“用户ID”是写userId还是userID再比如“URL地址”是pageUrl还是pageURL大多数社区规范建议缩写词当作一个普通单词处理也就是只有首字母大写其余小写即userId、pageUrl。如果全部大写pageURL要么视觉上非常突兀要么在连续缩写的场景下搞出parseURLForHTTPServer这种灾难现场。2.2 帕斯卡命名法PascalCase写法每个单词首字母都大写其余字母小写例如UserInfo、OrderService、DatabaseConnection。它的另一个名字叫“大驼峰”。实际上和驼峰命名法同源只是首字母也大写了。在 C#、Java、Kotlin 中它被严格用于类名、接口名、枚举名、文件命名而变量和函数则用驼峰。为什么类名和变量名要区分核心原因是职责差异类是用来描述抽象类型和结构的属于“名词性”概念用大写的开头强调它是一个类型的模板而变量和函数则更偏向“行为”或“实例”用小写开头更轻量。这种区分让代码扫一眼就能判断出当前标识符的身份。在实际项目中帕斯卡命名的翻车点通常是单词边界不清晰。比如XMLParser和XmlParser有些人坚持缩写全大写有些人坚持只首字母大写。团队如果不提前约定代码库里就会混出XmlHTTPServer这种既大又小、看着极其拧巴的名字。2.3 下划线命名法snake_case写法单词之间用下划线连接全部小写例如user_name、order_id、get_user_list。这是 Python、Ruby、PHP 等语言的主流风格也是数据库字段命名的绝对主流比如 MySQL 里的user_name、created_at。下划线的好处是可读性最强因为分隔符明确不像驼峰需要靠大小写识别单词边界。对于英文水平一般的开发者来说user_login_count显然比userLoginCount更容易一眼看懂。但它的缺点也很明显输入成本高每次多敲一个下划线键同时在一些不支持下划线的场景比如JSON接口字段映射会显得啰嗦。还有一个容易踩的坑是尾部双下划线比如__init__这种 Python 魔术方法如果你在自己的业务变量里也模仿这种写法很容易和语言内置逻辑混淆所以业务代码里要刻意避免。2.4 匈牙利命名法Hungarian Notation这是争议最大、被误解最深的一种。它由某位工程师提出本来是为了让变量名携带额外的类型或用途信息写法是在变量名前加一个类型前缀比如strName字符串类型、iCount整数类型、bIsDeleted布尔类型。举个例子string strUserName 张三; int iUserAge 18; bool bIsVip true;在早期的 C 语言时代编译器对类型检查较弱 IDE 的智能提示也很弱匈牙利命名法相当于在变量名里手动补了一道“类型提醒”。写代码的人看到i就知道是整数看到str就知道是字符串确实能避免很多低级错误。但后来为什么被打入冷宫两个原因第一现代语言Java、C#、Go都有强类型和智能提示类型信息已经由编译器帮你管了重复写在变量名里纯属噪音第二一旦需求变化导致类型改变你得把所有相关变量名全部重命名否则名字和实际类型不一致反而产生误解。不过这里要留一个伏笔匈牙利命名法其实有“应用型”和“系统型”两种形态其中一种到今天仍值得借鉴。我会在下一章详细拆。2.5 四者对比速查表命名法示例主要用在哪优点风险驼峰命名法userNameJavaScript/Java变量、函数紧凑、主流、不依赖分隔符缩写词大小写容易打架帕斯卡命名法UserName类名、接口名、枚举名类型感强、层级清晰写不好容易又长又拗口下划线命名法user_namePython变量/函数、数据库字段阅读边界清晰输入成本高、跨语言映射麻烦匈牙利命名法strUserName旧式C/C、Win32 API自带类型信息现代类型系统下冗余、易误导3. 匈牙利命名法被误解最深的“老古董”3.1 两种形态应用型和系统型很多人一提起匈牙利命名法就说“过时了”“垃圾”但这么说其实有点亏待它。你得分清楚它内部的两种方向当年那位工程师提出的原始含义和后来在 Windows 编程里被广泛扭曲的用法完全不是一回事。系统型匈牙利命名法就是大家最熟悉的加前缀那种iCount、strName、pBuffer、hwnd。这里的i、str、p、h标记的是变量的语言内置类型integer、string、pointer、handle。这一种在今天的确是冗余的因为强类型语言里编译器比你看得准多了。应用型匈牙利命名法前缀标记的不是语言类型而是“业务语义类型”。比如一个下拉框的选中项索引如果只写index你可能搞不清它是“列表里的序号”还是“数据库里的主键ID”。但如果你写成ixSelectedItem那么ix就在提醒你这是一个“索引型”数据不是“ID型”数据。这两者看起来很像但本质完全不同。系统型冗余应用型实际上在补充编译器看不到的信息减少你在业务逻辑里把“长度”和“数量”搞混、把“含税金额”和“不含税金额”混用的概率。3.2 它到底解决了什么问题匈牙利命名法诞生的年代C语言的类型系统很弱函数的参数全靠人肉记住类型一个不小心就会把一个char*传给一个期望int的函数。当时编译器的检查能力有限所以工程师们发明了这套“把类型写进名字”的方案相当于给代码加了人工类型检查。到了现代强类型语言普及系统型前缀的功能完全被编译器取代所以它被淘汰是正常的。但应用型前缀解决的问题并没有消失业务语义的歧义。比如你的代码里有两个变量一个是订单总金额一个是订单总数量如果不加区分后端逻辑算错了都很难发现。比如这种写法int price 100; int count 3; int total price * count; // 看起来没什么问题但如果 price 其实是单价单位分呢如果你从一开始就写成int priceInFen或者long totalAmountCents很多单位混淆和类型搞错的bug根本不会发生。这正是应用型匈牙利思维在现代代码里的正确打开方式前缀不是str这种内置类型而是业务单位、业务语义。3.3 今天的合理用法那么今天我们应该怎么用匈牙利命名法我的建议很明确丢弃系统型前缀保留应用型思想。当你发现一个变量名光看名字不够精确时优先用后缀或动词补充语义比如totalAmountInCents、itemsCount、isVipUser。这些写法本质上是把“匈牙利思维”融入了现代可读性设计而不是机械地把str、i这些老前缀硬塞进来。一种比较合理的分寸是在强类型语言里除非团队有明确约定否则不要给每个变量加前缀。只对那种容易混淆的单位、数量、时间基准、货币类型做特殊标记。比如时间戳到底是秒还是毫秒就特别值得命名标记timestampMs、timeoutSeconds。提示我在实际项目中见过最离谱的例子是把金额用float存然后变量名就叫money。后来某次汇率换算直接丢了精度查了很久才定位到这个变量。如果当初命名成exchangeRateDecimal一眼就能看出应该用高精度类型。4. 团队落地怎么把命名规则真正用起来命名规范最怕的不是选错风格而是团队里每个人都有自己的一套风格。所以接下来这部分我想聊聊怎么在项目里把这些规则落地让它成为团队的默认行为而不是靠每个人“自觉”。4.1 先定原则一致性优于个人偏好不管你选驼峰还是下划线都不重要。重要的是同一个项目里只能有一种主流风格。我见过很多团队花半小时争论“PHP 到底该用哪种命名法”最后却发现项目里两种都有混乱才是最大的敌人。在制定规范时建议遵循几条优先级先尊重编程语言社区的惯例。比如你在 Python 项目里非要全员用驼峰那是在和整个生态抬杠最后 lint 工具都会天天报警。再尊重既有代码库的现状。如果老代码全是下划线风格新代码突然改成驼峰会出现明显的“缝补感”Review 的时候也很痛苦。最后才考虑个人审美。你喜欢哪个风格在个人项目里怎么玩都行但团队代码库需要的是统一的秩序。4.2 工具强制交给机器而不是靠人盯人盯人定规范永远不如工具强制来得可靠。在我的经验里命名规范落地的关键一步是配置好linting 工具和格式化工具让它们在代码提交之前就拦下不合规的命名。以 JavaScript/TypeScript 为例你可以通过 ESLint 的camelcase规则来控制变量命名{ rules: { camelcase: [error, { properties: always, ignoreDestructuring: false, allow: [unused_] }] } }Python 项目则可以依赖black和pylint来做格式化检查。例如pylint的invalid-name规则会对不满足 snake_case 风格的变量名直接报警pylint --disableall --enableinvalid-name my_module.py在团队协作流程里可以让这类检查挂在代码提交的前置钩子上比如 pre-commit hook命名不对就不允许进入仓库。这样规范的执行成本被降到了最低。4.3 命名之外的约定变量、函数、类、常量各司其职在制定团队规范时不只是“变量名用什么风格”这一个问题。一个完整的命名规范至少应该覆盖下面这张表对象建议风格示例普通变量语言社区主流风格如 JS 用 camelCaseorderAmount布尔变量用is、has、can做前缀isPaid、hasStock函数/方法动词开头能看出行为getOrderList、sendNotification类/接口PascalCase名词性OrderController常量全大写加下划线或语言惯例MAX_RETRY_COUNT私有属性加下划线前缀Python或按语言惯例_internalId布尔变量的命名非常值得单独说。很多人写的布尔变量是flag、status、check这种名字完全没有语义。你想想if (flag true)到底是在判断什么是“是否有权限”还是“是否已经处理”别人根本不知道。正确的写法应该是isBanned、hasPermission、canDelete让条件语句读起来像一句英语。4.4 Code Review 中的命名把关规范的最后一公里是 Code Review。即使有了 lint 工具它也只能解决“格式是否符合规则”解决不了“这个名字是否传达了正确语义”的问题。所以 Review 的人一定要把命名作为重点项来看。我在审查代码时遇到不确定的命名通常会问作者一个问题“如果这个变量三天后你自己看你能在一秒钟内说出它是什么吗”回答不上来的基本就该改名。这里插一个经验命名规则不应该让新人感到害怕而是应该降低新人的理解成本。规范的目的是让不认识彼此的人也能顺畅协作而不是制造一堆需要背的教条。如果某个规则需要用三页文档来解释那它多半设计得不合理。5. 常见问题与避坑技巧5.1 不同语言的“政治正确”冲突新手最容易困惑的就是我学了好几门语言命名规则到底听谁的这里有个简单的判断维度——入乡随俗。Python 的变量、函数用 snake_case类名用 PascalCase常量用全大写加下划线。Java/Kotlin/TypeScript 的变量、函数用 camelCase类名用 PascalCase常量用全大写或 PascalCase。C# 更严格几乎所有公开成员都用 PascalCase参数用 camelCase。Go 语言则有自己的特殊习惯使用缩写时全大写比如userID而不是userId。千万不要在一份代码文件里混合使用多种风格哪怕每种风格都在各自场景里是对的。最典型的案例就是 JavaScript 项目里有人用 Python 风格写下划线变量名最后被 ESLint 全屏标红重新提交还是红一大片。5.2 缩写词的处理URL、ID、HTTP 怎么整这个坑几乎每个人都会踩。你想想下面这几个哪个是对的userID、userId、UserID、USER_ID其实没有绝对的对错关键看团队约定。但如果你想少点麻烦我推荐一个被广泛使用的策略缩写词视作普通单词即userId、pageUrl、htmlParser。这样处理之后命名视觉上更平滑也不会出现XMLHTTPResponse这种“大写堆砌”。在 Python 里对应的是user_id、http_response。记住一致性比“标准答案”更重要。只要团队统一了规则哪怕你选的是userID风格也不会产生交流障碍。5.3 重命名带来的连锁反应命名规范的切换不是一个零成本操作。尤其是在大型项目里一次全局重命名可能会牵连到数据库字段、前端接口字段、配置文件、缓存 key 等等。比如你把后端 Java 的user_name改成userName前端如果也死盯user_name这个 JSON 字段接口直接挂掉。我的实际建议是不要在业务高峰期做大规模重命名。如果你实在受不了老代码的命名那就挑一个低流量的时间窗口先做兼容映射再逐步切换。对于长期项目更稳妥的做法是通过 IDE 的重构功能比如 ID 重命名来做全局替换而不是手动搜索替换。注意当数据库字段、接口字段、代码变量三者混在一起时一定要先理清“哪个是源头”。很多团队约定代码变量用 camelCase但数据库字段和接口字段继续用 snake_case。这种跨层差异已经成了行业默认强行统一反而会引发更多 bug。5.4 讨论代码风格时容易犯的沟通错误我见过不少团队因为命名问题在 Review 里吵得面红耳赤。其中最常见的错误是把“风格偏好”上升到“技术能力”的评判。比如看到别人用data这种通用词就说“这命名能力不行”。实际上data有时候就是合理的因为它真的就是一个宽泛的数据对象。有效的沟通方式是指出风险而不是指点风格。你可以说“这个data变量范围太广后续可能会被错误复用建议拆成userListData和orderListData”而不是一句“命名太差”然后甩手走人。这样的讨论才能真正推动代码质量提升。6. 最后分享几个我亲测好用的命名小习惯说几个不太有人讲、但我实际操作中觉得特别实用的细节。一是命名时多问一句“它是什么类型”。即使语言是强类型一个好的名字也应该尽量体现类型。看到一个userList你立刻知道是数组看到一个userMap你立刻知道是字典看到一个userCount你立刻知道是数字。在类型信息已经明确的情况下在名字里再重复一遍类型会显得啰嗦但当类型有歧义时这么做能避免大量低级错误。比如时间戳我一定写成timestampMs或expireAt绝不写裸的time。二是在驼峰和帕斯卡之间切换的规则可以套用到文件命名上。很多前端项目里组件文件用 PascalCaseUserCard.tsx工具函数文件用 camelCaseformatDate.tsCSS 文件用 kebab-caseuser-card.css。这种差异化不是乱来而是提前用文件名告诉你看的人这个文件里装的是什么层级的内容。三是遇到那种实在不知道怎么命名的变量先写注释再补名字。我自己的做法是先写清楚这个变量的用途和约束然后根据注释提炼关键词最后拼成一个名字。比如注释是“这个订单的折扣后应付金额单位是人民币分”那变量名就是discountedPayableAmountInCents。看着长但真的会帮你避免三个月后的困惑。我入行这几年的一个深刻体会是代码首先是写给人看的其次才是写给机器跑的。命名规则不是教条更不是用来吵架的武器它本质上是团队用来降低认知负担的公共约定。下次你准备把一个变量叫temp的时候不妨多花十秒钟想一想它到底“临时”是什么通常这十秒钟就会让你写出的代码在半年后仍然被人看懂。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询