2012-01-13 20 views
12

Mỗi khi tôi nhìn vào một số mã nguồn Java, tôi thấy mình đang lướt trong một thư mục có thư mục có thư mục có thư mục trong đó vv Tại sao Java yêu cầu nhiều thư mục lồng nhau, không có gì khác trong chúng ngoại trừ thư mục con?Tại sao các nguồn Java có quá nhiều thư mục bên trong nhau?

Ví dụ: https://github.com/halfninja/android-dragcontrol3d/tree/master/src/uk/co/halfninja/android Đó có lẽ không phải là ví dụ tồi tệ nhất, nhưng có hai thư mục "uk" và "co" không có ý nghĩa. Tôi chỉ thấy điều này trong các nguồn Java!

Và ví dụ minicraft: http://www.ludumdare.com/compo/ludum-dare-22/?action=preview&uid=398

import com.mojang.ld22.gfx.Font; 
import com.mojang.ld22.gfx.Screen; 
import com.mojang.ld22.gfx.SpriteSheet; 

Tại sao không chỉ cần viết:

import gfx.Font; 
import gfx.Screen; 
import gfx.SpriteSheet; 

Đó là rất nhiều bụi.

(Tôi chưa bao giờ được lập trình bằng Java.)

+1

Điều gì sẽ xảy ra nếu tôi đã tạo thư viện gfx và bạn đã tạo một thư viện - sẽ có xung đột đối với bất kỳ ai cần sử dụng cả hai. – nos

+0

Những gì bạn mô tả trực giác như 'thư mục' không có ý nghĩa này. Bạn có thể nhận ra chúng là tên miền được đảo ngược: 'com.mojang' cho tên miền 'mojang.com'. Mục đích chính xác là giống nhau: cung cấp một tên duy nhất. Xem: http://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html – mins

+1

Đây là một câu hỏi hay và có vẻ như tôi không có ai trả lời đầy đủ. Tất cả các câu trả lời dưới đây dường như nói rằng đó là để ngăn chặn xung đột với các gói khác. Các lớp lồng ghép nhiều thư mục con sâu * DOES * giúp ngăn chặn xung đột, nhưng có nhiều cách dọn dẹp hơn để đạt được điều này mà không * lạm dụng * hệ thống tệp theo cách này. Ví dụ: mỗi doanh nghiệp có thể có thư mục "tổ chức", ví dụ: 'com.company.section' và sau đó trong thư mục đó, các lớp có thể được đặt tên là' qualified.package.ClassName.class' hoặc thậm chí 'đủ điều kiện/gói/ClassName.class' nếu bạn muốn. – ricovox

Trả lời

7

Đây là các biện pháp ngăn chặn xung đột với các lọ khác. Có một cái gì đó giống như url của công ty trong tên gói làm cho nó có khả năng là duy nhất, đủ để không xung đột với gói và lớp của người khác.

Ví dụ của bạn là một ví dụ tốt, vì có vẻ hợp lý khi tưởng tượng hai người nghĩ đến việc sử dụng "gfx" làm tên gói và với các lớp như Font hoặc Sprite. Bây giờ, nếu bạn muốn sử dụng cả hai, làm thế nào bạn có thể kể từ khi gói và tên lớp sẽ là tên?

+2

sẽ không chỉ là một thư mục con khắc phục sự cố này? ví dụ: 'minicraft.gfx.Font'? sẽ có ý nghĩa nhất đối với tôi. – Rookie

+0

Vâng, nhưng những gì bạn nghĩ là duy nhất có thể không thực sự là như vậy. Trong trường hợp này, có, minicraft có lẽ sẽ là đủ. Quy ước thông thường là ba phần đại diện cho nhóm chịu trách nhiệm về cái bình để nó hầu như không gây ra xung đột. Đó là về việc an toàn hơn là xin lỗi. Vì hầu hết các IDE chỉ có thể tự động nhập công cụ này cũng như truy cập trực tiếp vào các lớp, tôi thực sự không thấy lý do tại sao nó thậm chí còn phức tạp. – AHungerArtist

+4

tôi đã suy nghĩ, tại sao không chỉ sử dụng một thư mục afterall? 'com_mojang_ld22.gfx.Font' điều này có gây ra vấn đề gì không? ít nhất cũng không có nhiều thư mục con. – Rookie

3

Cách của bạn sạch hơn, nhưng không có ai khác trên thế giới sẽ tạo ra một gói gọi là gfx, đó là một giả định khá yếu. Bằng cách thêm tên miền đã đảo ngược của bạn, bạn tạo một không gian tên duy nhất để tránh xung đột.

Điều này phù hợp hoàn hảo với "văn hóa chia sẻ" tràn ngập lập trình Java, trong đó các ứng dụng thường kết hợp các thư viện lớn từ nhiều nguồn.

+0

Hiện tại tôi đang làm việc, chúng tôi có nhiều đội cùng làm việc. Vì vậy, quy ước đặt tên này không ngăn chặn xung đột. Ngoài ra, tại sao tôi quan tâm đến "toàn bộ thế giới" và không chỉ những thứ tôi đang liên kết vào dự án của tôi? – Sqeaky

