본문 바로가기

독서에서 한걸음52

Replace Conditional with Polymorphism 조건부 로직을 다형성으로 변경해 보자. 복잡한 조건식을 상속과 다형성을 사용해 코드를 보다 명확하게 분리할 수 있다. switch문을 사용해서 타입에 따라 각기 다른 로직을 사용하는 코드 기본 동작과 타입에 따른 특수한 기능이 섞여있는 경우에 상속 구조를 만들어서 기본 동작을 상위클래스에 두고 특수한 기능을 하위 클래스로 옮겨서 각 타입에 따른 차이점을 강조할 수 있다. 다만 단순한 조건문은 그대로 두어도 좋다. 오직 복잡한 조건문을 다형서울 활용해 좀 더 나은 코드로 만들 수 있는 경우에만 적용하자! public class Employee { private String type; private List availableProjects; public Employee(String type, List ava.. 2022. 12. 21.
타입 코드를 서브클래스로 변경하기 비슷하지만 다른 것들을 표현해야 하는 경우, 나는 열거형을 많이 사용한다. 이를 통해 타입 검증을 하거나 필요한 정보를 저장하고 있다가 제공해주거나 해당 값에 대한 기능을 제공하는 메서드를 포함할 수 있기 때문이다. 분기에 대한 생각 없이 Enum을 사용하다보면 매우 좋고 한계가 없어 보인다. 하지만 최근 각각의 타입에 맞는 기능을 추가 구현해야하는 요청이 있는데, 이 경우 if문이나 switch문을 사용해 타입마다 해야하는 로직을 작성하는 경우가 많아졌다. 이는 보기도 좋지 않고 타입이 추가될 때마다 해당 코드를 찾아서 고쳐야 하는 상황.. 즉 변경점이 퍼져있어 하나의 코드를 고쳤지만 여러 모듈에 영향을 받는 상황이 됐다. 이러한 상황에 적용할 수 있는 리팩토링을 찾아보았다. Replace Type C.. 2022. 12. 19.
Primitive Obsession 기본형 집착하는 코드에 대한 냄새이다. 애플리케이션이 다루고 있는 도메인에 필요한 기본 타입을 만들지 않고 프로그래밍 언어가 제공하는 기본 타입을 사용하는 경우가 많다. 예를 들어 int, double, float, String, boolean..으로 표현하는 데이터이다. 기본형으로는 단위 또는 표기법을 표현하기 어렵다. 전화번호, 돈의 단위들도 마찬가지로 표현하기 위해 코드를 지저분하게 만든 경우에 확인해볼 냄새이다. 관련 리팩터링 기술을 하나씩 알아보자. 기본형을 객체로 바꾸기 개발 초기에는 기본형으로 표현한 데이터가 나중에는 해당 데이터와 관련 있는 다양한 기능을 필요로 하는 경우 발생한다. 화씨, 섭씨와 같이 각종 단위를 표현해야 한다거나, 전화번호의 양식, 주민등록번호 등등 이러한 포맷을 지원해.. 2022. 12. 19.
Shotgun Surgery 산탄총 수술이라는 뜻의 해당 리팩터링 냄새는 애플리케이션의 변경 사항이 생겼을 때 여러 모듈을 수정해야 하는 경우를 빗대어 표현한 것이다. 이는 코드의 응집도가 낮고 결합도 높다는 것을 의미한다. 변경 사항이 여러곳에 흩어진다면 찾아서 고치기도 어렵고 중요한 변경 사항을 놓칠 수 있는 가능성도 생긴다. 관련된 기술로는 다음과 같다. 함수 옮기기 또는 필드 옮기기로 필요한 변경 내역을 하나의 클래스로 모을 수 있다. 비슷한 데이터를 사용하는 여러 함수가 있다면 여러 함수를 클래스로 묶을 수도 있다. 단계 쪼개기를 사용해 공통으로 사용되는 함수의 결과물들을 하나로 묶을 수 있다. Move Field 좋은 데이터 구조를 가지고 있다면, 해당 데이터에 기반한 어떤 행위를 코드로 옮기는 것도 간편하고 단순해진다... 2022. 12. 18.
Divergent Change 보통 좋은 코드라고 하면 응집도는 높고 결합도는 낮아야 한다. 응집도는 얼마나 관련 있는 데이터나 함수들이 한 곳에 잘 밀집되어 있는가를 말하고 결합도는 얼마나 느슨한 의존성을 가지고 있는지 말한다. 이렇지 않은 코드는 다음과 같은 상황을 만날 수 있다. 여러 문제로 인해 하나의 클래스를 지속적으로 고치게 된다면 해당 클래스가 좋은 코드인지 의심해봐야 한다. 또 한 변경사항을 만들려면 여러 클래스를 돌아다니면서 고쳐야 한다는 것이다. Divergent Change는 어떤 한 모듈이 여러가지 이유로 다양하게 변경되어야 하는 상황을 말한다. 서로 다른 문제는 서로 다른 모듈에서 해결해야 한다. 이는 모듈의 책임이 분리되어 있을수록 해당 문맥을 더 잘 이해할 수 있으며 다른 문제는 신경 쓰지 않아도 되기 때문.. 2022. 12. 14.
Change Reference to Value 참조를 값으로 변경하는 리팩터링 기법이다. 참조를 값으로 변경하는 것이니까 이는 mutable 한 값을 immutable 하게 변경하겠다는 의미를 내포한다. 객체를 크게 두 가지 객체로 볼 수 있다. 참조 객체는 얼마든지 그 내부의 값이 변경될 수 있는 객체를 말한다. 값 객체는 객체의 필드의 값들을 보고 동등성을 판단하는 보통 불변 객체라고 하는 객체이다. 보통 사용 기준을 나눌 때 객체의 변경사항을 다른 코드에도 전파시키고 싶다면 보통 참조 객체를 사용하고 반면 값 객체인 경우 그러한 사이드 이펙트 없이 사용하고 싶다면 값 객체를 사용하게 할 수 있다. 다음 코드는 값이 변경될 수 있는 참조 객체를 의미하는 코드이다. public class TelephoneNumber { private String .. 2022. 12. 11.
Replace Derived Variable with Query, Combine Functions into Transform Replace Derived Variable with Query 파생된 변수를 질의 함수로 변경하는 리팩터링 기술. 어디선가 계산되어서 만들어진 변수라는 것이다. 이는 소스 데이터를 기반으로 어떠한 작업을 통해 만들어진 변수를 말한다. 이러한 변수를 사용하는 부분을 함수로 변경하는 리팩터링이다. 변경할 수 있는 데이터, 변수를 줄이는 방법 중 하나이다. 즉 계산식을 그대로 함수로 표현하여 변수를 줄이는 방법이라고 볼 수 있다. 변수를 줄임으로서 계산 자체가 데이터의 의미를 잘 표현하지 못하는 경우를 방지하고, 어디선가 잘못된 값으로 수정될 수 있는 가능서울 제거할 수 있다. 계산에 필요한 데이터가 변하지 않는 값이라면, 계산의 결과에 해당하는 데이터 역시 불변 데이터이기 때문에 해당 변수는 그대로 유지할.. 2022. 12. 11.
Separate Query from Modifier && Remove Setting Method 가변 데이터에 대한 내용 중 하나 인 질의 함수와 변경 함수 분리하기 리팩터링과 세터 제거하기에 대해 알아보자. Separate Query from Modifier Modifier라는 것은 어떤 변경을 발생 시킬 수 있는 함수를 말합니다. 이 주제에 대해 이해를 하는 쉬운 예시가 하나 있는데 바로 getter/setter입니다. 조회를 하는 쿼리와 변경을 가하는 쿼리를 구분해서 함수를 만드는 것에 대한 이야기입니다. 이를 command-query separation 규칙이라고 한다. 어떤 값을 리턴하는 함수는 사이드 이펙트가 없어야 한다라는 규칙인데요. 근데 사이드 이펙트를 구분할 때 가령, 캐시는 중요한 객체 상태 변화는 아니라고 이야기하고 있다. 어떤 메서드 호출로 인해 캐시 데이터를 변경하더라도 분.. 2022. 12. 10.
Split Variable 데이터를 변경하다 보면 예상치 못했던 결과나 해결하기 어려운 버그가 발생한다. 이를 보통 사이드 이펙트라고 하는데, 특정 부분의 변경이 외부에서도 영향을 끼쳐 의도하지 않은 버그가 발생하는 것이다. 함수형 프로그래밍 언어는 참조가 아닌 복사본을 전달한다. 하지만 그 밖의 프로그래밍 언어는 데이터 변경을 허용하고 있다. 따라서 변경되는 데이터를 사용 시 발생할 수 있는 리스크를 관리할 수 있는 방법을 적용하는 것이 좋다. 변수 쪼개기 ( Split Variable ) 어떤 변수가 여러 번 재할당 되어도 적절한 경우 - 반복문에서 순회하는데 사용하는 변수 또는 인덱스 - 값을 축적시키는데 사용하는 변수 그밖에 경우에 재할당 되는 변수가 있다면 해당 변수는 여러 용도로 사용되는 것이며 변수를 분리해야 더 이해.. 2022. 12. 5.
변수 캡슐화 전역 변수와 같이 전역으로 사용되는 변수에 대해 고려해보자. 해당 변수가 mutable 하는 특성을 갖고 전역적으로 사용된다면 많은 문제를 일으킬 가능성을 가지고 있을 수 있다. 이 경우 Encapsulate Variable을 적용해 접근을 제어하거나 어디서 사용하는지 파악하기 쉽게 만들 수 있다. 메서드를 리팩터링 하는 과정은 점진적으로 변경이 가능하지만, 데이터의 변경은 한 번에 모두 변경해야 해야 한다. 따라서 더욱 안전하게 데이터를 다루기 위해서는 메서드 구조 변경 작업으로 대체해볼 수 있다. 만약 데이터가 사용되는 범위가 커질 수록 캡슐화하는 것이 더 중요해지는데 함수를 사용해서 값을 변경하도록 하면 쉽게 검증 로직을 추가하거나 변경에 따르는 후속 작업을 추가하는 것이 편리해진다. 불변 데이터는.. 2022. 12. 4.