청소 아키텍처는 응답 / 디스플레이를 처리합니다 (DIP 다음, 주입) 발표자의 실제 구현을 호출 인터랙 사용 사례를 수 있도록 제안합니다. 그러나 사람들 이이 아키텍처를 구현하고 상호 작용기의 출력 데이터를 반환 한 다음 컨트롤러 (어댑터 계층)에서 처리 방법을 결정하게합니다. 두 번째 솔루션은 인터랙 터에 대한 입력 및 출력 포트를 명확하게 정의하지 않고 애플리케이션 계층에서 애플리케이션 책임을 유출합니까?
입력 및 출력 포트
Clean Architecture 정의, 특히 컨트롤러, 유스 케이스 인터랙 터 및 발표자 간의 관계를 설명하는 작은 흐름도를 고려할 때 "유스 케이스 출력 포트"가 무엇인지 올바르게 이해하고 있는지 확실하지 않습니다.
육각형 아키텍처와 같은 클린 아키텍처는 1 차 포트 (방법)와 2 차 포트 (어댑터가 구현할 인터페이스)를 구분합니다. 통신 흐름에 따라 "유스 케이스 입력 포트"가 기본 포트 (따라서 메소드)이고 "유스 케이스 출력 포트"인터페이스가 구현 될 것으로 예상됩니다. 실제 어댑터를 사용하는 생성자 인수 인터랙 터가 사용할 수 있도록
코드 예
코드 예제를 작성하려면 컨트롤러 코드 일 수 있습니다.
Presenter presenter = new Presenter();
Repository repository = new Repository();
UseCase useCase = new UseCase(presenter, repository);
useCase->doSomething();
발표자 인터페이스 :
// Use Case Output Port
interface Presenter
{
public void present(Data data);
}
마지막으로 인터랙 터 자체 :
class UseCase
{
private Repository repository;
private Presenter presenter;
public UseCase(Repository repository, Presenter presenter)
{
this.repository = repository;
this.presenter = presenter;
}
// Use Case Input Port
public void doSomething()
{
Data data = this.repository.getData();
this.presenter.present(data);
}
}
발표자를 호출하는 인터랙 터에서
앞의 해석은 앞서 언급 한 다이어그램 자체에 의해 확인 된 것으로 보입니다. 여기서 컨트롤러와 입력 포트 사이의 관계는 "날카로운"헤드 ( "연결"에 대한 UML, "가 있음"을 의미 함)가있는 실선 화살표로 표시됩니다. 발표자와 출력 포트 사이의 관계는 "백색"헤드 ( "상속"에 대한 UML, "구현"에 대한 것이 아닌 UM)가있는 실선 화살표로 표시됩니다. 그것은 어쨌든 의미입니다).
또한 다른 질문에 대한이 답변 에서 Robert Martin은 상호 작용자가 읽기 요청에 따라 발표자를 호출하는 유스 케이스를 정확하게 설명합니다.
맵을 클릭하면 placePinController가 호출됩니다. 클릭의 위치 및 기타 상황에 맞는 데이터를 수집하고 placePinRequest 데이터 구조를 생성 한 후이를 Pin의 위치를 확인하고 필요한 경우 유효성을 검사하며 Pin을 기록 할 Place 엔티티를 작성하여 EditPlaceReponse를 구성하는 PlacePinInteractor에 전달합니다. 장소 편집기 화면을 표시하는 EditPlacePresenter로 전달합니다.
MVC 에서이 기능을 제대로 수행하기 위해 전통적으로 컨트롤러로 들어가는 응용 프로그램 논리가 상호 작용기로 이동한다고 생각할 수 있습니다. 응용 프로그램 논리가 응용 프로그램 계층 외부로 누출되는 것을 원하지 않기 때문입니다. 어댑터 계층의 컨트롤러는 인터랙 터를 호출하고 프로세스에서 약간의 데이터 형식 변환을 수행합니다.
이 계층의 소프트웨어는 데이터를 사용 사례 및 엔터티에 가장 편리한 형식에서 데이터베이스 또는 웹과 같은 일부 외부 기관에 가장 편리한 형식으로 변환하는 어댑터 집합입니다.
원래 기사에서 인터페이스 어댑터에 대해 이야기했습니다.
인터랙 터에서 데이터를 반환
그러나이 접근법에 대한 나의 문제는 유스 케이스가 프레젠테이션 자체를 처리해야한다는 것입니다. 이제 Presenter
인터페이스 의 목적 은 여러 다른 유형의 발표자 (GUI, 웹, CLI 등)를 표현하기에 충분히 추상적이며 실제로는 "출력"을 의미하며, 이는 유스 케이스 일 수 있습니다. 매우 잘하지만 여전히 그것에 대해 완전히 확신하지는 못합니다.
이제 깨끗한 아키텍처의 응용 프로그램을 웹에서 살펴보면 출력 포트를 일부 DTO를 반환하는 방법으로 해석하는 사람들 만 찾는 것 같습니다. 이것은 다음과 같습니다.
Repository repository = new Repository();
UseCase useCase = new UseCase(repository);
Data data = useCase.getData();
Presenter presenter = new Presenter();
presenter.present(data);
// I'm omitting the changes to the classes, which are fairly obvious
유스 케이스에서 프리젠 테이션을 "호출"하는 책임을 옮기고 있기 때문에 유스 케이스는 더 이상 데이터를 제공하는 것이 아니라 데이터로 무엇을해야하는지 알 필요가 없습니다. 또한이 경우에도 유스 케이스는 여전히 외부 레이어에 대해 아무것도 모르기 때문에 종속성 규칙을 위반하지 않습니다.
그러나 유스 케이스는 실제 프리젠 테이션이 더 이상 수행되는 순간을 제어하지 않습니다 (예 : 로깅과 같이 해당 시점에 추가 작업을 수행하거나 필요한 경우 모두 중단하는 데 유용 할 수 있음). 또한 컨트롤러가 getData()
새로운 출력 포트 인 방법 만 사용하므로 유스 케이스 입력 포트를 잃어 버렸습니다 . 또한, 우리는 여기에서 "말하고 묻지 말아라"라는 원칙을 어 기고 있다고 생각합니다. 왜냐하면 우리는 인터랙 터에게 실제 데이터를 처리하도록 지시하기보다는 어떤 데이터를 처리하도록 요구하기 때문입니다. 처음.
요점
그렇다면이 두 가지 대안 중 어느 것이 클린 아키텍처에 따른 유스 케이스 출력 포트의 "올바른"해석입니까? 둘 다 가능합니까?