본문 바로가기
독서에서 한걸음

Comments

by oncerun 2022. 12. 28.
반응형

 

모든 주석이 나쁘지 않다. 필요한 주석도 반드시 있지만 일부 주석은 안 좋은 코드냄새를 나타낸다.

 

주석을 남겨야 할 것 같다면 먼저 코드를 리팩토링해야한다. 

 

코드를 작성 중에 해당 코드 블럭에 대한 주석이 필요할 것 같다면 해당 부분을 함수로 추출하여 의도를 나타내는 함수 선언부를 변경해야 한다.  이후 적절한 위치로 옮기면 된다.

 

시스템적으로 어떤 필요한 규칙이 있따면, 어서션 추가하기를 적용할 수 있다.

 

Introduce Assertion

 

종종 코드로 표현하지 않았지만 기본적으로 가정하고 있는 조건들이 있다. 그런 조건을 알고리듬을 파악하거나 주석을 읽으면서 확인할 수 있다.

 

그러한 조건을 Assertion을 사용해서 보다 명시적으로 나타낼 수 있다.

 

Assertions은 if나 swtich 문과 달리 항상 true 이길 기대하는 조건을 표현할 때 사용한다.

 

만약 프로그램이 Assertion에서 실패한다면 프로그래머의 실수로 생각할 수 있다.

Assertion이 없어도 프로그램이 동작해야 한다. 

자바에서는 컴파일 옵션으로 assert문을 사용하지 않도록 설정할 수도 있다.

 

즉 특정 부분에선 특정한 상태를 가정하고 있다는 것을 명시적으로 나타냄으로써 의사소통적인 가치를 지닌다.

 

assertions를 절대 if문 대신 사용하지 말자. 이는 단순히 의사소통을 위한 용도이다.

 

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

 

 

해당 코드는 dicountRate가 음수가 아니라고 가정한다고 하자. assert의 위치는 실제 설정되는 부분

setDiscountRate에 작성되는 것이 맞다고 생각된다.

 


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

 

 

테스트 코드를 작성하고 음수 값을 넣으면 assertionsError가 발생한다.

 

 

이는 다음과 같은 설정때문이다.

 

 

-ea -> enableAssertions 약자로 JVM 옵션이다.

 

 

다만 실제 검증을 하는 상황이라면 assert 보다는 다음과 같이 코드가 변경되어야 할 것이다.

public void setDiscountRate(Double discountRate) {
    if (discountRate != null && discountRate > 0) {
        throw new IllegalArgumentException(discountRate + " can't be minus.");
    }

    this.discountRate = discountRate;
}
반응형

'독서에서 한걸음' 카테고리의 다른 글

도메인 모델과 경계  (0) 2023.01.03
도메인 주도 개발 Value Type  (0) 2023.01.01
Refused Bequest  (0) 2022.12.28
Alternative Classes with Different Interfaces  (0) 2022.12.27
Large Class  (0) 2022.12.26

댓글