public class NestedFunctionOrderBuilderEx {
public static Order order(String customer, Trade... trades) {
Order order = new Order();
order.setCustomer(customer);
Stream.of(trades).forEach(order::addTrade); //주문에 모든 거래 추가
return order;
}
public static Trade buy(int quantity, Stock stock, double price) {
return buildTrade(quantity, stock, price, Trade.Type.BUY);
}
public static Trade sell(int quantity, Stock stock, double price) {
return buildTrade(quantity, stock, price, Trade.Type.SELL);
}
private static Trade buildTrade(int quantity, Stock stock, double price, Trade.Type type) {
Trade trade = new Trade();
trade.setQuantity(quantity);
trade.setType(type);
trade.setStock(stock);
trade.setPrice(price);
return trade;
}
public static Stock stock(String symbol, String market) {
Stock stock = new Stock();
stock.setSymbol(symbol);
stock.setMarket(market);
return stock;
}
}
public class NestedFunctionTest {
@Test
void 중첩함수이용_간소화() {
Order order = NestedFunctionOrderBuilderEx
.order("myCustomer",
buy(80, stock("IBM", "NYSE"), 125.00),
sell(50, stock("GOOGLE", "NASDAQ"), 375.00)
);
System.out.println(order.getValue());
}
}
- 중첩함수를 이용하면 도메인에 맞춰 하위관계(들여쓰기)를 명확하게 제공할 수 있다.
- 단점
- 중첩된 괄호를 사용해야 하는 부분은 단점이 될 수 있다.
- 메서드 체인 패턴과 마찬가지로 인수생략은 불가능하며, 인수생략을 제공하려면 오버라이드를 구현해야 한다.
- 파라미터의 위치에 따라 역할이 정해진다는 점(예-80, 125.00)도 사용 방식을 어렵게 만들 수 있다.
'프로그래밍 > OOP_Pattern_TDD' 카테고리의 다른 글
RxJava Single 구조 파해치기 (0) | 2023.04.18 |
---|---|
자바 DSL - 중첩된 함수(NestedFunction) + Lambda (0) | 2023.03.08 |
자바 DSL - 메서드 체인 패턴 (0) | 2023.03.08 |
람다 - 팩토리 패턴 (0) | 2023.03.03 |
람다 - 의무체인 패턴 (0) | 2023.03.03 |