리팩터링 기법. 파생 변수를 질의 함수로 바꾸기(Replace Derived Variable with Query)
파생 변수를 질의 함수로 바꾸기(Replace Derived Variable with Query)는 파생 변수를 질의 함수로 대체하는 리팩터링 기법입니다.
파생 변수란, 다른 변수들의 값을 조합하여 계산된 값으로, 코드의 가독성을 높이기 위해 사용되는 변수입니다.
파생 변수는 일반적으로 한 번 설정되면 그 값을 유지합니다.
하지만 이러한 파생 변수를 사용하면, 값이 변경되었을 때 각각의 참조지점에서 파생 변수의 값을 수정해주어야 합니다.
이는 오류의 위험성이 높아지며, 유지보수가 어려워집니다.
따라서 파생 변수를 질의 함수로 바꾸기는 파생 변수를 대체하여, 값을 계산하는 메서드를 직접 호출하여 사용하는 것입니다.
이렇게 하면, 파생 변수를 사용하는 코드를 모두 변경하지 않고도 값을 바로 얻을 수 있으며, 값이 변경되었을 때 직접적인 수정이 필요하지 않습니다.
예를 들어, 다음과 같은 파생 변수 area가 있다고 가정해봅시다.
class Rectangle {
private:
int width;
int height;
int area;
public:
Rectangle(int w, int h) : width(w), height(h) {
area = w * h;
}
void setWidth(int w) {
width = w;
area = width * height;
}
void setHeight(int h) {
height = h;
area = width * height;
}
int getArea() const {
return area;
}
};
위 코드에서 area는 width와 height를 조합하여 계산된 값입니다.
하지만 width와 height가 변경될 때마다 area도 변경되어야 합니다.
따라서 위 코드는 가변 데이터 문제가 발생합니다.
또한 setWidth() 함수나 setHeight() 함수를 한번도 호출하지 않고 getArea() 함수를 호출하면 계산되지 않은 데이터가 출력됩니다.
이를 해결하기 위해 파생 변수를 질의 함수로 바꾸기를 적용하여, 파생 변수인 area를 대체해봅시다.
class Rectangle {
private:
int width;
int height;
public:
Rectangle(int w, int h) : width(w), height(h) {}
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
int getArea() const {
return width * height;
}
};
위 코드에서는 area 대신에 getArea() 함수를 사용하여, width와 height를 곱하여 값을 계산합니다.
이렇게 하면, width와 height의 값을 변경해도 getArea() 함수는 항상 최신 값을 반환하게 됩니다. 또한, area를 수정하는 코드도 제거되어, 유지보수가 쉬워집니다.