Thư mục theo loại hoặc Thư mục theo tính năng


59

Tôi sử dụng một hướng dẫn phong cách AngularJS. Trong hướng dẫn này, có một kiểu được gọi folder-by-feature, thay vì folder-by-typevà tôi thực sự tò mò cách tiếp cận tốt nhất (trong ví dụ này cho Java)

Giả sử tôi có một ứng dụng nơi tôi có thể truy xuất Người dùng & Thú cưng, sử dụng các dịch vụ, bộ điều khiển, kho lưu trữ và các đối tượng miền thông thường.

Lấy các kiểu theo thư mục, chúng tôi có hai tùy chọn cho cấu trúc bao bì của mình:

1. Thư mục theo loại

com.example
├── domain
│    ├── User.java
│    └── Pet.java
├── controllers
│    ├── UserController.java
│    └── PetController.java
├── repositories
│    ├── UserRepository.java
│    └── PetRepository.java
├── services
│    ├── UserService.java
│    └── PetService.java
│   // and everything else in the project
└── MyApplication.java

2. Thư mục theo tính năng

com.example
├── pet
│    ├── Pet.java
│    ├── PetController.java
│    ├── PetRepository.java
│    └── PetService.java
├── user
│    ├── User.java
│    ├── UserController.java
│    ├── UserRepository.java
│    └── UserService.java
│   // and everything else in the project
└── MyApplication.java

Điều gì sẽ là một cách tiếp cận tốt, và những lý lẽ để làm như vậy là gì?



1
Tôi không biết @Laiv. Liệu ngôn ngữ / khung thực sự ảnh hưởng đến câu trả lời? Bất kể, câu hỏi khác chắc chắn có liên quan.
RubberDuck

1
Sau đó tôi phải chỉnh sửa câu trả lời của mình. Và cuối cùng, đó là một bản sao có thể
Laiv

2
Tôi không bao giờ hiểu lợi ích của loại thư mục. Nếu tôi đang làm việc với một vé liên quan đến tính năng Pet, tôi có thể sẽ được hưởng lợi từ địa phương Pet, bộ điều khiển, kho lưu trữ và dịch vụ. Trong tình huống nào tôi sẽ cần tất cả các bộ điều khiển, nhưng không phải là các chế độ xem, repos hoặc dịch vụ?
Alexander

2
Không ai có vẻ đã đề cập rằng các gói trong Java không chỉ là các thư mục; chúng cũng ảnh hưởng đến quyền truy cập cho các lớp chứa. Vì lý do này, từng lớp / loại thực sự có thể cung cấp một số giá trị ngữ nghĩa trong Java.
Thợ kim hoàn Angus

Câu trả lời:


69

Thư mục theo loại chỉ hoạt động trên các dự án quy mô nhỏ. Thư mục theo tính năng là vượt trội trong phần lớn các trường hợp.

Theo loại thư mục là ok khi bạn chỉ có một số lượng nhỏ tệp (dưới 10 cho mỗi loại cho phép). Ngay khi bạn nhận được nhiều thành phần trong dự án của mình, tất cả đều có nhiều tệp cùng loại, sẽ rất khó để tìm thấy tệp thực tế mà bạn đang tìm kiếm.

Do đó, thư mục theo tính năng tốt hơn do khả năng mở rộng của nó. Tuy nhiên, nếu thư mục của bạn theo tính năng, bạn sẽ mất thông tin về loại thành phần mà tệp đại diện (vì nó không còn trong controllerthư mục cho phép), vì vậy điều này cũng trở nên khó hiểu. Có 2 giải pháp đơn giản cho việc này.

Đầu tiên, bạn có thể tuân theo các quy ước đặt tên phổ biến bao hàm sự chính xác trong tên tệp. Ví dụ: hướng dẫn phong cách AngularJS nổi tiếng của John Papa có những điều sau đây:

Hướng dẫn đặt tên

  • Sử dụng tên nhất quán cho tất cả các thành phần theo mẫu mô tả tính năng của thành phần sau đó (tùy chọn) loại của nó.
    Mẫu được đề xuất của tôi là Feature.type.js. Có 2 tên cho hầu hết các
    tài sản:

    • tên tệp (avengers.controll.js)
    • tên thành phần đã đăng ký với Angular (AvengersControll)

Thứ hai, bạn có thể kết hợp các kiểu thư mục theo loại và thư mục theo tính năng thành thư mục theo từng tính năng:

