Tôi đã nghĩ về điều này một lúc trước và gần đây nó đã nổi lên trở lại khi cửa hàng của tôi đang làm ứng dụng web Java thực đầu tiên.
Trong phần giới thiệu, tôi thấy có hai chiến lược đặt tên gói chính. (Để rõ ràng, tôi không đề cập đến toàn bộ phần 'domain.company.project' của điều này, tôi đang nói về quy ước gói bên dưới nó.) Dù sao, các quy ước đặt tên gói mà tôi thấy như sau:
Chức năng: Đặt tên cho các gói của bạn theo chức năng của chúng về mặt kiến trúc thay vì nhận dạng của chúng theo lĩnh vực kinh doanh. Một thuật ngữ khác cho điều này có thể được đặt tên theo 'lớp'. Vì vậy, bạn sẽ có một gói * .ui và một gói * .domain và một gói * .orm. Các gói của bạn là các lát ngang chứ không phải dọc.
Đây là nhiều phổ biến hơn đặt tên logic. Trên thực tế, tôi không tin rằng mình đã từng thấy hoặc nghe nói về một dự án làm được điều này. Tất nhiên, điều này khiến tôi cảm thấy khó chịu (giống như nghĩ rằng bạn đã nghĩ ra một giải pháp cho một vấn đề NP) vì tôi không thông minh cho lắm và tôi cho rằng mọi người phải có lý do tuyệt vời để làm điều đó theo cách họ làm. Mặt khác, tôi không phản đối việc mọi người bỏ lỡ con voi trong phòng và tôi chưa bao giờ nghe thấy một lập luận thực tế nào về việc đặt tên gói theo cách này. Nó chỉ có vẻ là tiêu chuẩn trên thực tế.
Hợp lý: Đặt tên cho các gói của bạn theo danh tính miền doanh nghiệp của chúng và đưa mọi lớp liên quan đến phần chức năng theo chiều dọc đó vào gói đó.
Tôi chưa bao giờ nhìn thấy hoặc nghe nói về điều này, như tôi đã đề cập trước đây, nhưng nó rất có ý nghĩa đối với tôi.
Tôi có xu hướng tiếp cận các hệ thống theo chiều dọc hơn là chiều ngang. Tôi muốn đi vào và phát triển hệ thống Xử lý Đơn hàng, không phải lớp truy cập dữ liệu. Rõ ràng, có nhiều khả năng tôi sẽ chạm vào lớp truy cập dữ liệu trong quá trình phát triển hệ thống đó, nhưng vấn đề là tôi không nghĩ về nó theo cách đó. Tất nhiên, điều này có nghĩa là khi tôi nhận được lệnh thay đổi hoặc muốn triển khai một số tính năng mới, sẽ rất tuyệt nếu tôi không phải đi đánh cá trong một loạt các gói để tìm tất cả các lớp liên quan. Thay vào đó, tôi chỉ xem gói X vì những gì tôi đang làm liên quan đến X.
Từ quan điểm phát triển, tôi thấy việc các gói của bạn ghi lại tên miền doanh nghiệp của bạn hơn là kiến trúc của bạn là một chiến thắng lớn. Tôi cảm thấy rằng miền hầu như luôn là một phần của hệ thống khó tìm hiểu hơn vì kiến trúc của hệ thống, đặc biệt là tại thời điểm này, gần như trở nên nhàm chán trong việc triển khai nó. Thực tế là tôi có thể tìm thấy một hệ thống với loại quy ước đặt tên này và ngay lập tức từ việc đặt tên cho các gói hàng biết rằng nó xử lý các đơn đặt hàng, khách hàng, doanh nghiệp, sản phẩm, v.v. có vẻ khá tiện dụng.
Có vẻ như điều này sẽ cho phép bạn tận dụng tốt hơn nhiều công cụ sửa đổi quyền truy cập của Java. Điều này cho phép bạn xác định rõ ràng hơn nhiều giao diện thành các hệ thống con thay vì thành các lớp của hệ thống. Vì vậy, nếu bạn có một hệ thống con đơn đặt hàng mà bạn muốn duy trì một cách minh bạch, về lý thuyết, bạn có thể không bao giờ cho bất cứ điều gì khác biết rằng nó liên tục bằng cách không phải tạo giao diện công khai cho các lớp bền vững của nó trong lớp dao và thay vào đó đóng gói lớp dao trong chỉ với các lớp mà nó xử lý. Rõ ràng, nếu bạn muốn hiển thị chức năng này, bạn có thể cung cấp một giao diện cho nó hoặc đặt nó ở chế độ công khai. Có vẻ như bạn mất rất nhiều điều này bằng cách chia nhỏ các tính năng của hệ thống thành nhiều gói.
Tôi cho rằng một nhược điểm mà tôi có thể thấy là nó làm cho việc tách các lớp khó khăn hơn một chút. Thay vì chỉ xóa hoặc đổi tên một gói và sau đó thả một gói mới vào vị trí bằng công nghệ thay thế, bạn phải vào và thay đổi tất cả các lớp trong tất cả các gói. Tuy nhiên, tôi không thấy đây là một vấn đề lớn. Có thể là do thiếu kinh nghiệm, nhưng tôi phải tưởng tượng rằng số lần bạn hoán đổi các công nghệ so với số lần bạn truy cập và chỉnh sửa các lát tính năng dọc trong hệ thống của mình.
Vì vậy, tôi đoán câu hỏi sau đó sẽ dành cho bạn, bạn đặt tên cho các gói hàng của mình như thế nào và tại sao? Xin hãy hiểu rằng tôi không nhất thiết nghĩ rằng tôi đã vấp phải con ngỗng vàng hay thứ gì đó ở đây. Tôi khá mới với tất cả những điều này với hầu hết kinh nghiệm học thuật. Tuy nhiên, tôi không thể tìm ra lỗ hổng trong lý luận của mình nên tôi hy vọng tất cả các bạn có thể để tôi có thể tiếp tục.