현재 진행중인 (아직도..) 자동차 경주 게임 PR을 날리고, 드디어 리뷰를 받게 되었다. (벌써 이틀 지났어..)
리뷰 도중 일급 컬렉션에 대한 언급이 나왔는데, 이게 뭔지 잘 몰라서 정리해보려고 함. (들어는 본 것 같은데...)
상황은 아래와 같다.
export class CarMover {
#raceCars
constructor(cars) {
this.#raceCars = this.#getRaceCars(cars)
}
#getRaceCars(cars) {
return cars.map((carName) => new Car(carName))
}
moveCars() {
return this.#raceCars.map((car) => {
const score = makeRandomNum()
car.move(score)
return { car: car.name, position: car.position }
})
}
get raceCars() {
return this.#raceCars
}
}
이러한 코드를 작성했는데, 리뷰어님께서 아래와 같이 답변을 해주셨다. (와 준일님이다..)
함께 링크를 주신 https://jojoldu.tistory.com/412 향로님의 블로그를 참고했는데, 잘 이해가 되지 않아 차근차근 정리를 좀 해봐야겠다. (객체 지향도 경험이 없다보니 어려운듯...)
일급 컬렉션이란??
- 도메인 모델을 설계할 때 사용되는 기법 중 하나
- 해당 클래스는 다른 멤버 변수를 가지지 않는 한 개의 컬렉션만을 멤버 변수로 가진다.
- 해당 클래스는 컬렉션에 대한 다양한 행동을 정의하거나 제어한다.
지금 이 말을 들어도 이해가 안되는 이유는 단어가 생소하기 때문인 것 같다. 그러므로 다시 정리해보자.
- 멤버 변수: 클래스, 객체가 소유하고 있는 변수를 의미한다. (그 클래스 내에서 관리하고 있는 어떤 상태값에 해당되는 것)
- 컬렉션 : 여러 데이터를 그룹화해서 관리하는 자료구조, 자바스크립트로 따지면 배열, 객체, Set, Map 이 있다.
- 도메인 모델 : 소프트웨어가 해결하려는 문제 영역을 표현하는 개념적인 모델. 그러니까, 우리 과제에서는 자동차, 자동차 경주, 우승자, 경주 기록 등이 도메인 모델이 되는 것.
그러면 이 단어를 토대로 일급 컬렉션의 정의를 내려보면...
- 하나의 컬렉션(모음)만을 멤버 변수로 가진다. 클래스 내에서 다른 멤버변수는 가지지 않는다.
- 그리고 그 클래스 안에서 단 하나의 멤버 변수인 컬렉션만을 위해 다양한 행동을 정의하고 제어한다.(메소드)
(오 이제 좀 이해가 되는듯!!)
일급 컬렉션을 왜 언급하셨을까?
내가 작성한 CarMover 라는 클래스를 보고 왜 일급 컬렉션을 언급해주셨을까?
다시보니,
- 하나의 컬렉션만을 멤버 변수로 가진다 : raceCars 라는 하나의 배열을 멤버 변수로 가지고 있다.
- 컬렉션에 대한 다양한 행동을 정의하거나 제어한다. : 해당 컬렉션으로부터 이름만을 추출하기도 하고, 이 컬렉션의 내부 상태를 바꾸는 등 제어를 하고 있다.
아하, 사실은 나도 모르는 사이에 일급 컬렉션을 만들어버린거였어!
Cars 라는 클래스명은 일급 클래스의 어떤 네이밍에 관련된 언급이신 것 같다. 아마도?
내가 위와 같이 클래스를 분리한 이유는, RaceTrack 이라는 클래스에서 1. 경주용 자동차 생성 2. 자동차 이동 3. 자동차 경주 기록 4. 우승자 선출 과 같은 다양한 일들을 하고 있었기 때문이다. 한 클래스에서는 하나의 역할만을 담당해야 하는데... 아무리 봐도 하는 일이 너무 많아보였기에 분리를 했고, 위 carMover 클래스는 2번. 자동차 이동에 관한 역할을 담당하고 있다.
일급 컬렉션은 언제, 왜 쓰는것임?
실제로 내가 일급 컬렉션을 써야징! 하고 쓴 것은 아니기 때문에, 이것을 왜 쓰는거고 언제 쓰는지 좀 알아보면 좋겠다.
향로님의 블로그에 의하면, 이렇게 일급 컬렉션 (컬렉션인 멤버변수를 감싸는 컬렉션 - 클래스) 를 만들면 이점이 있다고 함.
1. 비즈니스에 종속적인 자료구조
2. 컬렉션의 불변성을 보장할 수 있다.
3. 상태와 행위를 한 곳에서 관리할 수 있다.
4. 이름이 있는 컬렉션!
하나 하나 소개해 주신다고 하니 따라가봅시다.
1. 비즈니스에 종속적인 자료구조
특정한 경우(조건)에서만 만들어질 수 있는 자료구조를 가지고 있다면, 여러 로직에 걸쳐서 매번 같은 조건으로 생성하기 위해 코드를 짜지 않아도 된다. 그러니까 위 예시 CarMover 같은 경우 - 그러니까 RaceCars 라는 일급 컬렉션이라면 이 컬렉션은, Cars 의 name 프로퍼티로만 이루어진 컬렉션인 것이다.
이러한 조건의 컬렉션이 필요한 경우에는 이를 사용하면 되니까, 매번 일일히 새롭게 만들며 코드를 중복할 필요가 없어지는 것이다. (예시에서는 매번 validation을 수행하는 경우로 들어주셨는데, 내가 이해한대로 적어봤다.)
2. 컬렉션의 불변성을 보장할 수 있다.
클래스 외부에서 클래스 값에 접근할 수 없도록 private 으로 만들었으며, 이를 조회만 가능한 getter 를 통해 이 컬렉션은 사이드 이펙트에 의해 변경될 수 없음을 보장하고 있다.
3. 상태와 행위를 한 곳에서 관리할 수 있다.
서로 관련이 있는 것들 끼리 - 어떤 상태와 그 상태에 대해서만 유효한 로직을 한 군데로 묶을 수 있다.
일급 컬렉션이 아닌 다른 외부 클래스에서 관리되는 컬렉션과 메서드라면, 그 두개의 연관성에 대해 표현을 하기가 어렵다. 그리고 이 때문에 중복된 코드의 발생 그리고 컬렉션에 반드시 필요한 메서드임에도 누락되는 실수가 발생할 수 있다.
4. 이름이 있는 컬렉션
각 컬렉션에 대한 일급 컬렉션을 만들면, 일반 변수명으로 이 두 컬렉션을 구분했을 때보다 훨씬 더 명확해진다는 장점이 있다.
---
위와 같이 간단하게 정리해봤는데, 생각보다 막 어려운 내용은 아닌 것 같다. 여러모로 장점이 있는 방식이라고 생각됨!
새로운 내용을 알게 되어 기분이 좋군. 잘 활용해봐야지!!!!
'TDD, Cleancode with JavaScript' 카테고리의 다른 글
# 5 / 객체간의 결합도 / 객체를 객체답게? (2) | 2023.08.17 |
---|---|
# 4 / 함께해요, 리팩토링 😇 + 사담 겸 푸념;; (2) | 2023.08.08 |
# 2 / 어떤 과정으로 문제를 해결해 나갈 수 있을까. (4) | 2023.07.27 |
# 1 / OT. TDD 란 무엇인가. (0) | 2023.07.19 |