com.example
├── pet
|   ├── Controllers
│   |   ├── PetController1.java
|   |   └── PetController2.java
|   └── Services
│       ├── PetService1.java
│       └── PetService2.java
├── user
|   ├── Controllers
│   |   ├── UserController1.java
│   |   └── UserController2.java
|   └── Services
│       ├── UserService1.java
│       └── UserService2.java

1
Hướng dẫn về phong cách johnpapa chính xác là hướng dẫn mà tôi đã tìm hiểu về :-)
Jelle

1
Đôi khi (đôi khi hơn chúng ta nghĩ) chúng ta thêm quá phức tạp vào những thứ được cho là dễ dàng. Đặt tên và đóng gói là một số trong những điều này. Lời khuyên tốt nhất là giữ cho nó đơn giản. Trộn cả hai đều có ưu điểm và nhược điểm của cả hai phương pháp.
Laiv

1
@Laiv Trong ví dụ tôi đã đưa ra, tôi đồng ý mức độ quá mức của nó, nhưng trong hầu hết các trường hợp kinh doanh thực tế của tôi, trong đó mỗi thư mục loại có thể dễ dàng có 10-20 tệp tôi nghĩ rằng nó rất hữu ích vì thư mục tính năng tổng thể sẽ có thứ tự 50 tập tin khác.
Phục hồi Monica

6
fakking, cảm ơn iPhone tự động chính xác! Tôi có nghĩa là 'nói chuyện'.
Jelle

2
@Chaotic Ví dụ này quá tầm thường để bắt đầu nói cụ thể, nhưng trong trường hợp bạn có các phần được sử dụng trên nhiều thành phần, thì đó có lẽ là một thành phần của chính nó mà các thành phần khác phụ thuộc vào.
Phục hồi Monica

26

Điều này thực sự không liên quan gì đến công nghệ đang được đề cập đến, trừ khi bạn sử dụng một khung bắt buộc loại thư mục theo bạn như một phần của cách tiếp cận cấu hình theo quy ước.

Cá nhân, tôi rất có ý kiến, rằng tính năng của thư mục là vượt trội hơn nhiều và nên được sử dụng ở mọi nơi càng nhiều càng tốt. Nó nhóm các lớp thực sự hoạt động cùng nhau, trong khi loại theo thư mục chỉ sao chép một cái gì đó thường có trong tên lớp.


10
Tôi sẽ thêm rằng trong thư mục theo tính năng giúp dễ chơi hơn với các phạm vi lớp và phương thức (được bảo vệ, gói, ...).
Laiv

Đối với các dự án nhỏ hơn, bạn có thể chỉ có một tính năng. Nó dễ dàng hơn nhiều để tổ chức theo loại trong kịch bản đó.
aaaaaa

Ví dụ, Grails không ép buộc từng loại thư mục cho tên miền, bộ điều khiển, dịch vụ của bạn, v.v.
tylerwal

17

Làm việc với các gói theo tính năng nổi bật ở tính mô đun và sự gắn kết cao . Nó cho phép chúng tôi chơi với phạm vi của các thành phần. Ví dụ: chúng ta có thể sử dụng các công cụ sửa đổi truy cập để thực thi LoDđảo ngược phụ thuộc cho tích hợp hoặc / và tiện ích mở rộng.

Các lý do khác là:

  • Điều hướng mã dễ dàng hơn
  • Mức độ trừu tượng cao hơn
  • Giảm thiểu phạm vi (bối cảnh giới hạn)
  • Mô đun hóa dọc

Thư mục-by-lớp đặt quá nhiều nhấn mạnh vào chi tiết thực hiện , (như @ David đề cập) những gì không nói quá nhiều về việc áp dụng chúng tôi đang làm việc. Không giống như từng gói tính năng , từng gói từng lớp khuyến khích mô đun hóa ngang. Kiểu mô đun hóa này làm cho việc làm việc với các thành phần xuyên suốt trở nên khó khăn và tẻ nhạt.

Cuối cùng, có một lựa chọn thứ 3. " Gói theo thành phần ", theo lời của chú Bob, có vẻ phù hợp hơn với các nguyên tắc gói của ông . Nếu ý kiến ​​Bob của Bác có quan trọng hay không, tôi để bạn quyết định. Tôi thấy thú vị vì quy ước này được liên kết với Kiến trúc sạch của anh ấy, mà tôi thích.

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.