반응형

리팩토링 46

냄새 14. 성의 없는 요소(Lazy Element)

성의 없는 요소(Lazy Element)는 프로그램에서 사용하지 않는 코드 또는 기능을 가리키는 코드 냄새 중 하나입니다. 이러한 코드는 작성 시 개발자가 과거 또는 현재의 개발자가 아닌 미래의 다른 개발자들을 위해 만드는 것이 좋습니다. 성의없는 요소는 코드의 복잡도를 증가시키고, 유지보수와 확장성을 어렵게 만듭니다. 또한 이러한 코드는 프로그램의 실행 속도를 늦출 수 있습니다. 성의없는 요소를 제거하는 방법 중 하나는, 불필요한 코드를 제거하고 단순하게 유지보수할 수 있는 코드로 수정하는 것입니다. 이러한 작업은 코드 리팩터링 과정에서 수행됩니다. 예를 들어, 사용하지 않는 변수나 함수를 제거하거나, 중복된 코드를 제거하거나, 불필요한 주석을 제거하는 등의 작업이 이에 해당합니다. 또 다른 방법으로는..

리팩터링 기법. 반복문을 파이프라인으로 바꾸기(Replace Loop with Pipeline)

반복문을 파이프라인으로 바꾸기(Replace Loop with Pipeline)는 컬렉션을 다루는 로직에서 특히 효과적인 기법입니다. 기존에는 반복문을 사용하여 컬렉션의 원소를 하나씩 처리했지만, 이를 파이프라인으로 변경하여 더욱 간결하고 가독성이 좋은 코드로 만드는 것입니다. 파이프라인은 입력 데이터를 처리하고 출력 데이터를 생성하는 여러 단계로 나누어져 있는 프로세스를 의미합니다. 각 단계는 이전 단계의 출력을 입력으로 받아 다음 단계의 출력을 생성합니다. 이러한 구조를 활용하여 컬렉션을 처리하는 코드를 구현할 수 있습니다. 예를 들어, 다음과 같은 반복문 코드가 있다고 가정해 봅시다. std::vector numbers = {1, 2, 3, 4, 5}; std::vector doubledNumber..

냄새 13. 반복문(Loops)

