Quy ước cho dấu tách từ trong tên gói Java là gì?


370

Làm thế nào một từ riêng biệt trong tên gói? Điều nào sau đây là đúng?

  1. com.stackoverflow.my_package (gạch dưới)
  2. com.stackoverflow.my-package (dấu gạch ngang)
  3. com.stackoverflow.MyPackage (Lạc đà)

Tiêu chuẩn chung là gì?


15
một ví dụ khác chưa được đề cập là sử dụng một khoảng thời gian:com.stackoverflow.my.package
Brad Cupit

11
(2) không hợp pháp Java. Không rõ tại sao bạn thậm chí hỏi về nó.
Hầu tước Lorne

Lưu ý rằng tất cả điều này chỉ để đảm bảo tính duy nhất. Chỉ có điều thực sự được thi hành là đứng ngoài không gian java. *.
Thorbjørn Ravn Andersen

Câu trả lời:


248

Đây là những gì tài liệu quy ước đặt tên chính thức quy định:

Gói

Các tiền tố của tên gói độc đáo luôn được viết bằng tất cả chữ thường chữ ASCII và nên là một trong các tên miền cấp cao nhất, hiện nay com, edu, gov, mil, net, org, hoặc một trong các tiếng Anh mã hai chữ nước xác định theo quy định tại tiêu chuẩn ISO Tiêu chuẩn 3166, 1981.

Các thành phần tiếp theo của tên gói thay đổi theo quy ước đặt tên nội bộ của một tổ chức. Các quy ước như vậy có thể chỉ định rằng các thành phần tên thư mục nhất định là bộ phận, bộ phận, dự án, máy hoặc tên đăng nhập.

Ví dụ

  • com.sun.eng
  • com.apple.quicktime.v2
  • edu.cmu.cs.bovik.cheese

Người giới thiệu


Lưu ý rằng, đặc biệt, mọi thứ tuân theo tiền tố tên miền cấp cao nhất không được chỉ định bởi tài liệu trên. JLS cũng đồng ý với điều này bằng cách đưa ra các ví dụ sau:

  • com.sun.sunsoft.DOE
  • gov.whitehouse.socks.mousefinder
  • com.JavaSoft.jag.Oak
  • org.npr.pledge.driver
  • uk.ac.city.rugby.game

Đoạn trích sau đây cũng có liên quan:

Trong một số trường hợp, tên miền internet có thể không phải là tên gói hợp lệ. Dưới đây là một số quy ước được đề xuất để xử lý các tình huống này:

  • Nếu tên miền chứa dấu gạch nối hoặc bất kỳ ký tự đặc biệt nào khác không được phép trong mã định danh, hãy chuyển đổi nó thành dấu gạch dưới.
  • Nếu bất kỳ thành phần tên gói kết quả nào là từ khóa thì hãy thêm dấu gạch dưới vào chúng.
  • Nếu bất kỳ thành phần tên gói kết quả nào bắt đầu bằng một chữ số hoặc bất kỳ ký tự nào khác không được phép làm ký tự ban đầu của mã định danh, thì có một dấu gạch dưới được đặt trước thành phần.

Người giới thiệu


52
Chương 7.7 thậm chí còn khuyến nghị sử dụng dấu gạch dưới trong tên gói!
Andreas Dolk


6
Ở đây: oracle.com/technetwork/java/codeconventions-135099.html nó nói tất cả thấp hơn, nhưng ở đây docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.1 nó nói rằng thành phần đầu tiên phải ở dạng chữ thường, họ cũng loại bỏ các ví dụ về phân tách từ viết hoa. Cũng ở đây: docs.oracle.com/javase/tutorial/java/package/namingpkgs.html nó nói tất cả các chữ thường. Vì vậy, có vẻ như chữ hoa trong tên gói hiện không được khuyến khích.
dhblah

