메소드 호출을 더 간단하고 이해하기 쉽게 변경
메소드의 이름을 메소드의 목적을 나타낼 수 있도록 변경
메소드의 작업시 추가 데이터가 필요하다면 새로운 매개변수를 추가하여 전달
새로운 매개변수를 추가하는 것이 삭제되는 것보다 쉽기 때문에 매개변수가 너무 많아질 수 있음
→ 긴 매개변수 목록 (Long Parameter List) 냄새 발생 가능
새로운 매개변수를 추가할 경우 메소드를 선언하는 클래스의 기존 데이터와 매개변수가 필요한 데이터를 데리고 있지 않을 수 있음
→ main클래스나 해당 데이터가 있는 클래스로 이동 필요
메소드에서 사용하지 않는 매개변수는 제거
값을 반환하지만 객체의 상태도 변경시키는 메소드가 있다면 두 기능을 분리
여러 메소드가 내부 값, 숫자, 작업만 다른 유사한 작업을 한다면 필요한 특수 값을 전달하는 매개변수를 받는 메소드로 결합
지나친 사용시 여러 간단한 메소드 대신 길고 복잡한 공통 메소드가 생성되어 코드 가독성 저하
기능의 활성화/비활성화를 매개변수로 이동할 때 주의해야 함
매개변수를 명시적 메소드로 변경(Replace Parameter with Explicit Methods)을 통해 처리해야하는 대규모 조건부 연산자를 생성할 가능성 있음
매개변수 값에 따라 실행되는 부분이 분할된다면 매소드의 개별 부분을 자체 메소드로 추출하고 원래 메소드 대신 호출
객체에서 여러 값을 매개변수로 받는다면 객체 전부를 매개변수로 넘기기
여러 매개변수 대신 이해할 수 있는 이름을 가진 단일 객체가 표시
메소드가 더 많은 데이터를 필요로 해도 메소드가 호출된 모든 위치를 변경할 필요 없음
메소드 내부만 변경하면 됨
쿼리 메소드를 호출하고 결과를 다른 메소드의 매개변수로 전달한다면 메소드 본문 내부에서 쿼리 호출로 변경
<변경 전>
int basePrice = quantity * itemPrice;
double seasonDiscount = this.getSeasonalDiscount();
double fees = this.getFees();
double finalPrice = discountedPrice(basePrice, seasonDiscount, fees);
<변경 후>
int basePrice = quantity * itemPrice;
double finalPrice = discountedPrice(basePrice);
메소드에 반복되는 매개변수 그룹을 객체로 변경
더 읽기 쉬운 코드
여러 매개변수 대신 이해할 수 있는 이름을 가진 객체가 표시
동일한 매개변수 그룹으로 인해 생성되는 코드 복제를 방지
필드 값은 생성될 때만 설정되어야 하고 그 이후에는 변경되지 않는다면 setter 메소드 제거
메소드가 다른 클래스에서 사용되지 않거나 자체 클래스 계층 내부에서만 사용된다면 메소드를 private나 protected로 생성
메소드를 숨기면 코드가 더 쉽게 발전 가능
현재 클래스를 손상시키지 않는 방법만 고려하여 개발
메소드를 비공개로 만들면 클래스의 공개 인터페이스와 공새 상테로 유지되는 메소드의 중요성 강조 가능
매개 변수 값을 설정하는 것 이상의 작업을 하는 생성자를 팩토리 메서드로 대체
팩토리 메소드는 서브 클래스일 수 있으므로 반드시 객체 반환하지 않아도 됨
팩토리 메소드는 무엇을 어떻게 리턴하는 지 설명하는 이름을 가질 수 있음
항상 새 인스턴스를 생성하는 생성자와 달리 팩토리 메소드는 이미 생성된 객체 반환 가능
메소드에 오류를 나타내는 특수 값을 반환하는 대신 예외를 throw
예외 핸들러는 정상 실행 경로와 비정상 실행 경로를 구별하는 조건문보다 더 간결한 방법
예외 클래스는 자체 메소드를 구현할 수 있으므로 오류 처리 기능(ex 오류 메시지 보내기)의 일부를 포함
예외와 달리 생성자는 새 객체만 반환해야하므로 오류 코드를 생성자에서 사용 불가능
간단한 테스트를 위한 예외를 조건 테스트로 교체
📑 참고 자료