* 분류 코드를 클래스로 치환( Replace Type Code with Class) 리팩토링
- 객체를 식별하기 위한 분류코드가 int 같은 기본 타입이면 타입 판별이 안되는 문제가 생김
이 문제를 해결하기 위해서 분류코드를 나타내는 새로운 클래스를 작성하는데 이것을 분류 코드를 클래스로 치환 리팩토링이라고 함.
* 순서
1) 우선 int를 사용하는 기존 인터페이스(API)를 사용함.
2) 그후 int를 사용하지 않는 새로운 인터페이스(API)로 변경함.
3) 마지막으로 기존 인터페이스(API)를 삭제함.
* 리팩토링 전 코드
package ReplaceTypeCodeWithClass;
public class Item {
public static final int TYPECODE_BOOK = 0;
public static final int TYPECODE_DVD = 1;
public static final int TYPECODE_SOFTWARE = 2;
private final int _typecode;
private final String _title;
private final int _price;
public Item(int typecode, String title, int price) {
_typecode = typecode;
_title = title;
_price = price;
}
public int getTypecode() {
return _typecode;
}
public String getTitle() {
return _title;
}
public int getPrice() {
return _price;
}
public String toString() {
return "[ "
+ getTypecode() + ", "
+ getTitle() + ", "
+ getPrice() + " ]";
}
}
package ReplaceTypeCodeWithClass;
public class Main {
public static void main(String[] args) {
Item book = new Item(Item.TYPECODE_BOOK, "세계 역사", 4800);
Item dvd = new Item(Item.TYPECODE_DVD,"뉴욕의 꿈 특별판", 3000);
Item soft = new Item(Item.TYPECODE_SOFTWARE, "튜링 머신 에뮬레이터", 3200);
System.out.println("book = " + book.toString());
System.out.println("dvd = " + dvd.toString());
System.out.println("soft = " + soft.toString());
}
}
위의 코드에서 기본타입을 사용한 분류 코드에 대한 문제점에 대해서 알아봅시다.
이상한 값이 될 수도 있는데, Item.TYPECODE_BOOK처럼 기호 상수를 사용했다고 하더라도 컴파일러는
이를 0이라는 int값으로 판담함.
그러므로, 프로그래머는 분류 코드로 아무값이나 넘길 수 있음.
new Item(12345,...)와 같이 12345가 잘못된 분류코드라는 사실을 컴파일 단계가 아닌 실행단계에서 판단함.
다른 분류 코드와 혼동할 수 있음.
분류 코드를 클래스로 치환을 하면 이런 잘못을 컴파일할 때 검출할 수 있음.
* 리팩토링 후 코드
package ReplaceTypeCodeWithClass;
public class ItemType {
public static final ItemType BOOK = new ItemType(0);
public static final ItemType DVD = new ItemType(1);
public static final ItemType SOFTWARE = new ItemType(2);
private final int _typecode;
public ItemType(int typecode) {
_typecode = typecode;
}
public int getTypecode() {
return _typecode;
}
}
package ReplaceTypeCodeWithClass;
public class Item {
// public static final int TYPECODE_BOOK = 0;
// public static final int TYPECODE_DVD = 1;
// public static final int TYPECODE_SOFTWARE = 2;
// private final int _typecode;
private final ItemType _itemtype;
private final String _title;
private final int _price;
public Item(ItemType itemtype, String title, int price) {
// _typecode = typecode;
_itemtype = itemtype;
_title = title;
_price = price;
}
// public int getTypecode() {
// return _typecode;
// }
public String getTitle() {
return _title;
}
public int getPrice() {
return _price;
}
public String toString() {
return "[ "
+ _itemtype.getTypecode() + ", "
+ getTitle() + ", "
+ getPrice() + " ]";
}
}
package ReplaceTypeCodeWithClass;
public class Main {
public static void main(String[] args) {
Item book = new Item(ItemType.BOOK, "세계 역사", 4800);
Item dvd = new Item(ItemType.DVD,"뉴욕의 꿈 특별판", 3000);
Item soft = new Item(ItemType.SOFTWARE, "튜링 머신 에뮬레이터", 3200);
System.out.println("book = " + book.toString());
System.out.println("dvd = " + dvd.toString());
System.out.println("soft = " + soft.toString());
}
}
분류 코드를 상태/전략 패턴으로 치환 (0) | 2020.02.08 |
---|---|
분류 코드를 하위 클래스로 치환 (Replace Type Code With Subclass) (0) | 2020.02.03 |
클래스 추출(Extract Class) 리팩토링 (0) | 2020.01.28 |
메서드 추출(Extract Method) 리팩토링 (0) | 2020.01.20 |
널 객체 도입 리팩토링 (0) | 2020.01.18 |
댓글 영역