반응형

분류 전체보기 59

리팩터링. Use Default Values

Use Default Values는 긴 매개 변수 목록 문제를 해결하는 방법 중 하나로, 객체 생성 시 일부 매개변수에 대해 기본값을 지정하는 방식입니다. 객체 생성에 필요한 매개변수 중 일부는 일반적으로 고정값을 가지는 경우가 많습니다. 예를 들어, 생성되는 객체의 색상이나 크기 등은 사용자가 매번 변경하지 않는 경우가 많기 때문입니다. 이 경우, 이러한 매개변수에 대해 미리 기본값을 지정해두고, 객체 생성 시 해당 매개변수의 값을 지정하지 않으면 자동으로 기본값을 사용하도록 합니다. 이렇게 Use Default Values 방식을 사용하면 객체 생성 시 필수적으로 매개변수를 모두 전달할 필요가 없어지기 때문에 코드가 간결해지고 가독성이 높아집니다. 또한, 기본값을 사용하도록 미리 설정해두면, 객체 생..

리팩터링. Use a Data Structure

Use a Data Structure는 긴 매개 변수 목록 문제를 해결하는 방법 중 하나로, 객체 생성에 필요한 매개변수를 하나의 데이터 구조로 묶어서 전달하는 방식입니다. 일반적으로 객체 생성에 필요한 매개변수들은 서로 연관이 있기 때문에 하나의 데이터 구조로 묶을 수 있습니다. 이를 통해 객체 생성에 필요한 매개변수의 개수를 줄일 수 있으며, 객체 생성 코드의 가독성과 유지보수성을 높일 수 있습니다. 다음은 C++ 언어를 사용하여 Use a Data Structure 방식으로 객체를 생성하는 예시입니다. #include #include struct ProductConfiguration { double price; int quantity; double tax_rate; double discount; }..

리팩터링. Use a Configuration File

Use a Configuration File은 긴 매개 변수 목록 문제를 해결하는 방법 중 하나로, 객체 생성에 필요한 매개변수를 파일로부터 읽어와 객체를 생성하는 방식입니다. Configuration 파일은 일반적으로 텍스트 파일로 구성되며, 객체 생성에 필요한 매개변수를 파일에 저장해 놓고, 이를 읽어와 객체를 생성합니다. 이를 통해 객체 생성에 필요한 매개변수의 개수를 줄일 수 있으며, 객체 생성 코드의 가독성과 유지보수성을 높일 수 있습니다. 다음은 C++ 언어를 사용하여 Configuration 파일을 사용하여 객체를 생성하는 예시입니다. #include #include #include class Product { public: double price; int quantity; double ta..

리팩터링. Use a Builder

