자바/일반
[객체지향 생활체조] __규칙 8: 일급 콜렉션을 쓴다.__
OverTheHorizon3410
2024. 2. 24. 22:31
일급 컬렉션이란?
- 컬렉션을 포함한 클래스가 다른 멤버 변수 없이 단 하나의 컬렉션만 멤버 변수로 가지는 것
즉,
- 컬렉션 (Collection) 을 포장하여 그 자체를 하나의 클래스로 만드는 것을 말한다.
- 비즈니스 로직상에서 사용되는
- 데이터에 대한 유효성 검사
- 비즈니스 규칙 적용 등
내부에서
캡슐화하여
관리할 수 있게됨.
일급 컬렉션 예시
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