반응형

전체 글 59

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

리팩터링 기법. 파생 변수를 질의 함수로 바꾸기(Replace Derived Variable with Query)

파생 변수를 질의 함수로 바꾸기(Replace Derived Variable with Query)는 파생 변수를 질의 함수로 대체하는 리팩터링 기법입니다. 파생 변수란, 다른 변수들의 값을 조합하여 계산된 값으로, 코드의 가독성을 높이기 위해 사용되는 변수입니다. 파생 변수는 일반적으로 한 번 설정되면 그 값을 유지합니다. 하지만 이러한 파생 변수를 사용하면, 값이 변경되었을 때 각각의 참조지점에서 파생 변수의 값을 수정해주어야 합니다. 이는 오류의 위험성이 높아지며, 유지보수가 어려워집니다. 따라서 파생 변수를 질의 함수로 바꾸기는 파생 변수를 대체하여, 값을 계산하는 메서드를 직접 호출하여 사용하는 것입니다. 이렇게 하면, 파생 변수를 사용하는 코드를 모두 변경하지 않고도 값을 바로 얻을 수 있으며,..

리팩터링 기법. 세터 제거하기 (Remove Setting Method)

세터 제거하기(Remove Setting Method)는 객체의 내부 상태를 직접적으로 변경하는 setter 메서드를 제거하여 불변성을 유지하도록 하는 리팩터링 기법입니다. Setter 메서드는 객체의 내부 상태를 외부에서 변경할 수 있게 해주는데, 이러한 메서드는 객체를 불안정하게 만들어서 디버깅이 어렵고, 예상치 못한 버그가 발생할 수 있는 원인이 됩니다. 세터 제거하기는 해당 객체의 상태를 변경하는 setter 메서드를 모두 제거하고, 대신에 객체 생성자를 이용하여 객체를 초기화하거나, 메서드 호출을 통해 객체 상태를 변경하도록 하는 것입니다. 이렇게 하면 객체의 내부 상태를 직접적으로 변경하는 일이 없기 때문에 불변성을 유지할 수 있습니다. 세터 제거하기는 객체의 내부 상태를 불변성을 유지하도록 ..

리팩터링 기법. 질의 함수와 변경 함수 분리하기(Separate Query from Modifier)

질의 함수와 변경 함수 분리하기(Separate Query from Modifier)는 함수가 값을 반환하면서 동시에 인자를 수정하는 것을 분리하는 리팩터링 기법입니다. 이를 통해 가변 데이터 문제를 해결할 수 있습니다. 보통 함수는 인자를 받아서 일부 처리를 수행하고, 결과를 반환하는 것이 일반적입니다. 하지만 때로는 함수가 값을 반환하면서 동시에 인자를 수정하는 경우가 있습니다. 이 경우 함수를 호출할 때마다 다른 결과를 얻을 수 있기 때문에 예측하기 어렵고, 디버깅도 어렵습니다. 질의 함수와 변경 함수 분리하기를 적용하면 이러한 문제를 해결할 수 있습니다. 함수를 두 개로 분리하여 값을 반환하는 함수와 값을 수정하는 함수로 나누는 것입니다. 이렇게 하면 값을 수정하는 함수를 호출할 때는 인자만 변경..

반응형