+1

Vâng, @ Sqeaky, họ chỉ làm sai. Nếu không có cơ quan trung ương kiểm soát tên gói tại công ty bạn, thì mỗi dự án hoặc nhóm phải sử dụng gói duy nhất bên dưới tên công ty: đó là những gì chúng tôi làm ở nơi tôi làm việc. Theo như lý do tại sao bạn nên quan tâm đến toàn thế giới, nếu bạn chắc chắn mã của bạn sẽ không bao giờ được chia sẻ bên ngoài tổ chức của bạn, nó không thực sự quan trọng. Nhưng khi số lượng đáng chú ý của các thư viện Java công khai có sẵn, nhiều mã Java cuối cùng cũng sẽ được chia sẻ. –

1

Trong Java, quy ước là đặt tên các gói của bạn (tương ứng với cấu trúc thư mục chứa mã của bạn) với thông tin xác định tổ chức của bạn (thường bao gồm TLD và tên công ty) và dự án (có thể thêm một vài phần nữa).

Cụ thể hơn như thế này cũng làm giảm khả năng không gian tên vô tình va chạm với nhau.

0

Nếu bạn muốn chia sẻ mã với mọi người khác, nhưng sử dụng tên chung mà không xung đột. được coi là thực hành tốt để bao gồm tên miền của bạn (ngược)

Bạn sẽ không thể sử dụng nhiều phiên bản trong cùng một ứng dụng.

Bạn có thể cảm thấy mã của bạn sẽ không được chia sẻ với thế giới (hoặc thậm chí không được chia sẻ) Trong trường hợp đó, cấu trúc gói ngắn có thể đơn giản hơn.

Nếu bạn sử dụng IDE, công việc tốt là ẩn cấu trúc gói dài để bạn không cần phải lo lắng về nó.

1

Đó chỉ là kỹ thuật tổ chức để ngăn xung đột không gian tên. Không có gì nhiều hơn hoặc ít hơn. Tên gói Java khớp với cấu trúc thư mục cơ bản, vì vậy mọi mẫu tổ chức ở cấp gói sẽ được phản ánh ở đó.Đó là điển hình cho các đội để bắt đầu tên gói của họ với tên tổ chức của họ và sáp cụ thể. Đây chỉ đơn giản là quy ước, nhưng nó ăn sâu và nên được theo sau vắng mặt một lý do rất tốt.

0

Java không yêu cầu bất cứ điều gì: bạn chỉ có thể đặt tất cả các lớp học của bạn trong gói mặc định và lướt đi. Nhưng đối với các dự án nghiêm túc, loại tổ chức đó không chỉ là khôn ngoan, mà là bắt buộc. Phần com.mojang.ld22 chỉ là một quy ước:

  • com = hoặc này hoặc org, java/javax đối với các gói chính thức
  • Mojang = Phần thứ hai là tên công ty
  • ld22 = Phần thứ ba là tên ứng dụng
+0

tôi nghĩ rằng ld22 là tên cạnh tranh, minicraft nên là tên ứng dụng, đó là mất tích vì lý do nào đó – Rookie

+0

Tất nhiên nó là viết tắt của Ludum Dare 22, ông chỉ chọn sử dụng thay vì tên dự án thực tế. Không có sự mơ hồ nào, và biết được Notch, anh ta có thể đã quyết định tên thật trong nửa thử thách. – Viruzzo

0

Điều này là do cấu trúc bao bì được đề xuất. Trong các dự án lớn, rất nhiều gói/thư viện được sử dụng và để không đưa các tệp nguồn vào cùng một thư mục với một thư viện khác, các lập trình viên đặt mã nguồn của chúng vào các thư mục duy nhất. Vì các trang web là duy nhất, nên quy ước sử dụng cấu trúc bao bì trông giống như cấu trúc thư mục của trang web.

1

Đó là tất cả về Không gian tên. Với 'Namespaces', bạn có thể tạo 2 lớp có cùng tên, nằm trong các gói/thư mục khác nhau. Logic Namespace này cũng có thể được sử dụng để tạo 'đặc quyền truy cập', vv vv Dưới đây là một số liên kết:

1) Namespace 2) Java Package 3) Java Package Naming Conventions

EDIT: Chúng ta hãy giả sử rằng bạn đang tạo một dự án mới và đang sử dụng 2 khung nguồn mở từ các công ty/tổ chức - comA và comB. Ngoài ra, chúng ta hãy giả định rằng comA và comB đã tạo một lớp trong các dự án của họ với cùng một tên lớp. Bây giờ, với các quy ước đặt tên gói Java, chúng ta có com.comA.SomeClass và com.comB.SomeClass. Bạn có thể nhập và sử dụng cả hai lớp trong lớp của bạn, mà không có xung đột. Đây chỉ là một ví dụ đơn giản. Có những cách sử dụng khác từ quy ước đặt tên này.

Các vấn đề liên quan