NULL 대신 컬렉션 사용으로 코드 품질 향상

NULL 대신 컬렉션으로 대체하는 리팩토링

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발

대상자

  • 중급 이상의 소프트웨어 개발자
  • Null 체크와 복잡한 조건문으로 인한 코드 유지보수 어려움이 있는 개발자
  • 객체 지향 설계와 다형성 원칙을 적용하고자 하는 개발자

핵심 요약

  • Null 값 대신 빈 컬렉션 사용으로 null 체크 제거
  • OptionalList
  • 다형성 및 예측 가능한 동작 구현
  • this.coupons.isEmpty() 대신 this.coupon.isPresent()
  • 코드 복잡도 감소 및 안정성 향상
  • NullPointerException 예외 제거, 조건문 단순화

섹션별 세부 요약

1. 문제점 도출

  • Null 값 사용의 단점
  • if (this.coupon != null)과 같은 null 체크로 복잡도 증가
  • NullPointerException 발생 가능성
  • Optional 객체의 한계
  • Optional은 모든 프로그래밍 언어에서 지원하지 않음
  • Optional.isPresent() 메서드 사용으로 추가 복잡성

2. 리팩토링 적용

  • Nullable 객체 → 컬렉션 대체
  • private Coupon coupon = null;private List coupons = new ArrayList<>();
  • 메서드 수정
  • redeemCoupon(Coupon coupon)coupons.add(coupon)
  • total() 메서드에서 null 체크 제거, for (Coupon coupon : this.coupons) 사용
  • 변경된 메서드 로직
  • hasUnsavedChanges()!items.isEmpty() || !coupons.isEmpty()
  • hasCoupon()!coupons.isEmpty()

3. 리팩토링 효과

  • null 체크 제거로 조건문 단순화
  • if (this.coupon != null)for (Coupon coupon : this.coupons)
  • 다형성 기반의 일관된 동작
  • 빈 컬렉션과 비어 있지 않은 컬렉션 모두 동일한 메서드에 반응
  • 코드 안정성 향상
  • NullPointerException 예외 제거, 모든 컬렉션은 최소 빈 상태로 존재

결론

  • null 대신 빈 컬렉션 사용은 코드의 예측성과 안정성을 극대화
  • 리팩토링 전략: nullable 객체를 컬렉션으로 대체하고, 모든 메서드를 컬렉션 기반으로 재구성
  • 이유: '불가능한 상태'를 도메인 모델에서 제거하여 유지보수성 향상