Utilo

命名规范:卡梅尔Case vs 蛇_case vs 饼-case vs 帕斯卡Case

一本关于JavaScript,Python,Go,SQL,CSS,URL和环境变量的命名规范的实用指南,包含缩写词和API边界规则。

· 7 分钟阅读

菲尔·卡尔顿的著名笑话说计算机科学中只有两件事是困难的:缓存无效和命名。选择好的词已经很难了;然后你还必须决定如何加入它们。userId,user_id,UserId,user-id和USER_ID都描述了相同的概念,每个概念都在某个地方是正确的。这本指南解释了主要的惯例,在哪里预期每一个,以及如何处理尬的案例缩写,数字和系统之间的界限。

主要会议

姓名 一个例子 典型使用情况
驼案例 getUserById JavaScript/TypeScript变量和函数,Java方法,JSON字段
帕斯卡案例 UserProfile 类,类型,反应组件,C#方法
蛇_案例 get_user_by_id Python,Ruby,Rust函数,SQL列
叫的蛇案例 MAX_RETRIES 常数,环境变量
菜盒子 user-profile 网址,CSS类,HTML属性,文件名,CLI标志
列车外 Content-Type HTTP头
点.情况 app.server.port 配置键,Java包

一个case converter 可以同时翻译所有这些名称,在移动层之间时很方便。

根据语言和背景的公约

JavaScript和类型脚本

  • 变量,函数和对象属性:camelCase。
  • 类,接口,类型别名,名单和 React 组件:PascalCase。React 要求组件以大写字母开始,以便 JSX 可以将它们与 HTML 元素区分开来。
  • 真实常数 (永远不会改变的配置):SCREAMING_SNAKE_CASE,尽管许多代码库使用camelCase为const变量。
  • 文件名称:通常是组件文件的kebab-case (user-profile.tsx) 或PascalCase。选择一个;文件名中混合字母会导致文件系统不敏感字母出现问题。

编程系统

PEP 8是明确的:函数,变量和模块的 snake_case,类的 PascalCase (PEP 8称之为 CapWords),模块级常数的 SCREAMING_SNAKE_CASE。一个领先的下划线标志着"内部":_cache。

现在就去吧

Go 使用 camelCase 和 PascalCase,小写字母有意义:以大写字母开始的标识符从包中导出,小写字母是私有的。围棋风格保留缩写字母大写:userID,HTTPServer,parseURL。

Java和C#

两者都使用 PascalCase 为类和 camelCase 为局部变量。Java 用 camelCase 为方法,C# 用 PascalCase 为方法和公有属性。

腐蚀

函数,变量和模块的 snake_case;类型和特征的 PascalCase;常数和静态的 SCREAMING_SNAKE_CASE。编译器会警告你,当你偏离。

SQL 数据库

对于表格和列,snake_case是最安全的选择。在 PostgreSQL 中,未引号的标识符被折叠成小写,因此以 "userId" 创建的列必须永远被引号,而 user_id 在任何地方都是有效的。桌面名称是否单数 (user) 或多数 (users) 是团队的偏好;一致性比选择更重要。

CSS 和 HTML

CSS属性是kebabcase (background-color),所以类名称通常是:.card-header。方法如BEM增加结构:.card__title--active。HTML属性,包括data-*属性,是小写不敏感的,通常是小写;JavaScript将data-user-id曝光为element.dataset.userId。

网址

用小写的kebab-case来表示路径:/blog/compress-image-to-100kb。关键字链接是最重要的。避免URL中大写字母;许多服务器将路径视为小写字母敏感,从而产生重复内容问题。

环境变量

SCREAMING_SNAKE_CASE:DATABASE_URL,STRIPE_SECRET_KEY。和容器平台预计这种情况,有些不允许变量名字中连线。

缩写词和字母

这里是团队争最多的地方。应该是parseHTTPResponse还是parseHttpResponse?userID还是userId?

  • 将缩写词作为单词 (parseHttpResponse,userId,XmlParser):微软的.NET指南建议缩写词长于两个字母,谷歌的Java和JavaScript风格指南以及许多TypeScript代码库。它避免了像HTTPSURLConnection这样的无法读取的运行,并且在案例之间清晰地转换parseHttpResponse自动变成parse_http_response。
  • 保持缩写字母大写 (parseHTTPResponse,userID):在Go中是标准的,在旧的Java和Objective-C代码中是常见的。

自动转换器将parseHTTPResponse分为解析/HTTP/响应,这很有效,但HTTPSURLConnection是模糊的。如果您控制了风格,将缩写词当作单词更强大。

名字中的数字

保持数字附加到它们所属的单词:version2,utf8Decoder,base64_encode,h1-title。避免用数字开始标识符;大多数语言禁止,并且用数字开始的CSS类需要逃离。

跨越边界:API和数据库

现实系统混合了惯例。一个使用snake_case的Python后端服务于一个 JavaScript前端,该前端预计camelCase,并由一个具有snake_case列的SQL数据库支持。选项:

  1. **使用线上的一个规范.**决定JSON使用camelCase (公共API最常见的选择,匹配JavaScript) 或snake_case (Python和Ruby生态系统中常见,并由Stripe和GitHub等API使用)。记录它并将其应用到任何地方。
  2. 在边缘转换. 序列化库可以自动转换:Pydantic的别名生成器,杰克逊的PropertyNamingStrategies,或ORM列映射。在每个层内,代码仍然是语言。
  3. 在一个有效载荷中不要混合.**{ "userId": 1, "created_at": "..." }是两个世界中最坏的。

在生成JSON的TypeScript类型时,请将属性名称保持在线上,并在必要时转换到映射层。

选择好话语

案例的样式是最简单的部分。这里有一些词语规则:

  • 具体说明,data,info和item没有说什么。invoiceLines可以说很多。
  • 用于函数的动词和用于值的名词. calculateTotal()返回 total。
  • Name booleans as questions. isActive,hasAccess,shouldRetry。
  • 包括单元. timeoutMs,maxSizeBytes,durationSeconds 防止整个类型的虫子。
  • 避免使用缩写,除非它们是通用的 (id,url,html)。usrCnt节省了四个字符,
  • 匹配域名语言. 如果企业说"订阅",不要用代码称之为plan。

执行公约

写下这些规范,让工具执行它们:ESLint的@typescript-eslint/naming-convention规则,Pylint和Ruff用于Python,golint和go vet,Rust的内置线条,以及CSS类模式的风格线条。自动化检查结束了代码审查中的辩论,并保持了大型代码库的一致性。

总结

使用camelCase用于JavaScript值,PascalCase用于类型和组件,snake_case用于Python,Rust和SQL,kebab-case用于URL,CSS和文件名,SCREAMING_SNAKE_CASE用于常数和环境变量。尽可能把缩写词当作单词,将单元放在名字中,

本页内容由英文自动翻译而来,如发现错误,欢迎告诉我们。

相关指南