반응형

리팩토링 기법 20

리팩터링 기법. 참조를 값으로 바꾸기(Change Reference to Value)

참조를 값으로 바꾸기(Change Reference to Value)는 객체를 참조로 전달하는 것이 아니라 복사해서 값으로 전달하는 방식으로 변경하는 리팩터링 기법입니다. 이 기법은 가변 데이터 문제를 해결할 수 있으며, 객체의 상태를 보호할 수 있습니다. 객체를 전달할 때 객체의 복사본을 전달하므로, 함수에서 객체의 값을 변경하더라도 원본 객체에는 영향을 주지 않습니다. 참조를 값으로 변경할 때는, 객체가 크거나 복사하는 데 많은 비용이 드는 경우를 제외하고는 크게 문제될 것이 없습니다. 객체가 커서 복사비용이 많이 든다면 참조로 전달하는 것이 더 효율적일 수 있습니다. 참조를 값으로 바꾸기를 적용하는 방법은 다음과 같습니다. 객체가 얕은 복사를 허용하는지 확인합니다. 객체가 얕은 복사를 허용하면 값으..

리팩터링 기법. 여러 함수를 변환 함수로 묶기(Combine Functions into Transform)

여러 함수를 변환 함수로 묶기(Combine Functions into Transform)는 여러 함수를 하나의 변환 함수로 합치는 리팩터링 기법입니다. 변환 함수란 입력 값을 받아서 그 값을 가공하여 반환하는 함수를 말합니다. 이 리팩터링 기법은 데이터를 변경하는 대신, 데이터를 변환하여 사용하기 때문에 가변 데이터 문제를 해결할 수 있습니다. 예를 들어, 다음과 같은 두 개의 함수가 있다고 가정해봅시다. 이 리팩터링 기법은 다음과 같은 상황에서 유용합니다. 여러 개의 함수가 비슷한 방식으로 데이터를 변환하는 경우 여러 개의 함수가 같은 데이터를 사용하는 경우 여러 개의 함수를 호출하여 연속적으로 데이터를 변환하는 경우 여러 개의 함수를 하나의 함수로 통합하면, 함수가 불필요하게 많이 생성되는 것을 방..

리팩터링 기법. 파생 변수를 질의 함수로 바꾸기(Replace Derived Variable with Query)

파생 변수를 질의 함수로 바꾸기(Replace Derived Variable with Query)는 파생 변수를 질의 함수로 대체하는 리팩터링 기법입니다. 파생 변수란, 다른 변수들의 값을 조합하여 계산된 값으로, 코드의 가독성을 높이기 위해 사용되는 변수입니다. 파생 변수는 일반적으로 한 번 설정되면 그 값을 유지합니다. 하지만 이러한 파생 변수를 사용하면, 값이 변경되었을 때 각각의 참조지점에서 파생 변수의 값을 수정해주어야 합니다. 이는 오류의 위험성이 높아지며, 유지보수가 어려워집니다. 따라서 파생 변수를 질의 함수로 바꾸기는 파생 변수를 대체하여, 값을 계산하는 메서드를 직접 호출하여 사용하는 것입니다. 이렇게 하면, 파생 변수를 사용하는 코드를 모두 변경하지 않고도 값을 바로 얻을 수 있으며,..

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

세터 제거하기(Remove Setting Method)는 객체의 내부 상태를 직접적으로 변경하는 setter 메서드를 제거하여 불변성을 유지하도록 하는 리팩터링 기법입니다. Setter 메서드는 객체의 내부 상태를 외부에서 변경할 수 있게 해주는데, 이러한 메서드는 객체를 불안정하게 만들어서 디버깅이 어렵고, 예상치 못한 버그가 발생할 수 있는 원인이 됩니다. 세터 제거하기는 해당 객체의 상태를 변경하는 setter 메서드를 모두 제거하고, 대신에 객체 생성자를 이용하여 객체를 초기화하거나, 메서드 호출을 통해 객체 상태를 변경하도록 하는 것입니다. 이렇게 하면 객체의 내부 상태를 직접적으로 변경하는 일이 없기 때문에 불변성을 유지할 수 있습니다. 세터 제거하기는 객체의 내부 상태를 불변성을 유지하도록 ..

리팩터링 기법. 질의 함수와 변경 함수 분리하기(Separate Query from Modifier)

