Tên gói phù hợp hơn về mặt ngữ nghĩa so với `produc` cho những điều sau đây?


18

Là một người rơm coi gói java.utilđó là một bãi rác cho các lớp khác nhau mà trong hầu hết các trường hợp không chia sẻ bất cứ điều gì khác ngoài người đặt chúng ở đó là lười biếng hoặc không có hứng thú để đưa ra một tên gói chính xác hơn về mặt ngữ nghĩa cho lớp của họ.

Như một ví dụ, lấy lớp UUIDnào là tên gói chính xác về mặt ngữ nghĩa cho lớp đó?

Tôi đang làm việc để thực hiện UUIDlớp học của riêng tôi để được nhẹ hơn. Tôi không muốn sử dụng me.myproject.util.UUIDcho tên gói của tôi.

Tôi đã xem xét me.myproject.rfc4122.UUIDnhưng điều đó không ngụ ý ngữ nghĩa của việc sử dụng UUID.

Tôi cũng đã xem xét me.myproject.uuid.UUIDnhưng tôi không thích tautology ở đó, mặc dù đó là một cách tiếp cận phổ biến trong Python để đặt một lớp trong một mô-đun có cùng tên và packagestrong Java không tương đương về mặt ngữ nghĩa với modulesPython.

Tôi cũng đã xem xét me.myproject.UUIDnhưng từ chối nó vì tôi không muốn làm ô nhiễm một phần của không gian tên với những thứ không liên quan. Điều này chỉ di chuyển vấn đề lên một cấp độ.

Tôi cũng đã xem xét me.myproject.lib.UUIDnhưng điều này không có ý nghĩa ngữ nghĩa hơn .utilvà chỉ đổi tên vấn đề.

semantics: nhánh của ngôn ngữ học và logic liên quan đến ý nghĩa .


Thế còn me.myproject.UUID? Hoặcme.UUID
Robert Harvey

Đối với tôi, một cái gì đó như có from me.myproject.uuid import UUID, GetUUIDInfovẻ ổn. Có thể có nhiều hơn một thứ được xuất trong một mô-đun.
9000

2
JXTA có các gói 'id' cho những việc cần làm với id.
greg-449

@ greg-449 - Tôi đang nghiêng về phía trước identityhoặc identifiersđưa ra đề nghị của bạn với một chút giải thích như một câu trả lời có thể sẽ được chấp nhận.

Câu trả lời:


11

Vấn đề với việc cố gắng đặt mỗi lớp trong một gói có tên chính xác về mặt ngữ nghĩa cho lớp đó là nó có xu hướng dẫn đến các gói chứa rất ít lớp, hoặc đôi khi chỉ một lớp. Điều này lần lượt dẫn đến vô số các gói.

Một cách tiếp cận thực tế hơn để đặt tên gói là chỉ đơn giản là giúp bạn tìm thấy công cụ. Giữ những thứ được sử dụng thường xuyên mà bạn luôn biết nơi tìm thấy tất cả bị dồn lại ở một nơi giúp chúng tránh xa và do đó giúp dễ dàng tìm thấy những thứ hiếm khi được sử dụng hơn. Vì vậy, bạn không thực sự cần tên gói chính xác về mặt ngữ nghĩa cho từng lớp mà chúng chứa, bạn chỉ cần tên gói không đúng về mặt ngữ nghĩa. Rõ ràng, tên gói 'produc' đã được chọn theo dòng suy nghĩ này: nó không phải tên chính xác về mặt ngữ nghĩa cho các lớp mà nó chứa, nhưng nó cũng không chính xác về mặt ngữ nghĩa và điều đó đủ tốt.