반복문(Loops)을 사용하는 것이 코드 작성의 효율성을 높일 수 있지만, 반복문이 중첩되거나 복잡한 조건문과 함께 사용되는 경우 코드의 복잡성이 증가하고 코드를 이해하기 어려워질 수 있습니다. 반복문의 문제점 중 하나는 다른 로직과 함께 사용되는 경우 유지보수성이 낮아질 수 있다는 것입니다. 예를 들어, 아래의 코드에서 반복문은 사이즈를 계산하고, 각 색상의 평균값을 계산하는 두 가지 다른 로직과 함께 사용됩니다. int size = 0; double redSum = 0.0; double greenSum = 0.0; double blueSum = 0.0; for (int i = 0; i < pixels.size(); ++i) { size++; redSum += pixels[i].red(); greenS..

냄새 12. 반복되는 switch문(Repeated Switches)

반복되는 switch문(Repeated Switches)은 여러 개의 switch 문이 동일한 조건식을 검사하는 경우를 말합니다. 예를 들어, 다음과 같은 코드를 생각해보겠습니다. void processAnimalSound(Animal* animal) { switch (animal->getType()) { case AnimalType::CAT: // process cat sound break; case AnimalType::DOG: // process dog sound break; case AnimalType::COW: // process cow sound break; default: // process default sound break; } } void processAnimalMovement(Anim..

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

조건부 로직을 다형성으로 바꾸기(Replace Conditional with Polymorphism)란 객체의 타입에 따라 분기되는 조건부 로직을 상속 구조를 이용하여 다형성을 적용하여 코드를 간결하고 유연하게 만드는 리팩터링 방법입니다. 조건부 로직은 보통 if-else문, switch-case문 등으로 구현되며, 객체의 타입에 따라 다른 로직을 수행하도록 설계되어 있습니다. 이러한 코드는 코드의 유지보수성이 나쁘며, 새로운 객체 타입이 추가될 때마다 코드의 수정이 필요합니다. 따라서 이러한 조건부 로직을 다형성을 이용하여 분리하고, 객체의 타입에 따라 해당하는 메서드를 호출하는 방식으로 코드를 변경하는 것이 좋습니다. 이 방법을 사용하면, 객체의 타입에 따라 다른 동작을 수행해야 할 때 새로운 객체 ..

리팩터링 기법. 타입 코드를 서브클래스로 바꾸기(Replace Type Code with Subclasses)

타입 코드(Type Code)란, 하나의 클래스 안에서 여러 종류의 객체를 표현하기 위해 사용하는 코드를 말합니다. 이는 예를 들어, 도형 클래스 안에서 도형의 종류를 표시하기 위한 숫자나 문자열과 같은 것을 말할 수 있습니다. 타입 코드를 서브클래스로 바꾸기(Replace Type Code with Subclasses)는 이러한 타입 코드를 사용하는 것을 서브클래스로 분리하는 방법입니다. 타입 코드에 따라 객체의 특성이 달라지는 것을 서브클래스로 만들어 표현함으로써, 객체지향적인 설계를 더욱 강화할 수 있습니다. 서브클래스로 분리하는 방법은, 기존 클래스의 타입 코드에 해당하는 각 서브클래스를 만든 다음, 기존 클래스에서 해당 타입 코드를 제거하고 대신 적절한 서브클래스의 인스턴스를 생성하여 반환하도록..

리팩터링 기법. 기본형을 객체로 바꾸기(Replace Primitive with Object)

기본형을 객체로 바꾸기(Replace Primitive with Object)는 기본형 변수를 사용하는 대신 새로운 클래스를 정의하고 그 클래스의 인스턴스를 사용하는 방식으로 코드를 개선하는 리팩터링 기법입니다. 기본형 변수는 더 큰 데이터 구조와 연결되어 있지 않기 때문에 코드의 가독성과 유지보수성을 저해할 수 있습니다. 반면, 객체는 속성과 행동을 갖는 더 복잡한 데이터 구조를 나타낼 수 있습니다. 예를 들어, 기본형 변수로 통화를 나타내는 경우, 환율이나 기타 통화와 관련된 정보를 캡슐화하고, 통화 간의 변환을 수행할 수 있는 새로운 클래스를 정의할 수 있습니다. 또 다른 예로, 기본형 변수로 날짜를 나타내는 경우, 시간대, 일괄처리 및 기타 관련 정보를 캡슐화하고, 날짜 간의 비교, 연산 및 계산..

냄새 11. 기본형 집착(Primitive Obsession)

기본형 집착(Primitive Obsession)은 객체 지향 언어에서 자주 나타나는 코드 냄새 중 하나입니다. 기본형 집착은 프로그래머가 객체를 사용하기보다 기본형 데이터 타입(정수, 문자열, 부동 소수점 등)을 사용하여 비즈니스 로직을 구현하도록 유도하는 코드 구조를 의미합니다. 기본형 집착은 코드의 가독성과 유지보수성을 저해하며, 프로그램의 일관성과 안정성을 감소시킬 수 있습니다. 예를 들어, 각 사용자의 나이를 저장하는 경우, 기본적으로 나이를 int 형으로 저장할 수 있습니다. 그러나 이는 유효한 나이 값만이 저장된다는 보장이 없으므로 나이 값이 음수일 수 있거나 매우 큰 값이 될 수 있습니다. 이러한 문제를 해결하기 위해 객체를 사용할 수 있습니다. 나이를 나타내는 Age 클래스를 정의하면 유..

냄새 10. 데이터 뭉치(Data Clumps)

데이터 뭉치(Data Clumps)는 코드에서 같은 데이터 집합이 여러 곳에서 사용되는 경우를 가리키는 냄새입니다. 이러한 데이터 뭉치는 흔히 다음과 같은 형태로 나타납니다. Class Employee { public: Employee(string inName, string inEmployeeAreaCode, string inEmployeeNumber) :_name(inName), _employeeAreaCode(inEmployeeAreaCode), _employeeNumber(inEmployeeNumber) {} string GetEmployeePhoneNumber() { return _employeeAreaCode + "-" + _employeeNumber; } private: string _empl..

냄새 9. 기능 편애(Feature Envy)

기능 편애(Feature Envy)는 어떤 메소드가 자신이 속한 클래스가 아닌 다른 클래스의 메소드나 데이터를 자주 호출할 때 발생하는 코드 냄새(code smell)입니다. 즉, 메소드가 다른 클래스의 기능에 너무 의존적이어서, 해당 메소드가 다른 클래스에 더 적합하게 위치할 수 있는지를 고민해봐야 하는 경우입니다. 기능 편애는 두 개의 클래스 간에 너무 많은 상호작용이 일어나는 것으로 보통 인식됩니다. 이러한 경우 해당 클래스들은 결합도(coupling)가 높아져서 코드의 재사용성, 유지보수성, 확장성이 떨어지게 됩니다. 또한, 한 클래스가 다른 클래스의 많은 기능을 사용하게 되면, 코드 일관성이 떨어지고, 클래스의 책임을 명확하게 분리하지 못하게 됩니다. 기능 편애는 보통 다음과 같은 문제를 유발할..

반응형