리팩터링/리팩터링 기법

리팩터링 기법. 세터 제거하기 (Remove Setting Method)

developer-tj 2023. 3. 13. 12:00
반응형

세터 제거하기(Remove Setting Method)는 객체의 내부 상태를 직접적으로 변경하는 setter 메서드를 제거하여 불변성을 유지하도록 하는 리팩터링 기법입니다.
Setter 메서드는 객체의 내부 상태를 외부에서 변경할 수 있게 해주는데, 이러한 메서드는 객체를 불안정하게 만들어서 디버깅이 어렵고, 예상치 못한 버그가 발생할 수 있는 원인이 됩니다.

세터 제거하기는 해당 객체의 상태를 변경하는 setter 메서드를 모두 제거하고, 대신에 객체 생성자를 이용하여 객체를 초기화하거나, 메서드 호출을 통해 객체 상태를 변경하도록 하는 것입니다.
이렇게 하면 객체의 내부 상태를 직접적으로 변경하는 일이 없기 때문에 불변성을 유지할 수 있습니다.

세터 제거하기는 객체의 내부 상태를 불변성을 유지하도록 하여 디버깅이나 버그 수정을 용이하게 만들어줍니다.
또한, 객체의 내부 상태를 변경하는 권한을 제한하므로 다른 객체나 스레드에서의 예상치 못한 동작이 발생하는 경우를 방지할 수 있습니다.
그러나, 객체 상태를 변경할 때마다 새로운 객체를 생성하거나, 다른 메서드를 호출하여 변경해야 하기 때문에 추가적인 비용이 발생할 수 있습니다.

객체 생성 시 필요한 값이 너무 많아져서 생성자의 매개변수가 많아지는 경우 객체를 생성하는 별도의 빌더(builder) 클래스를 만들어서, 객체 생성 과정을 캡슐화하는 방법을 고려할 수 있습니다.
이렇게 하면 객체 생성 과정이 더 유연하고 확장 가능해지면서도, 객체의 불변성을 유지할 수 있습니다.


다음은 세터 제거하기를 적용한 C++ 예제 코드입니다.


class Person {
private:
    std::string name;
    int age;

public:
    Person(std::string name, int age) : name(name), age(age) {}

    std::string getName() const {
        return name;
    }

    int getAge() const {
        return age;
    }
};

int main() {
    Person person("Alice", 25);
    std::cout << "Name: " << person.getName() << ", Age: " << person.getAge() << std::endl;
    return 0;
}


위 예제에서는 Person 클래스에서 setName() 메소드를 제거하고, name 멤버 변수를 읽기 전용(getter)으로 변경했습니다. 따라서 Person 객체의 이름은 생성자에서 초기화된 값으로만 사용 할수 있고, 이후는 변경할 수 없게 됩니다.