폴더 별 또는 기능별 폴더


59

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

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



1
@Laiv를 모르겠습니다. 언어 / 프레임 워크가 실제로 답변에 영향을 줍니까? 어쨌든 다른 질문은 확실히 관련이 있습니다.
RubberDuck

1
그런 다음 답변을 수정해야합니다. 그리고 예, 그것은 가능한 복제물입니다
Laiv

2
폴더 별 유형의 이점을 이해하지 못했습니다. Pet 기능과 관련된 티켓을 작업하는 경우 지역 Pet, 컨트롤러, 저장소 및 서비스 의 이점을 얻을 수 있습니다 . 어떤 상황에서 모든 컨트롤러가 필요하지만 뷰, 리포지토리 또는 서비스는 필요하지 않습니까?
Alexander

2
Java의 패키지가 단순한 폴더가 아니라고 언급 한 사람은 없습니다. 또한 포함 된 클래스의 액세스에 영향을줍니다. 이러한 이유로 패키지 별 / 유형은 실제로 Java에서 의미 적 가치를 제공 할 수 있습니다.
Angus Goldsmith

답변:


69

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

적은 파일 수만 있으면 폴더 별 유형이 정상입니다 (유형 당 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

1
johnpapa 스타일 가이드는 내가 좋아하는 것 중 하나였습니다 :-)
Jelle

1
때때로 (우리가 생각하는 것보다 종종) 우리는 쉬운 것으로 생각되는 것들에 너무 복잡성을 더합니다. 명명 및 포장은 이러한 것들 중 일부입니다. 가장 좋은 조언은 간단하게 유지하는 것입니다. 두 가지를 혼합하면 두 가지 방법의 장점과 단점이 있습니다.
Laiv

1
@Laiv 예제에서 나는 과잉에 동의했지만 각 유형 폴더가 10-20 개의 파일을 쉽게 가질 수있는 실제 비즈니스 사례의 대부분에서는 전체 기능 폴더가 50 개 정도이기 때문에 매우 유용하다고 생각합니다. 그렇지 않으면 파일.
Reinstate Monica

5
fakking, iPhone 자동 수정 감사합니다! 나는 '말하기'를 의미했습니다.
Jelle

2
@Chaotic이 예제는 구체적으로 이야기하기에 너무 사소한 것이지만 여러 구성 요소에서 사용되는 조각이있는 경우 다른 구성 요소가 의존하는 자체 구성 요소 일 수 있습니다.
Reinstate Monica

25

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

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


9
폴더별로 기능을 추가하면 클래스 및 메서드 범위 (보호, 패키지 등)를 쉽게 재생할 수 있습니다.
Laiv

소규모 프로젝트의 경우 하나의 기능 만 가질 수 있습니다. 해당 시나리오에서 유형별로 구성하는 것이 훨씬 쉽습니다.
aaaaaa

예를 들어 Grails 는 도메인, 컨트롤러, 서비스 등에 대해 폴더별로 유형별로 강제를 설정합니다.
tylerwal

17

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

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.