분류 코드를 사용할 때의 문제점
- 기본 타입 분류 코드 : 객체의 종류를 특정 값으로 나타낸다
- BOOK:0, TOY:1, BREAD:2, APPLE:3 등
- 실수로 정의 하지 않은 값이 들어갈 수 있음
- 다른 그룹의 분류 코드와 혼란 일으킬 가능성 존재
- 컴파일시에 정의되지 않은 코드 넣어도 에러 발생하지 않음.
- 아래는 안 좋은 예시
public static final int BOOK = 0;
public static final int FOOD = 1;
public static final int TOY = 2;
new Category(100); // 문제 부분, 100 값은 정의되어 있지 않아서 오류지만 컴파일 에러 없음
리팩토링 순서
- 분류 코드를 클래스로 치환하기
- 새로운 분류 코드 클래스를 작성하여 기존 코드에서 사용
- 새로운 분류 코드 클래스에 새로운 메서드를 추가하고, 이를 기존 코드에 적용
- 기존 코드에서 사용하지 않는 메서드 등은 삭제
AS-IS
package typecodewithclass.before;
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 int typeCode;
private String title;
private int price;
public Item(int typeCode, String title, int price) {
this.typeCode = typeCode;
this.title = title;
this.price = price;
}
public int getTypeCode() {
return typeCode;
}
public String getTitle() {
return title;
}
public int getPrice() {
return price;
}
public String toString() {
return getTypeCode() + "," + title + "," + price;
}
}
package typecodewithclass.before;
public class Main {
public static void main(String[] args) {
Item bookItem = new Item(Item.TYPECODE_BOOK, "토지", 10000);
Item dvdItem = new Item(Item.TYPECODE_DVD, "바람과 함께 사라지다", 20000);
Item softwareItem = new Item(Item.TYPECODE_SOFTWARE, "Window", 30000);
System.out.println(bookItem);
System.out.println(dvdItem);
System.out.println(softwareItem);
}
}
TO-BE
1단계 : 새로운 분류 코드 클래스를 작성하여 기존 코드에서 사용
package typecodewithclass.after;
public class Item {
public static final int TYPECODE_BOOK = ItemType.BOOK.getTypeCode();
public static final int TYPECODE_DVD = ItemType.DVD.getTypeCode();
public static final int TYPECODE_SOFTWARE = ItemType.SOFTWARE.getTypeCode();
private int typeCode;
private String title;
private int price;
public Item(int typeCode, String title, int price) {
this.typeCode = typeCode;
this.title = title;
this.price = price;
}
public int getTypeCode() {
return typeCode;
}
public String getTitle() {
return title;
}
public int getPrice() {
return price;
}
public String toString() {
return getTypeCode() + "," + title + "," + price;
}
}
package typecodewithclass.after;
public class ItemType {
private int typeCode;
public static final ItemType BOOK = new ItemType(0);
public static final ItemType DVD = new ItemType(1);
public static final ItemType SOFTWARE = new ItemType(2);
public ItemType(int typeCode) {
this.typeCode = typeCode;
}
public int getTypeCode() {
return typeCode;
}
public ItemType getItemType(int typeCode) {
switch(typeCode) {
case 0: return BOOK;
case 1: return DVD;
case 2: return SOFTWARE;
default: return null;
}
}
}
package typecodewithclass.after;
public class Main {
public static void main(String[] args) {
Item bookItem = new Item(Item.TYPECODE_BOOK, "토지", 10000);
Item dvdItem = new Item(Item.TYPECODE_DVD, "바람과 함께 사라지다", 20000);
Item softwareItem = new Item(Item.TYPECODE_SOFTWARE, "Window", 30000);
System.out.println(bookItem);
System.out.println(dvdItem);
System.out.println(softwareItem);
}
}
2단계 : 새로운 분류 코드 클래스에 새로운 메서드를 추가하고, 이를 기존 코드에 적용
package typecodewithclass.after;
public class Item {
public static final int TYPECODE_BOOK = ItemType.BOOK.getTypeCode();
public static final int TYPECODE_DVD = ItemType.DVD.getTypeCode();
public static final int TYPECODE_SOFTWARE = ItemType.SOFTWARE.getTypeCode();
//private int typeCode;
private ItemType itemType;
private String title;
private int price;
public Item(ItemType typeCode, String title, int price) {
//this.typeCode = typeCode;
this.itemType = typeCode;
this.title = title;
this.price = price;
}
public String getTitle() {
return title;
}
public int getPrice() {
return price;
}
public String toString() {
return itemType.getTypeCode() + "," + title + "," + price;
}
}
package typecodewithclass.after;
public class Main {
public static void main(String[] args) {
Item bookItem = new Item(ItemType.BOOK, "토지", 10000);
Item dvdItem = new Item(ItemType.DVD, "바람과 함께 사라지다", 20000);
Item softwareItem = new Item(ItemType.SOFTWARE, "Window", 30000);
System.out.println(bookItem);
System.out.println(dvdItem);
System.out.println(softwareItem);
}
}
3단계 : 기존 코드에서 사용하지 않는 메서드 등은 삭제
package typecodewithclass.after;
public class Item {
public static final int TYPECODE_BOOK = ItemType.BOOK.getTypeCode();
public static final int TYPECODE_DVD = ItemType.DVD.getTypeCode();
public static final int TYPECODE_SOFTWARE = ItemType.SOFTWARE.getTypeCode();
private ItemType itemType;
private String title;
private int price;
public Item(ItemType typeCode, String title, int price) {
this.itemType = typeCode;
this.title = title;
this.price = price;
}
public String getTitle() {
return title;
}
public int getPrice() {
return price;
}
public String toString() {
return itemType.getTypeCode() + "," + title + "," + price;
}
}
package typecodewithclass.after;
public class ItemType {
private int typeCode;
public static final ItemType BOOK = new ItemType(0);
public static final ItemType DVD = new ItemType(1);
public static final ItemType SOFTWARE = new ItemType(2);
public ItemType(int typeCode) {
this.typeCode = typeCode;
}
public int getTypeCode() {
return typeCode;
}
}
'java > java 리팩토링' 카테고리의 다른 글
06. 생성자를 팩토리 메서드로 바꾸기 (0) | 2023.02.10 |
---|---|
05. if-else, if-switch 문의 분류 코드를 하위 클래스로 만들기 (0) | 2023.02.08 |
03. null 객체 사용 (0) | 2023.02.07 |
02. 제어를 위한 플래그 삭제 (0) | 2023.02.07 |
1. 매직넘버를 상수로 바꾸기 (0) | 2023.02.06 |
댓글