매직 넘버를 사용할 때 문제점
- 의미를 알기 어려움.
- 수정하기 어려움
- 상수로 치환하여 리펙토링 한다.
리펙토링 단계
매직넘버를 기호 상수로 치환
1. 기호 상수 선언, 매직 넘버를 기호 상수로 치환, 기호 상수에 의존하는 다른 매직 넘버를 찾아 기호 상수로 바꿈
2. 테스트
리팩토링하여 얻을 수 있는 효과
1. 단순 숫자보다 enum같은 의미를 가지는 String을 사용하여 코드 이해 하기가 수월하다.
2. enum을 사용함으로서 메서드 호출할 때 정의되지 않은(잘못된) 값으로 호출 시, 컴파일 단계에서 오류 탐지 가능하다.
리팩토링 전 코드
package magicnumber.before;
public class Robot {
public String name;
public Robot(String name) {
this.name = name;
}
public void order(int command) {
if(command == 0) { // 걷기
System.out.println(name + " walk");
}
else if(command == 1) { // 멈추기
System.out.println(name + " stop");
}
else if(command == 2) { // 점프
System.out.println(name + " jump");
}
else {
System.out.println("error");
}
}
}
package magicnumber.before;
public class RobotMain {
public static void main(String[] args) {
Robot robot = new Robot("James");
// 문제 1 : 코드만 봤을 때 0, 1, 2와 같은 숫자가 무엇을 의미하는지 알 수 없음.
robot.order(0); // work
robot.order(1);
robot.order(2);
// 문제 2 : 지원하지 않는 기능의 숫자 입력 시 컴파일 단계에서 발견 못하고 런타임 단계에서 발견됨
robot.order(100); //
}
}
package magicnumber.after;
public class Robot {
public String name;
public enum Command{
WALK, STOP, JUMP
}
public Robot(String name) {
this.name = name;
}
public void order(Command command) {
if(command == Command.WALK) { // 걷기
System.out.println(name + " walk");
}
else if(command == Command.STOP) { // 멈추기
System.out.println(name + " stop");
}
else if(command == Command.JUMP) { // 점프
System.out.println(name + " jump");
}
else {
System.out.println("error");
}
}
}
package magicnumber.after;
public class RobotMain {
public static void main(String[] args) {
Robot robot = new Robot("James");
// 해결 1 : 코드만 봤을 때 0, 1, 2와 같은 숫자가 있을때 보다 더 코드를 이해하기 쉬움
robot.order(Robot.Command.WALK); // work
robot.order(Robot.Command.STOP);
robot.order(Robot.Command.JUMP);
// 해결 2 : 지원하지 않는 기능의 잘못 입력 시 컴파일 단계에서 문제 발견 됨
//robot.order(Command.XXX); //
}
}
'java > java 리팩토링' 카테고리의 다른 글
03. null 객체 사용 (0) | 2023.02.07 |
---|---|
02. 제어를 위한 플래그 삭제 (0) | 2023.02.07 |
리팩토링이란 (0) | 2023.02.06 |
리팩토링 대상 발견하는 법, 조건 정리 (0) | 2023.02.03 |
1. 의미 있는 이름 짓기 (0) | 2022.04.01 |
댓글