27
Chương 7.7 không khuyến nghị sử dụng dấu gạch dưới, nó khuyến nghị thay thế các ký hiệu đặc biệt / không hợp lệ bằng dấu gạch dưới, điều này khá xa so với việc khuyến nghị sử dụng chung.
eduard.dudar

270

Cả ba không phải là quy ước.

Sử dụng com.stackoverflow.mypackage.

Tên gói không theo quy ước đặt vỏ lạc đà hoặc gạch dưới hoặc quy ước đặt tên gói .

Ngoài ra, Google Java Style Guide chỉ định chính xác com.stackoverflow.mypackagequy ước (nghĩa là ):

5.2.1 Tên gói

Tên gói đều là chữ thường, với các từ liên tiếp được ghép đơn giản với nhau (không có dấu gạch dưới). Ví dụ com.example.deepspace, không com.example.deepSpace hoặc com.example.deep_space.

- Hướng dẫn về Phong cách Java của Google: 5.2 Quy tắc theo loại định danh: 5.2.1 Tên gói .


9
Tôi đồng ý một phần - chúng không "sai" theo các quy ước đặt tên java nhưng theo tôi thì chúng không nên được sử dụng. ( java.sun.com/docs/codeconv/html/CodeConventions.doc8.html )
Andreas Dolk

@Andreas_D liên kết bạn đã cung cấp nói rằng "Tiền tố của tên gói duy nhất luôn được viết bằng các chữ cái ASCII viết thường"
Jose Gómez

1
@ JoseGómez " Tiền tố ". Vì vậy, imho điều này không loại trừ tất cả các từ khác bao gồm tên gói là CamelCase hoặc Snake_case
Antek

21

Bất cứ ai cũng có thể sử dụng dấu gạch dưới _ (Được rồi)

Không ai nên sử dụng hypen - (thực tế xấu của nó)

Không ai nên sử dụng chữ in hoa bên trong tên gói (Thực tiễn xấu)

LƯU Ý: Ở đây "Thực hành xấu" có nghĩa là về mặt kỹ thuật, bạn được phép sử dụng điều đó, nhưng thông thường nó không phải là cách cư xử tốt để viết.

Nguồn: Đặt tên cho một Gói (docs.oracle)


47
Có, sử dụng dấu gạch nối là một thực tiễn xấu, bởi vì đó là một lỗi. Và viết mã mà không biên dịch thực sự là thực hành xấu.
glglgl

Liên kết tốt - giúp cung cấp cho tất cả điều này một số bối cảnh khi bạn biết những gì nguồn nói. Tôi đã quen với tất cả các quy ước chữ thường. Nhưng theo các tài liệu, có vẻ như nó chỉ đơn giản là vấn đề lựa chọn / phong cách. Tôi đã thêm một nhận xét vào bài đăng cụ thể được hỏi về trường hợp lạc đà cho tên gói (mà tôi không nghĩ là trùng lặp với bài đăng này, btw - chỉ hỏi về quy ước nói chung) stackoverflow.com/questions/36755783/
Gene Bo

"Không có chữ in hoa", mặc dù tôi đồng ý rằng tất cả các chữ hoa hoặc thứ gì đó trông giống như ClassName là một ý tưởng tồi, nó cũng loại bỏ Ví dụ này. Nói "đó là thực hành xấu" là về lý do thiếu thuyết phục, mơ hồ và vô nghĩa nhất mà tôi có thể nghĩ ra. Điều này có thể được xây dựng trên? (nghĩa là xác định 'thực hành xấu')
Manius

Về cơ bản bạn vẫn nói "nó tệ" mà không đưa ra lời biện minh tại sao nó nên được coi là xấu. Nó có phá vỡ dụng cụ không? Tạo nhầm lẫn? Là khó đọc hoặc gõ? Đối với các ví dụ được đưa ra tôi nghĩ rằng chúng ta có thể trả lời có cho nhiều người trong số họ. Nhưng tôi không thể hiểu một lệnh cấm tuyệt đối đối với chữ in hoa. Tên gói Like This (giống như tên lớp) rõ ràng là khó hiểu, nhưng như thế này không gây nhầm lẫn với tôi và dường như dễ đọc hơn đối với tên gói hai từ như bigdataSource (so với "bigdatasource"). Trừ khi có một số lý do camelCase là một ý tưởng tồi cho các gói mà tôi không biết, điều đó có vẻ tốt.
Manius

