300x250
✍️ 악취 8 : 산탄총 수술 코드에 변경이 생겼을 때 관련 있는 여러 모듈 혹은 클래스 혹은 메서드를 수정해야 한다면 코드의 응집도는 낮고 결합도는 높은 상황일 가능성이 높다. 따라서 이런 현상이 발견된다면 관련 있는 데이터를 한 곳으로 옮겨서 응집도를 높이고 책임을 명확히 분리해서 결합도를 낮출 필요가 있다. 여기 낮은 응집도와 높은 결합도의 산탄총 악취를 해결하기 위한 세 가지 리팩토링 기법이 있다. 1. "함수 옮기기, 필드 옮기기" 필요한 변경 내역을 하나의 클래스로 모으기 2. "단계 쪼개기" 공통으로 사용되는 메서드의 결과물을 하나로 묶기 3. "함수 인라인, 클래스 인라인" 흩어진 로직을 한 곳으로 🍊 필드 옮기기 좋은 데이터 구조를 가지고 있다면, 해당 데이터를 기반한 행위를 메서드로 작..
✍️ 악취 7 : 뒤엉킨 변경 좋은 코드는 응집도는 높고 결합도는 낮아야 한다. 응집도는 관련 있는 데이터 혹은 기능이 한 곳에 잘 밀집되어 있는가를 말하고, 결합도는 상호간 의존하는 정도를 의미한다. 가령 서로 연관이 없는 A, B 모듈이 수정됐을 때, 양쪽에서 모두 C 모듈의 수정을 요구한다면 응집도가 낮고 결합도는 높다고 할 수 있다. 이처럼 한 모듈이 여러 가지 이유로 수정되어야 한다면 역할이 제대로 나눠지지 않았을 수 있다. 서로 다른 문제는 서로 다른 모듈에서 해결해야 한다. 뒤엉킨 변경을 해결하기 위한 세 가지 리팩토링 기법이 있다. 1. "단계 쪼개기" 서로 다른 문맥의 코드를 분리 2. "함수 옮기기" 적절한 모듈로 함수를 옮기기 3. "클래스 추출하기" 모듈이 클래스 단위라면 🍊 단계 ..
✍️ 악취 6 : 가변 데이터 자바는 변수의 값을 변경하거나, 레퍼런스 변수로 인스턴스의 값을 변경할 수 있다. 이처럼 데이터의 변경이 자유로운 장점도 있지만, 데이터 변경으로 문제가 생기는 경우가 발생한다. 가령 일부 메서드에선 데이터의 변경이 올바른듯하지만 다른 메서드에선 데이터의 변경이 곧 예상치 못한 에러로 이어지는 경우가 있다. 가변 데이터가 유발하는 잠재적 리스크를 최소화하는 여 섯 가지 리팩토링이 있다. 1. "변수 쪼개기" 여러 데이터를 하나의 변수로 관리하지 않기 2. "질의 메서드와 변경 메서드 분리하기" 사이트 이펙트가 있는 메서드와 없는 메서드를 분리 3. "세터 제거하기" 필요한 경우에만 세터를 만들기 4. "파생 변수를 질의 메서드로" 계산해서 알아낼 수 있는 값이라면 변수가 아..
✍️ 악취 5 : 전역 변수(전역 데이터) 전역 변수, 가령 자바의 public static 변수는 어플리케이션 전반에 걸쳐서 접근하고 수정할 수 있기에 어느 위치에서 값이 참조되고 수정되는지 파악하기 어렵다. 이건 비단 전역 변수만의 문제가 아니라 클래스 필드도 그러하다. 클래스 필드가 외부에 public하게 노출되어 있다면 필드의 상태 변경을 파악하기 어려워진다. 전역 데이터를 위해 리팩토링을 활용할 수 있다. 1. 변수 캡슐화하기 🍊 변수 캡슐화하기 전역 변수와 클래스의 필드가 외부에 public하게 노출되어 참조 위치가 많아지면 상태 값을 추적하기 어렵다. 가령 단순 읽기 위해 변수를 참조했는지 값을 변경하기 위해 참조했는지 파악하기 어렵다. 게다가 변수에 값을 직접 할당하면 값에 대한 검증이 불..
✍️ 악취 4 : 긴 매개변수 목록 메서드의 매개변수가 많을수록 함수의 역할을 이해하기 어렵다. 고려해 볼 사항으로 과연 그 메서드가 한 가지 일을 하고 있는 게 맞는지, 불필요한 매개변수는 없는지, 논리적으로 그룹핑할 매개변수 목록은 없는지 검토해야 한다. 긴 매개 변수 목록을 위해 네 가지 리팩토링을 활용할 수 있다. 1. "매개 변수를 질의 함수로 바꾸기" 만약 어떤 매개변수를 다른 매개변수를 통해 알아낼 수 있다면 2. "플래그 제거하기" 매개 변수가 플래그로 사용된다면 3. "객체를 통째로 넘기기" 기존 자료구조에서 세부적인 데이터를 가져와서 플랫하게 넘기는 대신 4. "그룹핑해서 매개변수 객체 만들기" 일부 매개변수들이 반복적으로 넘겨진다면 🍊 매개 변수를 질의 함수로 바꾸기 메서드의 매개변수..
✍️ 악취 : 긴 함수 메서드가 너무 길다면 가독성이 떨어지고 짧은 메서드는 읽는 이로 하여금 많은 문맥 전환을 요구한다. 대부분의 상황에서 너무 긴 메서드는 의도를 파악하기 어렵기 때문에 짧은 메서드에 비해 리팩토링 우선순위가 높다. 긴 메서드를 위해 세 가지 리팩토링을 활용할 수 있다. 1. 함수 추출하기 (임시 변수를 질의 함수로, 매개변수 객체 만들기, 객체 통째로 넘기기, 함수를 명령으로 바꾸기) 2. 조건문 분해햐기 3. 반복문 쪼개기 🍊 함수 추출하기 1. 임시 변수를 질의 함수로 변수를 활용하면 반복되는 동일한 계산을 피할 수 있고 변수의 이름으로 의미를 표현할 수도 있다. 하지만 메서드를 추출할 때 변수는 걸림돌이 될 수 있다. 이때 변수도 마찬가지로 별도의 메서드로 추출한다면 기존에 추..