Vì vậy, nếu loại UUID này của bạn chỉ được sử dụng cho ứng dụng cụ thể này, (bằng chứng là bạn đang dự định đặt nó dưới 'myproject',) thì đó có lẽ là một phần của 'mô hình' của bạn dự án. Bạn đã có gói 'mô hình', chứa tập hợp tất cả các lớp tương ứng với các thực thể liên tục của bạn, nhiều trong số chúng có thể có mối quan hệ giữa chúng, với UUID có thể là phương tiện để thực hiện các mối quan hệ này. Ngoài ra, UUID của bạn có thể biết cách kiên trì, phải không? Và ngoài ra, UUID của bạn có lẽ chỉ có thể được tìm thấy là thành viên của các thực thể mô hình của bạn, phải không? Vì vậy, gói mô hình của bạn có lẽ là nơi tốt nhất cho nó.

Mặt khác, nếu loại UUID này của bạn cũng có thể được sử dụng trong các dự án khác, thì nó cần phải được xem như là một phần của một số khung. Vì vậy, nó có thể nằm trong thư mục nguồn gốc của khung đó hoặc trong gói phụ 'loại' như MainMa đề xuất hoặc thậm chí trong một gói phụ của khung đó có tên là 'produc' hoặc 'misc'. Không có gì sai với điều đó.


2
Vui lòng cố gắng hạn chế bình luận trong các câu trả lời không thực sự bổ sung vào tính hữu ích của câu trả lời. Phần bình luận được dành riêng cho từ chối trách nhiệm như vậy. Cảm ơn bạn.
maple_shaft

1

Mục đích của các gói là nhóm các lớp theo một số tiêu chí (gói theo loại / lớp so với gói theo tính năng, v.v.). Tôi thực sự không thấy một điểm để tạo gói cho chỉ một lớp - đặc biệt là nếu bạn không mong đợi sẽ có các lớp khác trong gói này trong tương lai.

Ngoài ra tôi nghĩ rằng tên gói "produc" không hoàn toàn vô nghĩa - nó chỉ nhóm các lớp theo một tiêu chí cụ thể - đối với tôi "lớp" có nghĩa là nó không phải là một phần của miền của ứng dụng, nhưng nó cũng không phải là một phần của khung (nó không ảnh hưởng đến cấu trúc của ứng dụng). Về cơ bản, nó chỉ là một phần mở rộng của thư viện chuẩn (không).

Trong trường hợp này, tôi sẽ không gặp vấn đề gì với việc đưa lớp UUID này vào gói "produc". Nếu sẽ có một số lớp tiện ích liên quan đến UUID khác (như lớp riêng để tạo UUID), bạn có thể dễ dàng cấu trúc lại và tạo gói "produc.uuid" cho chúng (trừ khi bạn tạo thư viện và UUID sẽ là một phần của giao diện được hiển thị , sau đó bạn cần phải có một chút "suy nghĩ tiến lên").


1
Đây là cách tiếp cận của tôi. Không có nghĩa gì để tạo ra một gói không có mục đích rõ ràng. Nếu một lớp không thể dễ dàng được gán cho một gói có ý nghĩa thì 'tận dụng' là tốt và thậm chí có thể được ưu tiên. Thông thường những gì xảy ra khi bạn đi cùng là đủ các lớp kết thúc trong việc sử dụng có liên quan và chúng dễ dàng cấu trúc lại từ việc sử dụng (ít nhất là trong quá trình phát triển) thành các gói có ý nghĩa. Nếu bạn đã cố gắng tạo các gói duy nhất cho mỗi lớp mà bạn không biết nó đi đâu thì bạn có thể dễ dàng bỏ lỡ các mối quan hệ đó và cơ hội tái cấu trúc thành một kiến ​​trúc sạch hơn.
Dunk

@Dunk, đó thực sự là một điểm rất tốt - trước khi tạo ra cấu trúc gói phần mềm nhân tạo sẽ ngăn bạn nhìn thấy tổ chức tốt hơn, tự nhiên hơn trên đường đi.
qbd

1

Chú Bob có một số hướng dẫn về tách gói.

Ba nguyên tắc gói đầu tiên là về sự gắn kết gói, chúng cho chúng ta biết những gì cần đặt bên trong các gói:

  1. Hạt tái sử dụng là hạt giải phóng
  2. Các lớp thay đổi cùng nhau được đóng gói cùng nhau
  3. Các lớp được sử dụng cùng nhau được đóng gói cùng nhau