Hóa ra tôi đã bỏ lỡ điều này: oracle.com/technetwork/java/codeconventions-135099.html Tất cả chữ thường là một phần của quy ước tên gói của Oracle. Tôi vẫn nghĩ rằng đó là một quy ước khá nhảm nhí để loại trừ trường hợp lạc đà bắt đầu thấp hơn, trong những thời điểm (hiếm) khi bạn cần sử dụng tên gói hai từ và không có nghĩa gì để biến nó thành hai thư mục. Nhưng tốt thôi.
Manius

18

Các quy ước đặt tên chính thức không nghiêm ngặt, chúng thậm chí không 'cấm' ký hiệu trường hợp lạc đà ngoại trừ tiền tố ( comtrong ví dụ của bạn).

Nhưng cá nhân tôi sẽ tránh các chữ cái viết hoa và gạch nối , thậm chí cả số. Tôi cũng muốn chọn com.stackoverflow.mypackagenhư Bragboy.

(dấu gạch nối '-' không hợp pháp trong tên gói)

BIÊN TẬP

Thú vị - đặc tả ngôn ngữ có một cái gì đó để nói về quy ước đặt tên quá.

Trong Chương 7.7 Tên gói duy nhất, chúng ta thấy các ví dụ với tên gói bao gồm chữ in hoa (vì vậy ký hiệu CamelCase sẽ ổn) và họ đề nghị thay thế cách viết bằng dấu gạch dưới ("mary-lou" -> "mary_lou") và tiền tố java từ khóa có dấu gạch dưới ("com.example.enum" -> "com.example._enum")

Một số ví dụ khác cho chữ in hoa trong tên gói có thể được tìm thấy trong chương 6.8.1 Tên gói .


2
Như Andreas đã lưu ý, không có quy tắc nào về việc sử dụng vỏ trên trong tên gói. Một lý do cụ thể để tránh điều đó là tôi đã thấy mọi người gặp vấn đề với các tên gói trường hợp hỗn hợp khi thực hiện phát triển đa nền tảng. Đặc biệt là khi ai đó quyết định đổi tên hoặc thay đổi trường hợp của gói, khi đó bạn dựa vào cả VCS và môi trường phát triển để thực hiện chính xác điều đúng với trường hợp thư mục.
Shorn

2
Trên thực tế, có các quy tắc: "Tiền tố của tên gói duy nhất luôn được viết bằng các chữ cái ASCII viết thường" ( oracle.com/technetwork/java/codeconventions-135099.html )
Jose Gómez

4

Underscores trông xấu xí trong tên gói. Đối với những gì có giá trị, trong trường hợp tên ghép từ ba từ trở lên, tôi sử dụng tên viết tắt (ví dụ com.company.app.ingresoegresofijo (ingreso/egreso fijo) -> com.company.app.iefijo:) và sau đó ghi lại mục đích gói package-info.java.


4
điều này có thể không thể đọc được và khó hiểu nội dung của gói bằng cách chỉ nhìn vào tên gói
Vishal Akkalkote

1
Đủ công bằng. Đó là lý do tại sao tôi đề nghị sử dụng tài liệu. Tôi sẽ sử dụng phương pháp này bất cứ lúc nào thay vì các từ đầy đủ được ghép nối (apiratesheet - đó là 'Bảng tỷ lệ API' hay 'Bảng cướp biển'?)
jpangamarca

1

Ghép các từ trong tên gói là điều mà hầu hết các nhà phát triển không làm.

Bạn có thể sử dụng một cái gì đó như.

com.stackoverflow.mypackage

Tham khảo khai báo tên JLS

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.