반응형

리팩토링 기법 20

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

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

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

리팩터링 기법. 클래스 인라인(Inline Class)

클래스 인라인하기(Inline Class)는 작은 클래스를 효율적으로 사용하기 위한 리팩터링 기법 중 하나입니다. 클래스 인라인하기는 클래스의 모든 기능을 클래스의 사용처에 삽입하여 호출하는 비용을 줄이는 방법입니다. 해당 리팩터링은 클래스 추출하기(Extract Class) 와 반대되는 리팩터링입니다. 클래스 인라인하기를 적용하면, 작은 클래스를 사용할 때 클래스를 생성하는 비용이 줄어들기 때문에, 성능 개선에 효과적입니다. 하지만 클래스의 크기가 너무 크거나 복잡한 경우에는 오히려 가독성이 떨어질 수 있으므로 주의해야 합니다. 클래스 인라인하기를 적용하는 방법은 다음과 같습니다. 클래스의 기능을 호출하는 모든 코드를 찾습니다. 클래스의 기능이 호출되는 곳으로 이동하여, 클래스의 기능을 호출하는 코드를..

리팩터링 기법. 함수 인라인(Inline Function)

함수 인라인(Inline Function)은 함수 호출 대신 함수 코드 자체를 호출하는 코드로 대체하는 리팩터링 기법 중 하나입니다. 즉, 함수 호출이 발생하는 부분을 함수의 코드로 직접 대체함으로써 함수 호출의 오버헤드를 제거하고 성능을 향상시킬 수 있습니다. 인라인 함수는 함수의 크기가 작을 때 효과적입니다. 함수 호출이 많이 일어나는 루프와 같은 코드에서 인라인 함수를 사용하면 성능을 향상시킬 수 있습니다. 또한, 인라인 함수는 일반적으로 함수 호출을 대체하기 때문에 코드의 가독성이 향상될 수도 있습니다. 함수를 인라인으로 변환하는 것은 일반적으로 함수 코드를 함수 호출로 대체하는 것보다 코드 양이 늘어나기 때문에 코드의 크기가 커지는 단점이 있습니다. 또한, 함수 코드를 직접 호출하는 것이기 때문..

리팩터링 기법. 필드 옮기기(Move Field)

필드 옮기기(Move Field)는 클래스의 필드를 다른 클래스로 옮기는 리팩터링 기법 중 하나입니다. 클래스의 필드는 그 클래스가 속한 책임 영역에 해당하는 데이터여야 하지만, 때로는 다른 클래스와 관련된 데이터가 되기도 합니다. 이럴 때는 그 필드를 다른 클래스로 이동시켜야 합니다. 이 기법은 두 클래스 사이의 결합도를 줄여주고, 데이터와 책임이 더 잘 어울리도록 만들어줍니다. 필드를 옮길 때는 먼저 이 필드가 다른 클래스에서 사용될지, 아니면 새로운 클래스가 필요한지를 결정해야 합니다. 새로운 클래스가 필요하다면, 먼저 그 클래스를 작성하고, 이전 클래스의 필드를 새 클래스의 필드로 옮기고, 이전 클래스에서는 그 필드에 대한 getter, setter 메서드를 작성합니다. 그리고 이전 클래스의 메서..

리팩터링 기법. 클래스 추출하기(Extract Class)

클래스 추출하기(Extract Class) 리팩터링 기법은 하나의 클래스가 두 가지 이상의 역할을 수행할 때, 이 중 일부를 새로운 클래스로 분리해내는 방법입니다. 하나의 클래스가 여러 역할을 수행하게 되면 코드의 가독성, 유지보수성이 떨어지며, 하나의 역할에 영향을 주는 변경이 다른 역할에도 영향을 미칠 수 있습니다. 이러한 문제를 해결하기 위해 두 가지 이상의 역할을 수행하는 클래스를 분리하여 각각의 역할에 맞는 새로운 클래스를 만들어주는 것이 클래스 추출하기입니다. 이 리팩터링 기법을 적용할 때는 먼저, 원래 클래스에서 새로운 클래스를 분리해낼 역할을 결정합니다. 그 다음, 새로운 클래스의 필드와 메서드를 정의하고, 이를 호출하는 코드를 새로운 클래스로 이동시켜줍니다. 예를 들어, Customer ..

리팩터링 기법. 함수 옮기기(Move Function)

함수 옮기기(Move Function) 리팩터링 기법은 이러한 문제를 해결하기 위해 자주 변경되는 코드를 별도의 함수로 추출하는 기법입니다. 예를 들어, 하나의 클래스에서 두 가지 다른 이유로 자주 변경되는 메서드가 있다면 이 메서드들을 각각 별도의 클래스로 추출합니다. 이렇게 하면 각 클래스는 하나의 책임만을 갖게 되고, 유지 보수와 코드 가독성도 향상됩니다. 또한 이렇게 추출된 클래스들은 독립적으로 변경될 수 있기 때문에, 시스템 전반적인 유연성도 향상됩니다. 예를 들어, 자동차 클래스에서 엔진 관련 메서드와 외관 관련 메서드가 자주 변경되는 경우, 이 두 메서드를 각각 별도의 클래스인 Engine과 Exterior로 추출할 수 있습니다. 이렇게 하면 각 클래스는 엔진과 외관을 각각 담당하게 됩니다...

리팩터링 기법. 단계 쪼개기(Split Phase)

단계 쪼개기(Split Phase)는 복잡한 작업이 하나의 함수 안에서 이뤄지는 경우, 작업을 단계별로 분리하여 별도의 함수로 추출하는 리팩터링 기법입니다. 이를 통해 기능이 구현되는 방식을 단순화하고, 변경이 필요한 경우 관련된 코드만 수정할 수 있게 됩니다. 예를 들어, 데이터베이스에서 정보를 읽어와 필요한 가공 작업을 수행하는 함수가 있다고 가정해 봅시다. 이 함수 안에는 데이터베이스 연결, 쿼리 실행, 결과 처리 등 많은 작업이 들어갈 수 있습니다. 이렇게 작업이 복잡해지면 코드를 수정하기 어렵고, 오류가 발생하기 쉬워집니다. 이 경우 단계 쪼개기를 적용하여 코드를 리팩터링할 수 있습니다. 예를 들어, 데이터베이스 연결과 쿼리 실행을 담당하는 함수와 결과 처리를 담당하는 함수를 분리하여 구현할 수..

반응형