boolean을 flag처럼 사용하고 싶다면 enum을 사용하자
chess 미션 중에, 절대값으로 계산할지, 단순 계산을 할지 정해야하는 로직이 필요해 boolean 태그를 사용하였다.
그런데, boolean 값을 flag처럼 사용하는 것이 좋은 방법이 아니고 enum을 통해 관리하는 것이 좋다는 리뷰를 받고 이에 대해 알아보았다.
위의 글에서 설명하는 내용을 좀 더 풀어서 정리해보려 한다.
boolean flag의 문제
1. 이분법적인 표현만이 가능하다.
public void addItem(final Item item, final boolean deliveryComplete) {
}
public void addItem(final Item item, final boolean deliveryComplete) {
}
배송 완료면 deliveryComplete가 true, 배송이 완료되지 않았다면 deliveryComplete가 false로 구현하는 코드이다.
그런데, 만약 배송에 대한 상태가 배송완료, 배송중, 배송준비중, 출고처리중 등 여러 가지로 바뀐다면 어떻게 할까? 아래와 같이 구현할 것인가?
public void addItem(final Item item,
final boolean deliveryComplete,
final boolean isDelivering) {
}
위보단 아래처럼 enum으로 관리하는 것이 요구 사항 변경에 유연하게 대응할 수 있다.
public enum DeliveryState {
COMPLETE,
DELIVERING,
//RELAESING,
//ORDER_ACCEPTING, 필요할 때 마다 추가
;
}
2. 모호한 해석을 낳을 수 있다.
public void addItem(final Item item, final boolean deliveryComplete) {
}
deliveryComplete가 false라면 어떤 상태일까? 주문 접수중? 출고 처리중? 배송중?
이렇게 boolean 태그는 이분법적인 표현이기 때문에 여러 가지로 해석 될 수 있다.
3. 실수를 유발한다.
public void addItem(final Item item,
final boolean deliveryComplete,
final boolean isClothes) {
}
위와 같이 두 개의 boolean 태그를 사용하는 메소드가 있다.
addItem(new Item(), false, true); // 배송되지 않은 옷
위와 같은 구조는 개발자가 실수할 여지를 줄 수 있는(?) 코드이다. 아래와 같이 개발자가 실수로 boolean 변수의 순서를 바꿔서 넣었을 시에, 심각한 버그를 유발한다.
addItem(new Item(), true, false); // 배송된 옷이 아닌
하지만 enum으로 표현할 시에는
public void addItem(final Item item,
final DeliveryState deliveryState,
final ItemKind itemKind) {
}
addItem(new Item(), DeliveryState.COMPLETE, ItemKind.CLOTHES);
//아래와 같이 컴파일 에러가 발생하기 때문에 실수할 여지가 없다.
addItem(new Item(), ItemKind.CLOTHES, DeliveryState.COMPLETE);
4. enum에 비해 가독성이 떨어진다.
addItem(new Item(), true);
//vs
addItem(new Item(), DeliveryState.COMPLETE);
Author And Source
이 문제에 관하여(boolean을 flag처럼 사용하고 싶다면 enum을 사용하자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@byeongju/boolean을-flag처럼-사용하고-싶다면-enum을-사용하자저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)