Justin의 개발 로그
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)도 사용 방식을 어렵게 만들 수 있다.
profile

Justin의 개발 로그

@라이프노트

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!