[객체지향 생활체조] __규칙 8: 일급 콜렉션을 쓴다.__

일급 컬렉션이란?

  • 컬렉션을 포함한 클래스가 다른 멤버 변수 없이 단 하나의 컬렉션만 멤버 변수로 가지는 것

즉,

  • 컬렉션 (Collection) 을 포장하여 그 자체를 하나의 클래스로 만드는 것을 말한다.
  • 비즈니스 로직상에서 사용되는
    1. 데이터에 대한 유효성 검사
    1. 비즈니스 규칙 적용 등

    내부에서 캡슐화하여 관리할 수 있게됨.

일급 컬렉션 예시

public class LottoNumbers {
    private final Set<Integer> numbers;

    public LottoNumbers(Set<Integer> numbers) {
        if (numbers == null || numbers.size() != 6 || !numbers.stream().allMatch(num -> 1<=num && num <= 45)) {
            throw new IllegalArgumentException("유효하지 않은 로또 번호입니다.");
        }
        this.numbers = Collections.unmodifiableSet(new HashSet<>(numbers));
    }

    // 로또 번호에 대한 추가적인 비즈니스 로직
}
  • 클래스안에 하나의 컬렉션을 정의

    생성자에서 해당 컬렉션에 대한 검증

    생성시 불변을 보장이 가능하다.

상태와 행위를 한 곳에서 관리가능

public class PayGroups {
    private List<Pay> pays;

    public PayGroups(List<Pay> pays) {
        this.pays = pays;
    }

    public Long getNaverPaySum() {
        return pays.stream()
                .filter(pay -> PayType.isNaverPay(pay.getPayType()))
                .mapToLong(Pay::getAmount)
                .sum();
    }
}
  • 에서 원래같으면 서비스 로직에서 해당 스트림을 수행했겠지만,
    • 일급 컬렉션의 경우,
      • 상태(결제수단목록)
      • 행위(금액합산로직)

      을 동시에 관리가 가능해진다.

      • 코드의 응집도가 높아진다고 함.
public class PayGroups {
    private List<Pay> pays;

    public PayGroups(List<Pay> pays) {
        this.pays = pays;
    }

    public Long getNaverPaySum() {
        return getFilteredPays(pay -> PayType.isNaverPay(pay.getPayType()));
    }

    public Long getKakaoPaySum() {
        return getFilteredPays(pay -> PayType.isKakaoPay(pay.getPayType()));
    }

    private Long getFilteredPays(Predicate<Pay> predicate) {
        return pays.stream()
                .filter(predicate)
                .mapToLong(Pay::getAmount)
                .sum();
    }
}
  • 다른 결제 수단에 대한 합산 로직도 같은 방식으로 추가가 가능함.
  • 필요한 경우 람다식으로 사용해 리팩토링이 가능

내 프로젝트상의 일급컬렉션 적용처?

  • 솔직히 일급컬렉션의 의미에 부합한지는 모르겠다.
  • 회원 목록
  • 엔티티내의
    • 상품 목록

      등에 별도 일급컬렉션을 적용할 수 있을 것 같기도?

      근데 무슨 말인지는 알겠는데 언제 어떻게 써야할지에 대해도 고민을 좀 해봐야할 것같다.


Uploaded by N2T