command 분기 제거를 인터페이스+enum
전략객체를 추상체통로 외부주입이 아닌, enum에서
📜 제목으로 보기
- 전략패턴처럼 분기를 추상화하되, 외부주입 대신 enum에서 구현체 받아오기
- 01 일단 1개 분기에 대해서 전략package>구현체1개 -> 내부 구현체클래스.전메()로 1개만 먼저 만들기
- 02 1개 구현체속 전메가 완성 -> @override를 붙여서 인터페이스로 뺀다.
- 03 뽑아낸 전략추상체.전메()로 로직상의 구현체.전메()를 대신해야한다. 구현체들의 외부주입의 전략패턴이 아니라면? -> enum의 필드에 함형로 구현체들을 매핑해놓고 가져다 사용해야한다. enum필드 = 함형 Type이다.추상체>추상체>
- 1) 추상체 객체 통로를 통한 구현체 외부주입(전략패턴)이 아니라, 2) 추상체 객체 통로없이 enum의 추상체 필드에 매핑된 구현체 가져오는 방법을 쓴다. (외부주입될 구현체들은 enum에 메달려 있고(매핑), 그것을 enum특성으로 돌면서 찾아거 가져온다.)
- 변수자리에 함수호출(생성자호출하여 객체생성)을 매핑하고 싶다면, () -> {} 람다로 정의해두고 필드는 함수형인터페이스로 정의해주면 된다.
- 이넘에 넣어줄 생성자호출함수 정의하면서 나머지 분기도 다 정리해준다.
- 그냥 첨부터 enum. 메달린구현체getter()로 해주면 된다. 이제 알아서 구현체를 가져온 상태 -> 전메만 호출시켠 알아서 각 분기속 로직이 작동된다.
- input -> output -> input 꼬리를 무는 controller 속 순서로직 -> 메세지보내서 내부에서 처리
전략패턴처럼 분기를 추상화하되, 외부주입 대신 enum에서 구현체 받아오기
01 일단 1개 분기에 대해서 전략package>구현체1개 -> 내부 구현체클래스.전메()로 1개만 먼저 만들기
- 각 분기별 전체 로직이
추상체변수. 전메()로 실행될 수 있도록- 1개 분기를 예시로
구현체class생성 -> 전메로 로직 일괄호출()하도록 메서드를 만든다.
- 1개 분기를 예시로

public void run() {
final PairProgram pairProgram = new PairProgram();
while (!pairProgram.isOff()) {
final Menu menu = Menu.from(inputView.inputMenu());
if (menu == Menu.MENU_1) {
pairMatch(pairProgram);
}
if (menu == Menu.MENU_2) {
pairSelect(pairProgram);
}
if (menu == Menu.MENU_3) {
pairProgram.initPairs();
}
if (menu == Menu.MENU_Q) {
pairExit(pairProgram);
}
}
}







02 1개 구현체속 전메가 완성 -> @override를 붙여서 인터페이스로 뺀다.



03 뽑아낸 전략추상체.전메()로 로직상의 구현체.전메()를 대신해야한다. 구현체들의 외부주입의 전략패턴이 아니라면? -> enum의 필드에 함형로 구현체들을 매핑해놓고 가져다 사용해야한다. enum필드 = 함형 Type이다.추상체>추상체>

원래는 구현체 1개 -> 추상체로 바꾸고 -> 그 추상체를 변수or파라미터에서 받아서 외부제공해줘야하는데, 여기서는 enum에게 메세지를 던져서 해당 구현체가 나오도록 던져져야한다.

- 분기마다 구현체실행되니 -> 선택된 enum의 field에 분기별 구현체 생성 매핑해둔다.
- 이 때,
enum의 구현체 매핑 필드 변수가구현체 생성호출하는 함수형인터페이스<추상체>가 된다.
- 이 때,
- enum에게 메세지를 던져 현재 선택된 구현체에
구현체.전메()를 쓸 수 있도록추상체.전메()로 정의해준다.
-
enum에게 메세지를 던질 시,
-
enum으로 가서, 각 필드마다, 분기에서
추상체.전메()형태로 사용될new 구현체()들을 생성할 수있게 함수형인터페이스로 정의해주고, 필드의 변수명을함형<추상체>로 받아준다.
1) 추상체 객체 통로를 통한 구현체 외부주입(전략패턴)이 아니라, 2) 추상체 객체 통로없이 enum의 추상체 필드에 매핑된 구현체 가져오는 방법을 쓴다. (외부주입될 구현체들은 enum에 메달려 있고(매핑), 그것을 enum특성으로 돌면서 찾아거 가져온다.)

변수자리에 함수호출(생성자호출하여 객체생성)을 매핑하고 싶다면, () -> {} 람다로 정의해두고 필드는 함수형인터페이스로 정의해주면 된다.



이넘에 넣어줄 생성자호출함수 정의하면서 나머지 분기도 다 정리해준다.

-
그냥 기존 구현체 1개를 드래그해서 복붙해서 생성하는게 더 빠를지도?


그냥 첨부터 enum. 메달린구현체getter()로 해주면 된다. 이제 알아서 구현체를 가져온 상태 -> 전메만 호출시켠 알아서 각 분기속 로직이 작동된다.



public void run() {
final PairProgram pairProgram = new PairProgram();
while (!pairProgram.isOff()) {
final Menu menu = Menu.from(inputView.inputMenu());
new PairMatch().execute(inputView, outputView, pairProgram);
final Supplier<CommandMenu> commandMenuGenerator = menu.getCommandMenuGenerator();
final CommandMenu commandMenu = commandMenuGenerator.get();
commandMenu.execute(inputView, outputView, pairProgram);
}
}
input -> output -> input 꼬리를 무는 controller 속 순서로직 -> 메세지보내서 내부에서 처리
-
최초 시작 객체에 메세지를 던지면 된다. 메세지를 던질 때는, 첨부터 필요한 재료를 다 던져서,
책임을 위임한다.-
첫시작객체.메세지를가장 마지막 메서드()로

-

-
메서드추출로 해주는게 편하다 -> 메세지를 보낼 시작객체만 앞으로 빼면 된다.



-
빨간줄뜨는
메소드내 없는 객체-> 파라미터로 추출- 자기자신이 메세지보내고 있는 객체. -> 생략
- 자기자신이 파라미터로 들어간다? -> this

