코틀린은 일급컬렉션이 필요 없다 ...?

First Class Collection: 일급 컬렉션 ?

넥스트 스텝, 우테코 등이 크게 입소문을 타면서 일급컬렉션의 개념이 널리 퍼졌다.

어려운 개념은 아니다, 단지 JCF를 감싼 래퍼 클래스를 하나 만드는게 일급 컬렉션이다.

그래서 다음과 같은 조건을 만족한다

일급 컬렉션은 멤버 필드로 오로지 하나의 컬렉션만 있다

예로 아래가 일급 컬렉션이다.

class Cars{
    private List<Car> cars = new ArrayList<>(); 
}

참 쉽죠?

이걸 왜쓰죠?

이유는 간단하다…

List등의 컬렉션은 add, remove 등의 미리 정해진 API가 있고 addCars, hasWinner 등의 도메인 규칙에 맞는 API를 추가할 수 없다

따라서 퍼사드로 하나 감싸서 도메인 클래스들의 행동을 정의할 수 있다

코틀린에서는 필요가 없다 …?

코틀린에서는 확장 함수란 개념이 있다

아래와 같이 복수의 Car들에 대해 API를 손쉽게 만들 수 있다

fun List<Car>.move() {

    for (car in this) {
        car.move()
    }
}

fun List<Car>.winners(): List<Car> =
    this.stream()
        .filter { it.position >= 5 }
        .sorted(compareBy { it.name })
        .toList()

fun List<Car>.hasWinner(): Boolean =
    this.winners()
        .isNotEmpty()

복수의 도메인에 멤버 필드가 또 필요하면

내 생각에는 일급 컬렉션의 경우는 커버할 수 있으나…

trialNumber 등의 멤버 필드가 필요로 하면 아예 일반 클래스(Cars)로 감싸야 할 것 같다

다만 그렇게 될 경우 일급 컬렉션이 아니게 된다




© 2020.12. by 따라쟁이

Powered by philz