모든 주석이 나쁘지 않다. 필요한 주석도 반드시 있지만 일부 주석은 안 좋은 코드냄새를 나타낸다.
주석을 남겨야 할 것 같다면 먼저 코드를 리팩토링해야한다.
코드를 작성 중에 해당 코드 블럭에 대한 주석이 필요할 것 같다면 해당 부분을 함수로 추출하여 의도를 나타내는 함수 선언부를 변경해야 한다. 이후 적절한 위치로 옮기면 된다.
시스템적으로 어떤 필요한 규칙이 있따면, 어서션 추가하기를 적용할 수 있다.
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 |
댓글