리팩터링/냄새 (리팩터링할 시점)

냄새 12. 반복되는 switch문(Repeated Switches)

developer-tj 2023. 4. 4. 12:00
반응형

반복되는 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();
}


이렇게 하면, 새로운 동물이 추가될 때마다 새로운 동물 클래스를 만들어 주면 되기 때문에 코드의 유지보수성이 높아집니다. 또한, 코드 중복도 줄일 수 있으며, 가독성도 좋아집니다.


적용 가능한 리팩터링 기법