반응형

리팩터링 46

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

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

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

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

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

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

냄새 8. 산탄총 수술(Shotgun Surgery)

산탄총 수술(Shotgun Surgery)는 하나의 변경으로 여러 개의 클래스를 수정해야 하는 코드 구조를 의미합니다. 즉, 특정한 기능을 추가하거나 수정하기 위해 여러 클래스의 코드를 일일이 수정해야 하는 경우를 말합니다. (산탄총 처럼 넓게 퍼져서 여러군대 수술이 필요한 상황) 이러한 코드 구조는 유지보수성을 나쁘게 하고, 수정 작업이 너무 복잡해지며, 실수할 가능성도 높아집니다. 이를 방지하기 위해서는 관련된 기능들을 하나의 클래스로 추출하거나, 중복 코드를 제거하는 등의 방법을 사용하여 코드 구조를 개선할 필요가 있습니다. 적용 가능한 리팩터링 기법 함수 옮기기 (Move Function) 필드 옮기기 (Move Field) 여러 함수를 클래스로 묶기 (Combine Functions into C..

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

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

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

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

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

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

냄새 7. 뒤엉킨 변경(Divergent Change)

뒤엉킨 변경(Divergent Change)은 하나의 클래스나 모듈이 너무 많은 변화를 겪는 상황을 말합니다. 클래스가 어떤 변경 사항이 있을 때마다 여러 부분에서 수정이 일어나야 한다면, 그 클래스는 뒤엉킨 변경에 빠져 있다고 볼 수 있습니다. 뒤엉킨 변경은 소프트웨어의 유지보수성을 저해하는 요인 중 하나입니다. 한 클래스나 모듈이 변경될 때마다 여러 곳에서 수정이 필요하다면, 그 코드의 수정 작업이 복잡해지고 오류가 발생하기 쉬워집니다. 이는 코드를 이해하기 어렵게 만들어 개발자의 생산성을 저해합니다. 뒤엉킨 변경을 해결하기 위해서는 단일 책임 원칙(Single Responsibility Principle)을 적용하여 각 클래스나 모듈이 하나의 책임을 가지도록 설계해야 합니다. 또한, 추상화를 적극적..

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

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

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

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

반응형