DEV ℧ Developer Diary

[Refactoring] 냄새 24. 주석

해당 포스트는 inflearn의 백기선님의 강의인 리팩토링 을 듣고 정리한 글입니다.

냄새 24. 주석

  • 주석을 남겨야 할 것 같다면 먼저 코드를 리팩토링 하라. 불필요한 주석을 줄일 수 있다.
    • 모든 주석이 나쁘다는 것도 아니고, 주석을 쓰지 말자는 것도 아니다.
    • 주석은 좋은 냄새에 해당하기도 한다.
  • 관련 리팩토링
    • “함수 추출하기”를 사용해 설명이 필요한 부분을 별도의 메소드로 빼낸다.
    • “함수 선언부 변경하기”를 사용해 함수 이름을 재정의 할 수 있다.
    • 시스템적으로 어떤 필요한 규칙이 있다면, “어서션 추가하기 (Introduce Assertion)”을 적용할 수 있다.

리팩토링 43. 어서션 추가하기

  • 종종 코드로 표현하지 않았지만 기본적으로 가정하고 있는 조건들이 있다. 그런 조건을 알고리즘을 파악하거나 주석을 읽으면서 확인할 수 있다.
  • 그러한 조건은 Assertion 을 사용해서 보다 명시적으로 나타낼 수 있다.
  • Assertion은 if나 switch 문과 달리 “항상” true이길 기대하는 조건을 표현할 때 사용한다.
    • 프로그램이 Assertion에서 실패한다면 프로그래머의 실수로 생각할 수 있다.
    • Assertion이 없어도 프로그램이 동작해야 한다. (자바에서는 컴파일 옵션으로 assert 문을 사용하지 않도록 설정할 수도 있다.)
  • 특정 부분에선 특정한 상태를 가정하고 있다는 것을 명시적으로 나타냄으로써, 의사소통적인 가치를 지니고 있다.

Assertion은 주석과 같은 개념으로 체크로직이 아닌, 의사소통의 개념으로 사용한다.

Junit같은 Test의 경우 항상 Assertion을 체크하는 옵션이 켜져있다.

아래의 코드에 Assertion을 적용해보도록 하자.

  • Customer
public class Customer {

    private Double discountRate;

    public double applyDiscount(double amount) {
        return (this.discountRate != null) ? amount - (this.discountRate * amount) : amount;
    }

    public Double getDiscountRate() {
        return discountRate;
    }

    public void setDiscountRate(Double discountRate) {
        this.discountRate = discountRate;
    }
}

아래와 같이 assert (조건)을 추가한다면 Assertion을 사용할 수 있다.

public class Customer {

    ...

    public void setDiscountRate(Double discountRate) {
        assert discountRate != null && discountRate > 0;
        this.discountRate = discountRate;
    }
}

테스트 코드를 실행시켜 보도록 하자.

테스트는 setDiscountRate에 추가한 assert에 걸려 실패한다.

class CustomerTest {
    @Test
    void setDiscountRate() {
        Customer customer = new Customer();
        customer.setDiscountRate(-10D);
    }
}

리팩토링1

실패하는 이유는 Test의 설정에는 자동으로 Assertion을 체크하는 -ea 라는 옵션이 추가 되어 있기 때문이다.

-ea 는 Enable Assertion 의 약자이다.

리팩토링2