6주차 실습은 제시된 클래스들을 적절히 추상화하여 리팩토링하는 과제입니다.
피자 클래스 추상화, 세트 메뉴 클래스 추상화 그리고 이 둘을 다시 한번 더 추상화하는 총 3가지의 작업으로 구성되어있습니다.
실습 간 주요 제한 사항들은 아래와 같습니다.
instanceof , getClass() 메서드와 같은 Run Time Type Information 기능을 쓸 수 없습니다.
위 그림은 실습에서 제공된 기존 코드들을 클래스 다이어그램으로 나타낸 것입니다.
addXXX) 빼는(removeXXX) 기능을 제공합니다.isValid 메서드에서는 현재 피자의 토핑 조합이 유효한지를 체크합니다.getPrice 메서드에서는 피자의 가격을 반환합니다. 피자의 가격은 토핑의 관계없이, 피자의 종류에 의해 결정됩니다.isVeggie , isCheese 와 같은 private 헬퍼 메서드들을 가집니다.public boolean addBacon() {
if (isValid()) {
return false;
}
this.toppings.add(Topping.BACON);
++this.meatCount;
return true;
}
public boolean addPeperoni() {
if (isValid()) {
return false;
}
this.toppings.add(Topping.PEPERONI);
++this.meatCount;
return true;
}
// 그 외 다른 addXXX 메서드들 다수
기존 설계에서는 위 코드 예시와 같이, 토핑을 추가하는 로직이 중복되어 존재합니다.
cheeseCount 같은 특정 토핑의 개수를 별도록 추적하는 변수들은, toppings 리스트의 size 메서드나 순회를 통해 충분히 계산 가능한 정보를 중복 저장하고 있습니다. 이는 추후 유지보수 시 데이터 일관성을 깨뜨리기 쉬운 구현입니다.