리팩터링/리팩터링 기법

리팩터링. 플래그 인수 제거하기 (Remove Flag Argument)

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

"플래그 인수 제거하기 (Remove Flag Argument)" 리팩토링 기법은 함수의 매개변수로 전달되는 플래그(flag) 인자를 제거하는 기법입니다.

 

보통 함수에 여러 가지 동작을 수행하는 데 필요한 여러 개의 플래그 인자를 전달하게 되면, 함수를 호출할 때 플래그 값만 보고 어떤 동작을 수행하는지 이해하기 어려울 수 있습니다.

또한 플래그 인자가 많아질수록 함수의 시그니처(signature)가 복잡해지고, 함수를 호출할 때 인자를 전달하기 어렵게 됩니다.

 

이를 해결하기 위해 "Remove Flag Argument" 리팩토링 기법을 사용하면 함수 내부에서 플래그 값에 따라 분기하는 대신, 각각의 플래그 값에 대응하는 별도의 함수를 만들어서 호출합니다.

이를 통해 함수의 시그니처가 단순해지고, 함수 호출 시 전달하는 인자의 개수를 줄일 수 있습니다.

 

다음은 플래그 인자를 제거하는 예시 코드입니다.

// 플래그 인자를 사용한 예시 코드
void send_email(std::string subject, std::string message, std::string to_address, 
	std::string cc_address = "", std::string bcc_address = "", 
    bool is_html = false) {
    // 이메일 발송 로직
}

 

위 코드에서 send_email() 함수는 이메일 발송을 위한 함수로, 매개변수로 subject, message, to_address, cc_address, bcc_address, is_html 값을 받습니다. is_html 매개변수는 이메일 본문이 HTML 형식인지 여부를 나타내는 플래그 값입니다.

 

위 코드를 "플래그 인수 제거하기" 기법을 사용하여 아래와 같은 코드로 작성 할 수 있습니다.

// 플래그 인자를 제거한 예시 코드
void send_plain_text_email(std::string subject, std::string message, std::string to_address, 
	std::string cc_address = "", std::string bcc_address = "") {
    // 일반 텍스트 형식의 이메일 발송 로직
}

void send_html_email(std::string subject, std::string message, std::string to_address, 
	std::string cc_address = "", std::string bcc_address = "") {
    // HTML 형식의 이메일 발송 로직
}

 

"플래그 인수 제거하기"  리팩터링 기법을 사용하여 리팩터링하면, is_html 매개변수를 제거하고 각각 send_plain_text_email() 함수와 send_html_email() 함수를 각각 만들어서 호출하면 됩니다.

 

이렇게 하면 함수 호출 시 플래그 값을 전달하는 대신, 각각의 플래그 값을 나타내는 함수를 직접 호출합니다.