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 구현체()들을 생성
할 수있게 함수형인터페이스로 정의해주고, 필드의 변수명을함형<추상체>
로 받아준다.
구현체 외부주입(전략패턴)
이 아니라, 2) 추상체 객체 통로없이 enum의 추상체 필드에 매핑된 구현체 가져오는 방법
을 쓴다. (외부주입될 구현체들은 enum에 메달려 있고(매핑), 그것을 enum특성으로 돌면서 찾아거 가져온다.)
1) 추상체 객체 통로를 통한 변수자리에 함수호출(생성자호출하여 객체생성)을 매핑하고 싶다면, () -> {} 람다로 정의해두고 필드는 함수형인터페이스로 정의해주면 된다.
이넘에 넣어줄 생성자호출함수 정의하면서 나머지 분기도 다 정리해준다.
-
그냥 기존 구현체 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);
}
}
controller 속 순서로직
-> 메세지보내서 내부에서 처리
input -> output -> input 꼬리를 무는 -
최초 시작 객체에 메세지를 던지면 된다. 메세지를 던질 때는, 첨부터 필요한 재료를 다 던져서,
책임을 위임
한다.-
첫시작객체
.메세지를가장 마지막 메서드()
로
-
-
메서드추출로 해주는게 편하다 -> 메세지를 보낼 시작객체만 앞으로 빼면 된다.
-
빨간줄뜨는
메소드내 없는 객체
-> 파라미터로 추출- 자기자신이 메세지보내고 있는 객체. -> 생략
- 자기자신이 파라미터로 들어간다? -> this