질의 함수와 변경 함수 분리하기(Separate Query from Modifier)는 함수가 값을 반환하면서 동시에 인자를 수정하는 것을 분리하는 리팩터링 기법입니다. 이를 통해 가변 데이터 문제를 해결할 수 있습니다. 보통 함수는 인자를 받아서 일부 처리를 수행하고, 결과를 반환하는 것이 일반적입니다. 하지만 때로는 함수가 값을 반환하면서 동시에 인자를 수정하는 경우가 있습니다. 이 경우 함수를 호출할 때마다 다른 결과를 얻을 수 있기 때문에 예측하기 어렵고, 디버깅도 어렵습니다. 질의 함수와 변경 함수 분리하기를 적용하면 이러한 문제를 해결할 수 있습니다. 함수를 두 개로 분리하여 값을 반환하는 함수와 값을 수정하는 함수로 나누는 것입니다. 이렇게 하면 값을 수정하는 함수를 호출할 때는 인자만 변경..

리팩터링 기법. 변수 캡슐화하기 (Encapsulate Variable)

변수 캡슐화하기(Encapsulate Variable)는 이러한 전역 데이터 문제를 해결하기 위한 방법 중 하나입니다. 전역 데이터를 사용하지 않고 클래스 내부 변수로 변경함으로써 클래스 내에서 데이터를 캡슐화하고 관리할 수 있습니다. 변수 캡슐화하기의 장점은 다음과 같습니다. 데이터 보호: 변수에 직접 접근하는 것을 막아, 데이터를 보호할 수 있습니다. 일관성 유지: 변수에 접근하는 메소드를 통일하여 일관성을 유지할 수 있습니다. 유지보수성 개선: 객체 내부 구현을 변경해도 클라이언트 코드가 영향을 받지 않습니다. 예를 들어, 다음은 전역 변수를 사용하여 이름과 나이를 저장하는 간단한 프로그램입니다. #include #include std::string name; int age; int main() {..

리팩터링 기법. 여러 함수를 클래스로 묶기 (Combine Functions into Class)

"Combine Functions into Class" 리팩터링 기법은 "긴 매개 변수 목록" 문제를 해결하는 데 도움이 되는 기법 중 하나입니다. 이 기법은 여러 개의 함수를 하나의 클래스로 묶는 것입니다. 이를 통해 관련된 기능을 하나의 단위로 묶어서 더 간결하고 유지보수가 용이한 코드를 작성할 수 있습니다. 예를 들어, 다음과 같은 두 개의 함수가 있다고 가정해 봅시다. void process_order(std::string customer_name, std::string product_name, int quantity, double price); void cancel_order(std::string customer_name, std::string product_name); 위 함수들은 주문을 처리..

리팩터링 기법. 매개변수를 질의 함수로 바꾸기 (Replace Parameter with Query)

"매개변수를 질의 함수로 바꾸기(Replace Parameter with Query)"는 함수의 매개변수(parameter)를 함수 안에서 계산하는 쿼리(query)로 대체하는 리팩터링 기법입니다. 함수의 매개변수 목록은 함수의 변동요인을 나타내고, 짧을수록 이해 가기가 쉽습니다. 함수의 매개변수를 사용하여 함수 내부에서 계산이 이루어지는 경우, 이는 함수 내부와 외부의 결합도를 높일 수 있습니다. 즉, 함수의 입력값이 변할 때마다 함수 내부에서 처리하는 방식이 달라져야 한다면, 이를 유지보수하기 어려워집니다. 어떤 매개변수를 다른 매개변수를 통해 알아낼수 있다면 "중복 매개변수"라고 생각할 수 있습니다. 매개변수를 줄이면 책임 주체가 달라집니다. 매개변수가 있다면 호출하는 쪽에 책임이 있고, 매개변수가..

리팩터링 기법. 임시 변수를 질의 함수로 바꾸기 (Replace Temp with Query)

"임시 변수를 질의 함수로 바꾸기 (Replace Temp with Query)"는 메서드 내부에서 임시 변수를 사용하는 대신 해당 계산을 반환하는 메서드를 만드는 리팩터링 기법입니다. 임시 변수를 만든다는 거 자체가 리팩터링이라고 할 수 있습니다. 해당 임수 변수를 통해서 어떤 의도를 가진 로직인지 알 수 있기 때문입니다. 이러한 임시 변수를 만드는 로직 자체를 함수로 만들 수 있습니다. 임시 변수를 만드는 함수는 해당 임시 변수를 사용하는 곳에서 사용하며, 해당 임시 변수를 사용하는 코드 로직을 함수로 추출할 때, 매개 변수 넘겨주는 대신 임시 변수 생성 함수를 호출하는 할 수 있습니다. 예를 들어, 다음과 같은 코드가 있다고 가정해 봅시다. double calculateTotalPrice(int q..

반응형