티스토리 뷰

Implementing Use Cases

Model-View-Controller Pattern

Application datalogic (모델로 캡슐화 됨)은 presentation logic (뷰 및 컨트롤러로 캡슐화 됨)과 독립적이어야합니다.

View는 사용자 입력 및 출력을 담당합니다. dialog boxview의 좋은 예입니다.

Controllers는 모델에서 수행 할 수 있는 허용 가능한 트랜잭션에 대한 논리를 구현합니다.

Model은 세분화 된 비즈니스 로직과 데이터를 캡슐화합니다.

 

상호 작용을 보여주는 시퀀스 다이어그램은 다음과 같습니다:

The Entity-Control-Boundary Pattern

ECB (Entity-Control-Boundary Pattern)는 Model-View-Controller 패턴의 변형입니다.

 

Entity, Control 및 Boundary는 클래스 스테레오 타입이지만 UML에는 이를 나타내는 몇 가지 특수 아이콘이 있습니다:

 

특수 아이콘이 없는 동일한 다이어그램은 다음과 같습니다:

Entity는 시스템 데이터 (고객, 거래, 장바구니 등)를 나타내는 개체입니다.

 

Boundary는 사용자 interfaces, gateways, proxies 등 시스템 액터와 인터페이스하는 객체입니다.

 

Control은 BoundaryEntity 사이를 중재하는 객체입니다. 그들은 경계에서 오는 명령의 실행을 조정합니다.

ATM Example

The Hexagonal Architecture Pattern (aka Ports & Adapters)

The Hexagonal Architecture는 객체를 3 개의 중첩 된 육각형으로 분할합니다. 내부 육각형의 Entities, 중간 육각형의 controllers, 외부 육각형의 boundaries 및 외부 육각형 외부의 액터 :

 

액터는 Boundary 객체와 상호 작용합니다.

Boundary 객체는 Control 객체에 명령을 내립니다.

Control 객체는 액터로부터 더 많은 정보를 얻기 위해 쿼리를 Boundary 객체로 다시 보낼 수 있습니다.

그런 다음 Control은 Entity를 업데이트합니다.

Entity 간의 변경 사항을 반영하기 위해 필요에 따라 Boundary가 새로 고쳐집니다.

Mapping to MVC

Entity로 채워진 내부 육각형을 Model-View-Controller 패턴의 Model 역할에 매핑 할 수 있습니다. Control은 분명히 Controller에 매핑되고 최소한 사용자와 상호 작용하는 Boundary는 View에 매핑됩니다.

The Hexagonal architecture 에는 몇가지 유용한 기능이 있습니다.

1. 사용자 인터페이스와 서버 및 장치와 같은 다른 유형의 행위자에 대한 인터페이스를 구분하지 않습니다.

2. Boundary 객체를 Control에 필요한 인터페이스를 구현하는 모든 객체로 볼 수 있습니다. 이 인터페이스는 boundary of the middle hexagon의 포트로 볼 수 있습니다. Boundary 객체를 실제 액터 인터페이스 또는 모의 액터로 구현할 수 있기 때문에 테스트가 쉬워집니다.

The Use Case Controller Pattern

개발자는 종종 특정 사용 사례가 구현되는 디자인의 위치를 ​​가리키는 데 어려움을 겪습니다. 이 문제는 특정 컨트롤러 개체로 각 사용 사례를 식별하여 완화 할 수 있습니다. 이 경우 컨트롤러를 Use Case Controller라고합니다.

A Framework

프레임 워크를 사용하여 한 단계 더 나아갈 수 있습니다:

Java implementation:

 

abstract class Model extends Observable implements Serializable {
}

interface Oracle {
	String ask(String query);
}

abstract class Boundary implements Oracle, Observer {
	protected Model myModel;

	public Boundary(Model m) {
		myModel = m;
		myModel.subscribe(this);
	}
}

abstract class UseCaseController implements Oracle {
	protected Model myModel;

	abstract public String execute(Oracle caller, String cmmd) throws Exception;
}

Customizing the Framework

ATM 시스템에 프레임 워크를 사용자 정의 할 수 있습니다:

 

The business Package

The presentation Package

 

특정 Use Case Controller는 유스케이스의 시나리오를 구현합니다:

 

class TransferFunds extends UseCaseController {
	private Bank bank; // my collaborator
	private String amount, source, destination; // info from boundary
	// called by bank:

	public String ask(String query) {
		if (query.eqauls("Source?")) {
			return source;
		} else if (query.equals("Destination?")) {
			return destination;
		} else if (query.equals("Amount?")) {
			return amount;
		} else {
			return "unknown";
		}
	}

	// called by boundary:
	public String execute(Oracle caller, String cmmd) throws Exception {
		source = caller.ask("Source?");
		destination = caller.ask("Destination?");
		amount = caller.ask("Amount?");
		String response = bank.ask("transfer funds");
		if (!response.equals("success")) {
			throw new Exception(response);
		}
		return response;
	}
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크