폴더 별 또는 기능별 폴더 repositories │ ├── UserRepository.java │

AngularJS 스타일 가이드를 사용합니다. 이 안내서에는 folder-by-feature대신 이라는 스타일이 있으며 folder-by-type실제로 가장 좋은 방법이 무엇인지 궁금합니다 (이 예제에서는 Java의 경우).

서비스, ​​컨트롤러, 리포지토리 및 물론 도메인 개체를 사용하여 사용자 및 애완 동물을 검색 할 수있는 응용 프로그램이 있다고 가정 해 봅시다.

폴더별로 ….. 스타일을 취하면 포장 구조에 대한 두 가지 옵션이 있습니다.

1. 폴더 별

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. 기능별 폴더

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

좋은 접근 방법은 무엇이며 그렇게하는 주장은 무엇입니까?



답변

폴더 별 유형은 소규모 프로젝트에서만 작동합니다. 대부분의 경우 폴더 별 기능이 우수합니다.

적은 파일 수만 있으면 폴더 별 유형이 정상입니다 (유형 당 10 개 미만이라고 말할 수 있음). 프로젝트에서 여러 유형의 파일이 모두 같은 구성 요소를 가져 오면 원하는 실제 파일을 찾기가 매우 어려워집니다.

따라서 폴더 별 기능은 확장 성으로 인해 더 좋습니다. 그러나 기능별로 폴더를 작성하면 파일이 나타내는 구성 요소 유형에 대한 정보가 더 이상 controller폴더에 표시 되지 않으므로 결국 혼란스러워집니다. 이를위한 두 가지 간단한 솔루션이 있습니다.

먼저 파일 이름에 유형을 암시하는 일반적인 명명 규칙을 준수 할 수 있습니다. 예를 들어 John Papa의 인기있는 AngularJS 스타일 가이드 는 다음과 같습니다.

명명 지침

  • 구성 요소의 기능을 설명하는 패턴 (선택 사항) 유형을 따르는 모든 구성 요소에 일관된 이름을 사용하십시오. 내
    권장 패턴은 feature.type.js입니다. 대부분의
    자산 에는 2 가지 이름이 있습니다.

    • 파일 이름 (avengers.controller.js)
    • Angular에 등록 된 컴포넌트 이름 (AvengersController)

둘째, 폴더 별 및 폴더 별 기능을 폴더 별 기능별로 결합 할 수 있습니다.

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

답변

컨피규레이션 오버 구성 방식의 일부로 폴더 별 유형을 강제하는 프레임 워크를 사용하지 않는 한, 이는 실제로 해당 기술과 관련이 없습니다.

개인적으로 필자는 폴더 별 기능이 훨씬 뛰어나서 가능한 한 모든 곳에서 사용해야한다고 강력하게 생각합니다. 실제로 함께 작동하는 클래스를 그룹화하는 반면 폴더 별 유형은 일반적으로 클래스 이름에 이미 존재하는 항목을 복제합니다.


답변

기능별 패키지 작업 은 높은 모듈 성과 응집력을 자랑 합니다. 구성 요소의 범위를 사용할 수 있습니다. 예를 들어 액세스 수정자를 사용하여 통합 또는 확장에 LoD종속성 반전 을 적용 할 수 있습니다 .

다른 이유는 다음과 같습니다.

  • 보다 쉬운 코드 탐색
  • 더 높은 수준의 추상화
  • 범위 최소화 (경계 컨텍스트)
  • 수직 모듈화

계층 별 폴더 는 구현 세부 사항너무 강조합니다 (@David가 언급했듯이) 우리가 작업중 인 응용 프로그램에 대해 너무 많이 알려주지 않습니다. 기능별 패키지 와는 달리 , 계층 별 패키지 는 수평 모듈화를 권장합니다. 이러한 종류의 모듈화는 교차 절단 구성 요소를 다루는 작업을 어렵고 지루하게 만듭니다.

마지막으로 세 번째 옵션이 있습니다. “ Uncle Bob의 말에 따르면, “ 패키지 별 패키지 ”는 그의 패키지 원칙에 더 잘 부합되는 것 같습니다 . 삼촌의 Bob의 의견이 중요하다면, 나는 당신에게 결정을 내립니다. 이 컨벤션이 내가 좋아하는 Clean Architecture와 일치하기 때문에 흥미 롭습니다.