[Java] Abstract ν΄λμ€κ° Interface λ₯Ό ꡬννκ² νκΈ°
νκ·Έ: Java, Refactoring
μΉ΄ν κ³ λ¦¬: Java
μ΄μ κΈμμ κ³μΈ΅κ΅¬μ‘°λ₯Ό κ°μ§λ λ©λ΄μ μ»΄ν¬μ§νΈ ν¨ν΄μ μ μ©ν΄λ΄€λ€. μ΄λ² κΈμμλ μΆμν΄λμ€λ₯Ό μ μ©ν΄ 곡ν΅κΈ°λ₯ μΆμΆ λ° μλν ν΄λ³Έλ€.
λ¬Έμ
νμ¬κΉμ§ μμ
ν μμ€μμ BoardAddHandler
, BoardDeleteHandler
, BoardListHandler
, BoardViewHandler
, BoardModifyHandler
λ± κ° λλ©μΈμ νΈλ€λ¬λ§λ€ 곡ν΅μΌλ‘ μ€λ³΅λλ μμ€μ½λκ° μλ€.
1
2
3
4
5
6
7
8
9
10
11
public class BoardAddHandler implements MenuHandler {
...
@Override
public void action(Menu menu) {
System.out.printf(AnsiEscape.ANSI_BOLD + "[%s]\n" + AnsiEscape.ANSI_CLEAR, menu.getTitle());
...
}
}
μΈν°νμ΄μ€μ μ μλ action(Menu menu)
μΆμλ©μλλ₯Ό ꡬνν΄μ μ¬μ μ νμ§λ§ μμ§ μ€λ³΅μ½λκ° λ¨μ μλ μνλ€.
μ΄ λΆλΆμ μΆμΆνκ³ μ νλ€.
ν΄λμ€ λ€μ΄μ΄κ·Έλ¨
μ ν΄λμ€ λ€μ΄μ΄κ·Έλ¨ μ²λΌ concrete class(ꡬμν΄λμ€) μμ μ§μ μ μΌλ‘ μΈν°νμ΄μ€λ₯Ό ꡬννμ§ μκ³ μ€κ°μ λΆλͺ¨ ν΄λμ€κ° μΌλΆ ꡬννκ² νλ€. (Generalization) κ·Έλ¦¬κ³ κ΅¬μ ν΄λμ€λ λΆλͺ¨ν΄λμ€λ₯Ό μμλ°λλ€. μ΄λ μΈν°νμ΄μ€μ μ μλ μΆμλ©μλκ° λ§μ κ²½μ° κ΅¬μν΄λμ€μμ λ©μλ μ¬μ μλ₯Ό ν΄μΌνλ λΆλ΄μ μ€μ¬μ€λ€.
AbstractMenuHandler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class AbstractMenuHandler implements MenuHandler {
protected Menu menu;
@Override
public void action(Menu menu) {
this.printMenuTitle(menu.getTitle());
}
private void printMenuTitle(String title) {
System.out.printf(AnsiEscape.ANSI_BOLD + "[%s]\n" + AnsiEscape.ANSI_CLEAR, title);
}
}
κ° νΈλ€λ¬μμ μ€λ³΅λλ μ½λλ₯Ό μΆμΆν΄ λΆλͺ¨ν΄λμ€μμ ꡬννλλ‘ νλ€.
BoardAddHandler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class BoardAddHandler extends AbstractMenuHandler {
private ArrayList<Board> objectRepository;
private Prompt prompt;
public BoardAddHandler(ArrayList<Board> objectRepository, Prompt prompt) {
this.prompt = prompt;
this.objectRepository = objectRepository;
}
@Override
protected void action(Menu menu) { // MenuHandler μΈν°νμ΄μ€ μΆμλ©μλ μ¬μ μ
super.action(menu) // λΆλͺ¨ν΄λμ€μ μΌλΆ ꡬνλ action λ©μλ νΈμΆ
Board board = new Board();
board.setTitle(this.prompt.input("μ λͺ©? "));
board.setContent(this.prompt.input("λ΄μ©? "));
board.setWriter(this.prompt.input("μμ±μ? "));
board.setCreatedDate(this.prompt.input("μμ±μΌ? "));
objectRepository.add(board);
}
}
ꡬμν΄λμ€μμλ κΈ°μ‘΄ λ©μλμ super.action(menu)
λ₯Ό μΆκ°ν΄ λΆλͺ¨ ν΄λμ€μ μ μλ κ³΅ν΅ μμ€μ½λλ₯Ό νΈμΆνκ² ν ν μ΄μ΄μ μμ
νκ²λλ€.
μ΄μ λ³΄λ€ μ’ λ κ°μ²΄μ§ν₯ μ€λ¬μμ§κΈ΄ νμΌλ μ¬μ ν λ¬Έμ κ° λ¨μμλ€.
λ©μλλ₯Ό μ¬μ μνλ κ³Όμ μμ super.action(menu)
μ νμλ‘ νΈμΆν΄μΌ νλ€. κ°λ°μκ° μ€μλ‘ μμ±νμ§ μλ κ²½μ°λ₯Ό λ―Έμ°μ λ°©μ§ν μκ° μλ€.
μ½λ νμΈ
μμ λ AbstractMenuHandler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public abstract class AbstractMenuHandler implements MenuHandler {
protected Prompt prompt; // μ΄κ²λ ꡬμν΄λμ€μμ 곡ν΅μ μΌλ‘ μ°μ΄λ―λ‘ μΆμν΄λμ€μμ μΈν
νλλ‘ νλ€.
protected Menu menu;
public AbstractMenuHandler(Prompt prompt) {
this.prompt = prompt;
}
@Override
public void action(Menu menu) {
this.printMenuTitle(menu.getTitle());
this.menu = menu; // μλΈν΄λμ€ κ΅¬ν μ μ¬μ©ν μΌμ΄ μμΌλ©΄ μΈ μ μλλ‘ λ³΄κ΄ν΄ λλ€.
// Menu λ₯Ό μ€νν λ μ΄ λ©μλκ° νΈμΆλλ©΄ μ¦μ μλΈ ν΄λμ€μ action() λ©μλλ₯Ό νΈμΆνλ€.
this.action();
}
private void printMenuTitle(String title) {
System.out.printf(AnsiEscape.ANSI_BOLD + "[%s]\n" + AnsiEscape.ANSI_CLEAR, title);
}
// μλΈν΄λμ€κ° ꡬνν΄μΌ ν λ©μλ. μΈλΆμμ νΈμΆν λ©μλκ° μλλ€(protected)
protected abstract void action();
}
AbstractMenuHandler
μ action()
μΆμ λ©μλλ₯Ό μ μνκ³ μΆμ ν΄λμ€λ‘ λ³κ²½νλ€.
κ·Έλ¦¬κ³ κΈ°μ‘΄ μΈν°νμ΄μ€μμ ꡬνν action(Menu menu)
μμ μ΄ λ©μλλ₯Ό νΈμΆνκ² νλ€.
μμ λ BoardAddHandler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class BoardAddHandler extends AbstractMenuHandler {
private ArrayList<Board> objectRepository;
public BoardAddHandler(ArrayList<Board> objectRepository, Prompt prompt) {
super(prompt);
this.objectRepository = objectRepository;
}
@Override
protected void action() { // AbstractMenuHandler μΆμλ©μλ μ¬μ μ
Board board = new Board();
board.setTitle(this.prompt.input("μ λͺ©? "));
board.setContent(this.prompt.input("λ΄μ©? "));
board.setWriter(this.prompt.input("μμ±μ? "));
board.setCreatedDate(this.prompt.input("μμ±μΌ? "));
objectRepository.add(board);
}
}
AbstractMenuHandler
λ₯Ό μμλ°μ ν΄λμ€λ μΆμλ©μλλ₯Ό νμμ μΌλ‘ ꡬνν΄μΌ νλ€.
κΈ°μ‘΄μλ MenuHandler
μΈν°νμ΄μ€λ₯Ό μ§μ ꡬνν΄ μ¬μ©νμ§λ§ μμ λ μ½λμμλ μΈν°νμ΄μ€μ ꡬμν΄λμ€ μ€κ°μ μλ AbstractMenuHandler
μ λ©μλλ₯Ό μ¬μ μν΄μ μ¬μ©νκ² λλ€.
μ½λ νμΈ
μ€ννλ¦
As-is
1
2
3
4
5
App ν΄λμ€μμ λ©λ΄ νΈμΆ(execute())
β¬οΈ
MenuItem μ action(menu) μ€ν
β¬οΈ
MenuHandler λ₯Ό ꡬνν BoardAddHandler μμ action(menu) μ€ν
To-be
1
2
3
4
5
6
7
App ν΄λμ€μμ λ©λ΄ νΈμΆ(execute())
β¬οΈ
MenuItem μ action(menu) μ€ν
β¬οΈ
MenuHandler λ₯Ό ꡬνν AbstractMenuHandler μμ action(menu) μ€ν
β¬οΈ
AbstractMenuHandler λ₯Ό μμλ°μ BoardAddHandler μμ action() μ€ν
κΈ°μ‘΄μ MenuHandler λ₯Ό ꡬνν BoardAddHandler μμ action(menu) μ€ν
μ΄ λΆλΆμ λΆλ¦¬ν κ²μ΄λΌ 보면 λλ€.
java api λ μ΄λ°μμΌλ‘ μΈν°νμ΄μ€λ₯Ό μΌλΆ ꡬνν μΆμν΄λμ€λ₯Ό μ€κ°μ λκ³ μ΄λ₯Ό μμλ°μμ λ§λλ κ°μ²΄λ€μ΄ λ§λ€.
λκΈλ¨κΈ°κΈ°