Giải thích các kiểu đặt tên và quy ước
Tên trong mã nguồn, tệp, URL và tiêu đề tuân theo những quy ước khác nhau giữa các ngôn ngữ và định dạng. Hướng dẫn này liệt kê các kiểu đặt tên phổ biến, nơi mỗi kiểu được dùng, và những chi tiết hay gây nhầm lẫn: từ viết tắt, số, tiêu đề và chữ cái ngoài tiếng Anh.
Các kiểu phổ biến
| Kiểu | Ví dụ | Cách tạo |
|---|---|---|
| camelCase | orderTotal | Từ đầu viết thường, các từ sau viết hoa chữ cái đầu, không có dấu phân cách |
| PascalCase | OrderTotal | Mọi từ viết hoa chữ cái đầu, không có dấu phân cách |
| snake_case | order_total | Chữ thường, nối các từ bằng _ |
| CONSTANT_CASE | ORDER_TOTAL | Chữ hoa, nối các từ bằng _ |
| kebab-case | order-total | Chữ thường, nối các từ bằng - |
| dot.case | order.total | Chữ thường, nối các từ bằng . |
| Title Case | Order Total | Các từ cách nhau bằng dấu cách, mỗi từ viết hoa chữ cái đầu |
| Sentence case | Order total | Chỉ từ đầu tiên viết hoa chữ cái đầu |
camelCase đôi khi được gọi là lower camel case, còn PascalCase là upper camel case. CONSTANT_CASE còn có tên screaming snake case.
Mỗi ngôn ngữ và định dạng dùng kiểu nào
Phần lớn các hệ sinh thái đã thống nhất quy ước từ lâu, và tuân theo nó giúp mã dễ đọc hơn với bất kỳ ai quen hệ sinh thái đó:
| Ở đâu | Quy ước thường dùng |
|---|---|
| JavaScript, TypeScript, Java | camelCase cho biến và hàm, PascalCase cho lớp, CONSTANT_CASE cho hằng số cố định |
| Python (PEP 8) | snake_case cho hàm và biến, PascalCase cho lớp, CONSTANT_CASE cho hằng số |
| C# | PascalCase cho kiểu, phương thức và thành viên public; camelCase cho biến cục bộ và tham số |
| Go | PascalCase xuất tên ra ngoài gói, camelCase giữ tên ở chế độ riêng tư |
| Ruby, Rust | snake_case cho phương thức và biến, PascalCase cho kiểu |
| CSS và HTML | kebab-case cho thuộc tính, tên lớp và thuộc tính data- |
| URL | kebab-case; Google khuyên dùng dấu gạch ngang thay vì gạch dưới giữa các từ |
| Bảng và cột SQL | snake_case, vì nhiều cơ sở dữ liệu đưa tên không có dấu ngoặc kép về cùng một kiểu chữ |
| Biến môi trường | CONSTANT_CASE, như DATABASE_URL |
| Khóa cấu hình | dot.case cho các thiết lập lồng nhau, như server.port |
| API JSON | Không có quy tắc chung: nhiều API dùng camelCase, số khác dùng snake_case; hãy theo API bạn đang dùng |
Trong hầu hết ngôn ngữ lập trình, không thể dùng kebab-case cho tên biến vì dấu gạch ngang bị hiểu là dấu trừ: order-total nghĩa là order trừ total.
Từ viết tắt và số
Từ viết tắt là chỗ các quy ước khác nhau nhiều nhất. Một trường phái giữ chúng viết hoa (userID, parseHTML); trường phái khác coi chúng như từ thường (userId, parseHtml). Hướng dẫn phong cách Java và JavaScript của Google theo cách thứ hai, giúp ranh giới từ rõ ràng khi các từ viết tắt đứng cạnh nhau: XmlHttpRequest dễ tách hơn XMLHTTPRequest. Hướng dẫn .NET của Microsoft giữ viết hoa từ viết tắt hai chữ cái (IOStream) và chỉ viết hoa chữ cái đầu của từ dài hơn (HtmlButton). API trình duyệt XMLHttpRequest pha trộn cả hai, nên hay được nhắc đến như một ví dụ cần tránh.
Chữ số không có hoa thường, nên công cụ chuyển đổi không thể biết utf8Decoder là “utf8 decoder” hay “utf 8 decoder”. Công cụ thường gắn số vào từ đứng trước. Hãy chọn một cách viết và dùng nhất quán ở mọi nơi.
Title Case và Sentence case trong tiêu đề
Với tiêu đề tiếng Anh, các cẩm nang văn phong không viết hoa mọi từ theo cùng một cách. Phong cách AP và Chicago để chữ thường cho mạo từ, liên từ và giới từ ngắn, trừ khi chúng đứng đầu hoặc cuối (“The Lord of the Rings”), và hai bên khác nhau ở danh sách cụ thể. Nhiều hướng dẫn về giao diện và tài liệu, kể cả hướng dẫn tài liệu cho nhà phát triển của Microsoft và Google, dùng Sentence case (“Change your password”), vừa dễ áp dụng nhất quán vừa bớt trang trọng.
Title Case của công cụ LeedyBox viết hoa mọi từ, phù hợp với nhãn và tên kiểu biến nhưng không hợp với tiêu đề kiểu báo chí: sau đó hãy tự hạ các từ ngắn về chữ thường.
Chuyển đổi giữa các kiểu làm mất thông tin
Mọi lần chuyển đổi đều tách tên thành các từ trước, dựa vào chữ hoa và dấu phân cách, rồi ghép các từ theo kiểu mới. Những gì kiểu đích không biểu diễn được sẽ mất: parseHTML thành parse_html, và chuyển ngược lại ra parseHtml. Dấu câu cũng bị bỏ, nên “don't” thành hai từ.
Vì vậy hãy coi một kiểu là nguồn chuẩn. Nếu cơ sở dữ liệu dùng snake_case và mã dùng camelCase, hãy chuyển đổi tại ranh giới mỗi lần, theo cùng một chiều, thay vì lưu tên ở cả hai dạng.
Đổi tên khóa ở ranh giới API
Khi front-end dùng camelCase giao tiếp với back-end dùng snake_case, hầu hết thư viện tuần tự hóa có thể tự động ánh xạ tên, nên dữ liệu không bao giờ phải đổi tên bằng tay. Chuyển đổi một tài liệu JSON một lần, chẳng hạn dữ liệu thử hoặc phản hồi mẫu, là việc khác, và chế độ “Khóa JSON” của công cụ làm việc đó mà không đụng đến giá trị.
Hãy chú ý xung đột: user_name và userName thành cùng một khóa ở kiểu nào cũng vậy, và khóa này sẽ ghi đè khóa kia. Các ký hiệu đầu khóa như _id hay $ref thường có ý nghĩa với một cơ sở dữ liệu hoặc lược đồ cụ thể, nên hãy kiểm tra xem có được đổi tên chúng không.
Chữ hoa và chữ thường ngoài tiếng Anh
Quy tắc hoa thường không giống nhau ở mọi ngôn ngữ. Chữ ß của tiếng Đức khi viết hoa thành SS, nên từ dài ra. Tiếng Thổ Nhĩ Kỳ có chữ i có chấm và ı không chấm: cặp chữ hoa của chúng là i → İ và ı → I, trong khi quy tắc mặc định của hầu hết ngôn ngữ lập trình đổi i thành I. toUpperCase() của JavaScript dùng quy tắc mặc định; toLocaleUpperCase('tr') áp dụng quy tắc tiếng Thổ Nhĩ Kỳ. Tiếng Hàn, tiếng Trung và tiếng Nhật hoàn toàn không có chữ hoa thường, nên chỉ có dấu phân cách giữa các từ thay đổi.
Hoa thường cũng có thể quan trọng với tên tệp. Windows và macOS (theo mặc định) coi Readme.md và README.md là cùng một tệp, còn Linux coi là hai tệp. Vì vậy, một lần đổi tên chỉ thay đổi hoa thường có thể không bị phát hiện trên hệ thống này nhưng làm hỏng liên kết hoặc import trên hệ thống khác.
Câu hỏi thường gặp
camelCase hay snake_case tốt hơn?
Nói chung không kiểu nào tốt hơn. Hãy dùng quy ước của ngôn ngữ, framework hoặc API bạn đang làm việc; sự nhất quán trong một codebase quan trọng hơn chính lựa chọn.
URL nên dùng dấu gạch ngang hay gạch dưới?
Dấu gạch ngang. Hướng dẫn của Google về URL khuyên dùng gạch ngang giữa các từ, và slug kiểu kebab-case như /case-converter/ là cách làm phổ biến trên web.
Vì sao Git không nhận ra tôi chỉ đổi hoa thường của tên tệp?
Trên hệ thống tệp không phân biệt hoa thường, Git thường coi tên cũ và tên mới là cùng một tệp. Hãy đổi tên bằng git mv, chẳng hạn qua một tên tạm, để thay đổi được ghi lại cho các hệ thống phân biệt hoa thường.
Viết tên thương hiệu như iPhone hay eBay theo camelCase thế nào?
Công cụ chuyển đổi tách từ tại chữ hoa, nên những tên này sẽ thành các từ rời. Trong mã, thường rõ ràng hơn khi coi thương hiệu là một từ (iphoneModel) và chỉ giữ cách viết chính thức trong văn bản hiển thị cho người đọc.