Rust · Type State

타입으로 상태 전환 고정하기

`DraftPost`, `PendingReviewPost`, `Post`를 별도 타입으로 나누면 잘못된 상태의 메서드 호출이 컴파일 단계에서 막힙니다.

초안

DraftPost

`add_text`는 있지만 `content`는 없습니다. 공개 본문 읽기를 타입이 허용하지 않습니다.

검토 대기

PendingReviewPost

`request_review(self)`가 초안 값을 소비하고 검토 대기 값을 반환합니다.

게시

Post

`approve(self)` 뒤에야 `content` 메서드가 있는 공개 게시물 타입을 얻습니다.

`let post = post.request_review();`

섀도잉으로 변수 이름은 유지하지만 실제 타입은 다음 단계로 바뀝니다.

`let post = post.approve();`

이전 상태의 값은 소비되므로 같은 값을 잘못 재사용하기 어렵습니다.

초안 본문 노출

메서드가 없어 컴파일되지 않습니다.

승인 전 게시

`Post` 타입을 얻을 경로가 없습니다.

상태 확인 코드

런타임 `match`가 줄어듭니다.

API 설명력

타입 이름이 가능한 단계가 됩니다.