命名規範:卡梅爾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資料庫支援。選項:
- **使用線上的一個規範.**決定JSON使用
camelCase(公共API最常見的選擇,匹配JavaScript) 或snake_case(Python和Ruby生態系統中常見,並由Stripe和GitHub等API使用)。記錄它並將其應用到任何地方。 - 在邊緣轉換. 序列化庫可以自動轉換:Pydantic的別名生成器,傑克遜的
PropertyNamingStrategies,或ORM列對映。在每個層內,程式碼仍然是語言。 - 在一個有效載荷中不要混合.**
{ "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用於常數和環境變數。儘可能把縮寫詞當作單詞,將單元放在名字中,
本頁內容由英文自動翻譯而來,如發現錯誤,歡迎告訴我們。