Use a Builder는 긴 매개 변수 목록 문제를 해결하는 방법 중 하나로, 객체 생성에 사용되는 매개변수가 많은 경우, 객체 생성을 담당하는 별도의 빌더 객체를 사용하여 객체를 생성하는 방식입니다. Builder 패턴을 사용하면 매개변수를 하나씩 전달하는 대신, 별도의 빌더 객체를 사용하여 객체를 생성하고 초기화할 수 있습니다. 이를 통해 객체 생성에 필요한 매개변수의 개수를 줄일 수 있으며, 코드의 가독성과 유지보수성을 높일 수 있습니다. 다음은 C++ 언어를 사용하여 Builder 패턴을 구현한 예시입니다. class Product { public: double price; int quantity; double tax_rate; double discount; Product(double price..

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

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

냄새 4. 긴 매개 변수 목록 (Long Parameter List)

긴 매개변수 목록(Long Parameter List)은 함수의 매개변수가 너무 많거나, 매개변수의 종류가 복잡해져서 함수의 이해와 유지보수를 어렵게 만드는 문제를 해결하는 기법입니다. 긴 매개변수 목록 문제는 매개변수의 순서를 혼란스럽게 만들 수 있고, 함수 호출 코드를 작성할 때도 실수를 유발할 수 있습니다. - 과연 해당 함수가 한가지 일을 하고 있는지? - 매개변수가 반드시 필요한지? 따라서 이러한 문제를 해결하기 위해서는 긴 매개변수 목록을 개선하거나, 이를 대체할 수 있는 더 나은 설계를 생각해보는 것이 좋습니다. 긴 매개변수 목록 문제를 해결하는 대표적인 리팩토링 기법으로는 "매개변수 객체 만들기(Introduce Parameter Object)"와 "객체 통째로 넘기기(Preserve Wh..

리팩터링. 조건문을 다형성으로 바꾸기(Replace Conditional with Polymorphism)

여러 타입에 따라 각기 다른 로직으로 처리해야 하는 경우에 다형성을 적용해서 조건문을 보다 명확하게 분리 할 수 있다. switch 문을 각기 다른 클래스로 만들어 제거할수 있다. 모든 조건문을 다형성으로 바꿔야 하는 것은 아니다 switch (bird.type) { case "유럽 제비": return "보통이다"; case "아프리카 제비": return (bird.numberOfCoconuts > 2) ? "지쳤다" : "보통이다"; case "노르웨이 파랑 앵무": return (bird.voltage > 100) ? "그을렸다" : "예쁘다"; default: return "알 수 없다"; } 위 같은 switch 문을 아래 처럼 각기 다른 클래스로 만들어 switch 문을 없앤다 class E..

리팩터링. 반복문 쪼개기 (Split Loop)

하나의 반복문에서 여러 다른 작업을 하는 코드를 쉽게 찾아볼 수 있다. 반복문을 여러개로 쪼개면 보다 쉽게 이해하고 수정할 수 있다. 성능 저하가 발생 할 수 있으나 미미하다. 리팩터링 이후에 반복문을 쪼개서 병목이라 밝혀지면 합치면 된다. int averageAge = 0 int totalSalary = 0 for (auto people : peoples) { averageAge += people.age; totalSalary += people.salary; } averageAge = averageAge / totalSalary; 위 코드는 사람의 평균 나이와 총 급여를 구하는 로직이다. 하나의 반복문에서 2가지의 의도를 가지고 있다. 1. 모든 사람 나이를 구한다. 2. 모든 사람 급여를 구한다. i..

리팩터링. 조건문 분해하기 (Decompose Conditional)

"조건문 분해하기(Decompose Conditional)"는 긴 조건문을 작은 부분으로 분해하여 코드의 가독성과 유지보수성을 높이는 리팩터링 기법입니다. 보통 긴 조건문은 가독성을 해치며, 조건문이 하나 추가될 때마다 코드가 복잡해져 유지보수성이 떨어지는 문제가 있습니다. 이 때문에 조건문을 작은 부분으로 분해하여 의도를 분명히 하고, 코드를 간결하게 만들어 유지보수성을 높이는 것이 좋습니다. "조건문 분해하기"를 적용하려면 다음과 같은 단계를 따를 수 있습니다. 복잡한 조건문을 찾습니다. 조건문의 각 부분을 분해하고 의미 있는 이름을 부여합니다. 조건문의 각 부분을 함수로 추출합니다. 분해된 조건문을 새로 작성한 함수를 이용해 다시 작성합니다. 다음은 "조건문 분해하기"를 적용한 예시입니다. 다음 코..

리팩터링. 함수를 명령으로 바꾸기 (Replace Function with Command)

"함수를 명령으로 바꾸기(Replace Function with Command)"는 함수를 객체로 대체하는 리팩터링 기법 중 하나입니다. 함수를 독립적인 명령 객체로 만드는 방법입니다. 이 리팩터링은 함수 호출을 객체의 메서드 호출로 바꿈으로써 코드의 유연성과 확장성을 향상시킵니다. 대부분의 명령 객체는 메서드 하나로 구성되며 이 메서드를 요청해 실행합니다. 명령 객체는 되돌리기(undo) 기능을 만들 수 있습니다. 더 복잡한 기능의 여러 메소드를 추가할 수 있습니다. 상속을 사용하여 사용자 맞춤형으로 만들 수 있습니다. 다음 예제는 은행 계좌(Account)에서 돈을 인출(withdraw)하는 상황을 나타냅니다. //Account 클래스: 은행 계좌를 나타내는 클래스로, 계좌의 잔액(balance)을 ..

반응형