원시 값 포장이란 원시 타입으로 선언된 변수를 의미 있는 객체로 포장하여 선언하는 방법을 말한다.
class User {
private name: string;
private age: number;
//...
}
위와 같이 원시 타입으로 선언된 변수 name, age 를
class User {
private name: Name;
private age: Age;
constructor(name: Name, age: Age) {
this.name = name;
this.age = age;
}
}
class Name {
private name: string;
constructor(name: string) {
if(name.length < 2) {
throw new Error('이름은 두 글자 이상');
}
}
}
public class Age {
private age: number;
constructor(age: number) {
if (age < 0) {
throw new Error('나이는 0살 이상');
}
}
}
객체로 포장하여 선언했다.
이렇게 하면 User 클래스는 사용자 그 자체 상태만 관리하고 이름, 나이 등 상태값은 Name, Age 클래스에서 스스로 관리할 수 있다.
원시값을 객체로 포장하면 자신의 상태를 객체 스스로 관리할 수 있어 책임이 명확해진다. 또한 코드의 유지보수에 도움이 된다.
일급 컬렉션이란 Collection을 Wrapping하면서, Wrapping한 Collection 외 다른 멤버 변수가 없는 상태를 말한다.
interface Order {
item: string;
price: number;
}
class Orders {
constructor(private orders: Order[]) {
if (!orders.length) {
throw Error('주문은 비어있을 수 없습니다.');
}
}
get total() {
return this.orders
.map((order) => order.price)
.reduce((previous, current) => previous + current);
}
add(item: string, price: number) {
this.orders.push({ item, price });
}
printTotal() {
console.log(`총 금액: ₩${this.total}`);
}
}
const orders = new Orders([
{ item: '치킨', price: 18000 },
{ item: '콜라', price: 2000 },
{ item: '치킨무', price: 1000 },
]);
orders.add('피자', 15000);
orders.printTotal();
이렇게 일급 컬렉션을 사용하면 '주문 목록'이라는 비즈니스에 종속적인 자료구조를 만들 수 있다. 또한 주문 목록에 관련한 상태와 행위를 한 곳에서 관리할 수 있다.
Reference
https://tecoble.techcourse.co.kr/post/2020-05-29-wrap-primitive-type/
https://woonjangahn.gitbook.io/logs/typescript/oop/4