[Refactoring] 메소드 호출 단순화

말하는 감자·2022년 5월 9일
0

Refactoring

목록 보기
8/9
post-thumbnail

📌 메소드 호출 단순화 (Simplifying Method Calls)

메소드 호출을 더 간단하고 이해하기 쉽게 변경


✏️ 메소드명 변경 (Rename Method)

메소드의 이름을 메소드의 목적을 나타낼 수 있도록 변경

✔️ 장점

  • 코드 가독성 향상

✏️ 매개변수 추가 (Add Parameter)

메소드의 작업시 추가 데이터가 필요하다면 새로운 매개변수를 추가하여 전달

✔️ 장점

  • 항상 객체에 보관하는 것이 의미가 없거나 자주 변경되는 데이터가 필요할 때 유용

❌ 단점

  • 새로운 매개변수를 추가하는 것이 삭제되는 것보다 쉽기 때문에 매개변수가 너무 많아질 수 있음
    → 긴 매개변수 목록 (Long Parameter List) 냄새 발생 가능

  • 새로운 매개변수를 추가할 경우 메소드를 선언하는 클래스의 기존 데이터와 매개변수가 필요한 데이터를 데리고 있지 않을 수 있음
    → main클래스나 해당 데이터가 있는 클래스로 이동 필요


✏️ 매개변수 제거 (Remove Parameter)

메소드에서 사용하지 않는 매개변수는 제거

✔️ 장점

  • 메소드에서 실제로 필요한 매개변수만 포함

✏️ 수정자에서 쿼리 분리 (Separate Query from Modifier)

값을 반환하지만 객체의 상태도 변경시키는 메소드가 있다면 두 기능을 분리

✔️ 장점

  • 프로그램의 상태를 변경하지 않는 쿼리는 메소드 호출한다는 이유로 결과가 의도치않게 변경되는 것을 걱정할 필요없이 안전하게 여러번 호출 가능

❌ 단점

  • 명령을 수행한 후 데이터를 가져오는 것이 더 편한 경우 존재
    ex) 데이터베이스에서 항목을 삭제하고 삭제된 행 수 알기

✏️ 매개변수를 받는 메소드 (Parameterize Method)

여러 메소드가 내부 값, 숫자, 작업만 다른 유사한 작업을 한다면 필요한 특수 값을 전달하는 매개변수를 받는 메소드로 결합

❌ 단점

  • 지나친 사용시 여러 간단한 메소드 대신 길고 복잡한 공통 메소드가 생성되어 코드 가독성 저하

  • 기능의 활성화/비활성화를 매개변수로 이동할 때 주의해야 함
    매개변수를 명시적 메소드로 변경(Replace Parameter with Explicit Methods)을 통해 처리해야하는 대규모 조건부 연산자를 생성할 가능성 있음


✏️ 매개변수를 명시적 메소드로 변경(Replace Parameter with Explicit Methods)

매개변수 값에 따라 실행되는 부분이 분할된다면 매소드의 개별 부분을 자체 메소드로 추출하고 원래 메소드 대신 호출

✔️ 장점

  • 코드 가독성 향상
    코드의 목적을 이해하는 것이 더 쉬워짐

✏️ 전체 객체 보존 (Preserve Whole Object)

객체에서 여러 값을 매개변수로 받는다면 객체 전부를 매개변수로 넘기기

✔️ 장점

  • 여러 매개변수 대신 이해할 수 있는 이름을 가진 단일 객체가 표시

  • 메소드가 더 많은 데이터를 필요로 해도 메소드가 호출된 모든 위치를 변경할 필요 없음
    메소드 내부만 변경하면 됨

❌ 단점

  • 메소드가 덜 유연해짐
    이전에는 메소드가 여러 다른 소스에서 데이터를 가져올 수 있었으나 리팩토링 후에는 특정 인터페이스가 잇는 객체로만 사용을 제한

✏️ 매개변수를 메소드 호출로 변경 (Replace Parameter with Method Call)

쿼리 메소드를 호출하고 결과를 다른 메소드의 매개변수로 전달한다면 메소드 본문 내부에서 쿼리 호출로 변경

<변경 전>

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);

✔️ 장점

  • 불필요한 매개변수를 제거하고 메소드 호출 단순화

❌ 단점

  • 메소드 재작성해야하는 경우 생김

✏️ 매개변수 객체 도입 (Introduce Parameter Object)

메소드에 반복되는 매개변수 그룹을 객체로 변경

✔️ 장점

  • 더 읽기 쉬운 코드
    여러 매개변수 대신 이해할 수 있는 이름을 가진 객체가 표시

  • 동일한 매개변수 그룹으로 인해 생성되는 코드 복제를 방지

❌ 단점

  • 데이터만 새 클래스로 이동하고 거기서 동작이나 관련 작업을 하지 않는다면 데이터 클래스(Data Class) 냄새 발생

✏️ 사용하지 않는 Setter 제거 (Remove Setting Method)

필드 값은 생성될 때만 설정되어야 하고 그 이후에는 변경되지 않는다면 setter 메소드 제거


✏️ 메소드 숨기기 (Hide Method)

메소드가 다른 클래스에서 사용되지 않거나 자체 클래스 계층 내부에서만 사용된다면 메소드를 private나 protected로 생성

✔️ 장점

  • 메소드를 숨기면 코드가 더 쉽게 발전 가능
    현재 클래스를 손상시키지 않는 방법만 고려하여 개발

  • 메소드를 비공개로 만들면 클래스의 공개 인터페이스와 공새 상테로 유지되는 메소드의 중요성 강조 가능


✏️ 생성자를 팩토리 메소드로 교체 (Replace Constructor with Factory Method)

매개 변수 값을 설정하는 것 이상의 작업을 하는 생성자를 팩토리 메서드로 대체

✔️ 장점

  • 팩토리 메소드는 서브 클래스일 수 있으므로 반드시 객체 반환하지 않아도 됨

  • 팩토리 메소드는 무엇을 어떻게 리턴하는 지 설명하는 이름을 가질 수 있음

  • 항상 새 인스턴스를 생성하는 생성자와 달리 팩토리 메소드는 이미 생성된 객체 반환 가능


✏️ 오류 코드를 예외로 교체 (Replace Error Code with Exception)

메소드에 오류를 나타내는 특수 값을 반환하는 대신 예외를 throw

✔️ 장점

  • 예외 핸들러는 정상 실행 경로와 비정상 실행 경로를 구별하는 조건문보다 더 간결한 방법

  • 예외 클래스는 자체 메소드를 구현할 수 있으므로 오류 처리 기능(ex 오류 메시지 보내기)의 일부를 포함

  • 예외와 달리 생성자는 새 객체만 반환해야하므로 오류 코드를 생성자에서 사용 불가능

❌ 단점

  • 예외는 오류나 심각한 상황을 알리기 위해서만 throw해야 함
    코드 실행을 관리하기 위해 사용하면 안됨

✏️ 예외를 테스트로 교체 (Replace Exception with Test)

간단한 테스트를 위한 예외를 조건 테스트로 교체

✔️ 장점

  • 간단한 조건부가 예외 처리 코드보다 더 명확할 수 있음

📑 참고 자료

profile
나는 말하는 감자다

0개의 댓글