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와 일치하기 때문에 흥미 롭습니다.