Skip to content

refactor(afternote): EditableMemorialVideo 의 네 상태를 sealed 로 봉인한다 — nullable 두 칸의 if/?: 를 exhaustive when 으로 (#1597 후속) #1901

Closed

Description

@OnlyReadOneBook

작업 유형

refactor — 동작 변경 없는 구조·책임·경계 개선

주 담당 모듈

afternote — 애프터노트

개요

EditableMemorialVideo(#1561, PR #1565)는 nullable 칸 두 개(서버 기준값 persisted 와 미저장 교체분 selection)로 네 조합(빈 상태 · 서버만 · 선택만 · 교체 중)을 표현하고, 규칙은 파생값(displayed = selection ?: persisted, canRemove)과 연산 여섯 개의 if/?:/when 이 닫는다. 네 조합이 전부 합법이라 지금 "표현 불가능해야 할 상태" 는 없다. 그래서 sealed 로 바꿔도 상태 집합은 그대로 넷이고, 얻는 것은 표현의 명시성이다.

기준 리비전: 9d9b69e9c9244a274158b4ae958e98771f46a6e7 (PR #1620 head)

  • EditableMemorialVideo.kt: 값 객체 전체. 생성자·copy·componentN 이 private 이라 두 칸은 밖으로 새지 않는다.

왜 sealed 인가

치르는 비용 (#1620 안에서 하지 않고 떼어 내는 이유)

완료 조건

  • EditableMemorialVideo 가 sealed 로 네 상태를 이름으로 갖는다: Empty, ServerOnly, SelectionOnly, Replaced(이름은 착수 시 확정). 두 칸은 지금처럼 클래스 밖으로 새지 않는다.
  • 연산 넷과 파생값 둘이 else 없는 exhaustive when 이다.
  • 외부 계약은 그대로다. displayed, canRemove, toMediaInput(), withoutThumbnail() 의 결과가 같고, EditableMemorialVideoTest 의 단언이 케이스 구성 이외의 수정 없이 통과한다.
  • SavedStateHandle 왕복: 스냅샷을 JSON 으로 저장→복원했을 때 네 상태가 모두 같은 상태로 돌아온다는 테스트가 있다. wire 형태를 바꿨다면 그 사실을 EditorFormSnapshot KDoc 에 적는다.
  • :feature:afternote:presentation:testDebugUnitTest · ktlintCheck 통과.

자식 이슈

No response

참고

현재 선행 작업과 범위

사진 #1902는 PR #1971에서 처음부터 sealed 값 객체로 구현한다. 사진의 서버 기준값은 이탈 가드·기존 스냅샷 동일성 보존에 쓰이므로 유지한다. 이 이슈는 영상 값 객체 내부 표현과 호환성 검증에 집중하고, 사진이나 편집기 MVI의 외부 호출 계약을 다시 설계하지 않는다. 영상에서 세 상태로 축소할지는 영상의 표시·저장뿐 아니라 이탈 가드·SavedState 왕복까지 같은지 확인한 뒤 판단한다.

Metadata

Metadata

Labels

area:afternote애프터노트 기능 영역refactor동작 변경 없이 코드 구조·책임·경계를 개선하는 작업

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions