반응형
반복되는 switch문(Repeated Switches)은 여러 개의 switch 문이 동일한 조건식을 검사하는 경우를 말합니다.
예를 들어, 다음과 같은 코드를 생각해보겠습니다.
void processAnimalSound(Animal* animal) {
switch (animal->getType()) {
case AnimalType::CAT:
// process cat sound
break;
case AnimalType::DOG:
// process dog sound
break;
case AnimalType::COW:
// process cow sound
break;
default:
// process default sound
break;
}
}
void processAnimalMovement(Animal* animal) {
switch (animal->getType()) {
case AnimalType::CAT:
// process cat movement
break;
case AnimalType::DOG:
// process dog movement
break;
case AnimalType::COW:
// process cow movement
break;
default:
// process default movement
break;
}
}
위 코드에서 processAnimalSound()와 processAnimalMovement() 함수에서 각각 switch문이 존재하며, 동일한 조건식을 사용하고 있습니다.
이 경우 조건식이 변경되거나 다른 동물이 추가될 때 마다 모든 switch문을 변경해주어야 하는 번거로움이 있습니다.
이러한 문제를 해결하기 위해 각각의 동물을 클래스로 정의하고, 해당 클래스에서 메서드를 정의하여 동물의 소리와 움직임을 처리하도록 수정할 수 있습니다.
이렇게 되면 switch문을 제거하고, 동물 클래스의 새로운 클래스를 추가하면 됩니다.
class Animal {
public:
virtual void makeSound() = 0;
virtual void move() = 0;
};
class Cat : public Animal {
public:
void makeSound() override {
// process cat sound
}
void move() override {
// process cat movement
}
};
class Dog : public Animal {
public:
void makeSound() override {
// process dog sound
}
void move() override {
// process dog movement
}
};
class Cow : public Animal {
public:
void makeSound() override {
// process cow sound
}
void move() override {
// process cow movement
}
};
void processAnimal(Animal* animal) {
animal->makeSound();
animal->move();
}
이렇게 하면, 새로운 동물이 추가될 때마다 새로운 동물 클래스를 만들어 주면 되기 때문에 코드의 유지보수성이 높아집니다. 또한, 코드 중복도 줄일 수 있으며, 가독성도 좋아집니다.
적용 가능한 리팩터링 기법
'리팩터링 > 냄새 (리팩터링할 시점)' 카테고리의 다른 글
냄새 14. 성의 없는 요소(Lazy Element) (0) | 2023.04.08 |
---|---|
냄새 13. 반복문(Loops) (0) | 2023.04.05 |
냄새 11. 기본형 집착(Primitive Obsession) (0) | 2023.03.31 |
냄새 10. 데이터 뭉치(Data Clumps) (0) | 2023.03.30 |
냄새 9. 기능 편애(Feature Envy) (0) | 2023.03.29 |