Vì vậy, trả lời câu hỏi của bạn, ai / cái gì sẽ sử dụng lớp UUID, có thuộc tính này hoặc gọi các hoạt động trong đó không? Làm thế nào là biểu đồ phụ thuộc của bạn ? UUID sẽ được sử dụng cùng với những lớp nào khác ?

Tùy thuộc vào câu trả lời của bạn, có lẽ bạn nên gọi nó là me.myproject.identity gói, me.myproject.serialization gói, me.myproject. DTO hoặc thậm chí một cái gì đó khác hoàn toàn. Có lẽ, lớp UUID nên được giữ cùng với các mô hình của bạn và bạn sẽ đặt nó trong một gói mà bạn đã có, như me.myproject.models .


1
dtogần như vô dụng về mặt ngữ nghĩa libhoặc utils, toàn bộ dtokhái niệm này là một kiểu chống ngây thơ từ giữa những năm 90, modelcũng rơi vào loại khái quát hóa vô dụng tương tự

Chúng tôi không biết đủ về dự án của bạn để cung cấp cho bạn những cái tên hữu ích hơn
Hbas

-2

Trước hết, UUID (có chữ hoa) dường như là một ý tưởng rất tồi cho tên gói hoặc tên lớp đối với tôi, từ tất cả các kiểu được thi hành theo cách này hay cách khác, tất cả các tên viết hoa đều được liên kết với "hằng số". Các gói được dự định để sắp xếp các công cụ, cách dễ nhất để đặt tên một gói là theo giá trị của các lớp mà nó chứa:

  • bạn có thể chọn tách các lớp theo giá trị bussines của chúng, ví dụ com.example.identifier;
  • hoặc bằng giá trị kỹ thuật của họ, ví dụ com.example.uuid.

Giữ cho CNTT đơn giản


2
Ví dụ về các lớp ALLCAPS trong Java: java.util.UUID, java.net.URL, java.util.zip.CRC32vv
scriptin

@scriptin Sẽ không dễ dàng hơn cho nhà phát triển nếu anh ta có thể phân biệt chỉ với kiểu mũ một lớp từ "hằng", một thành viên từ tên gói, v.v. Tại sao bạn nghĩ rằng CRC32, UUID là một tên hay cho một lớp, chỉ vì java đã làm điều đó? Hoặc bởi vì đó là từ viết tắt của "Định danh duy nhất toàn cầu" hoặc "kiểm tra dự phòng theo chu kỳ" ... nhưng hãy đợi một chút! Điều gì với java.util.zip.GZIPOutputStreamlớp học này ? GZIPlà viết tắt của ... ? there is also a java.util.zip.ZipOutputStream`
Tiberiu C.

1
Các lớp là các loại, hằng là giá trị, không có sự nhầm lẫn. Tôi không nghĩ những cái tên đó là tốt hay xấu, tôi chỉ chỉ ra rằng các kiểu (mã hóa) mà bạn nói về việc không ép buộc các lớp phải có chữ thường. Trong Python UUIDcũng là chữ hoa.
scriptin

Nếu bạn thấy / mantain code mỗi ngày, phong cách của nó tạo ra sự khác biệt giữa một fiesta "dễ đọc" và "quay lại và chuyển tiếp", cô lập ở đây chỉ với kiểu mũ, tôi nghĩ rằng điều đó có giá trị hơn để thể hiện thông qua mũ, loại thành viên (lớp, hằng, gói, v.v.) hơn thực tế là từ viết tắt.
Tiberiu C.

1
Câu hỏi ban đầu không liên quan gì đến trường hợp chữ cái nào được sử dụng khi viết tên gói. Về mặt ngữ nghĩa, UUID không khác biệt gì so với Uuid, uuid, UuId, UuID hoặc bất kỳ sơ đồ viết hoa tùy ý nào khác mà bạn nghĩ là "tốt nhất".
Brandin
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.