본문 바로가기
C.W.K.
Stream
Lesson 04 of 05 · published

명시적 시간이 resume 를 이긴다

~12 min · observed-state, resume, precedence, deep-link

Level 0릴 입문자
0 XP0/39 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"Recall 타임스탬프랑 사용자가 고른 챕터 점프는 기억된 위치를 이겨. resume 는 딥링크를 절대 엉뚱한 순간에 떨구지 않아."

'재생이 어디서 시작해야 하나' 의 두 출처

Ashen Reel 이 파일을 열 때, 시작 위치를 정하고 싶어 하는 목소리가 둘이야. 하나는 resume. "지난번에 22:14 였어, 거기서 이어." 사랑스러운 편의지. 다른 하나는 명시적 의도. "41:00 에서 시작" 이라는 Recall 딥링크, 또는 Jump to Time, 또는 챕터 선택. 둘 다 의견이 있으면 하나가 이겨야 해. 그리고 우선순위를 틀리면 제품 전체가 조용히 깨져.

상상해봐. 아빠가 자막을 검색하고, 41:00 줄을 클릭했어. 근데 앱이 지난주에 멈춘 데라고 22:14 에서 resume 해. Ashen Reel 이 존재하는 이유 통째인 그 딥링크가, 방금 19분 어긋나게 떨어진 거야. 도우려던 resume 이 제일 중요한 그 기능 하나를 방해한 거지.

명시적 의도가 기억된 편의를 이긴다. 사용자나 호출자가 방금 요청한 값은, 시스템이 전에 기억해둔 값을 항상 이겨. 기억은 호의고, 의도는 명령이야. 부딪히면 명령이 이기고.

규칙은 세 줄짜리 우선순위고, 그 순서가 기능 전부야.

resume 은 안전하게 저장된, 버려도 되는 편의 상태야. 위치는 debounce 된 트랜잭션 쓰기로 저장돼서 크래시가 데이터베이스를 못 망가뜨려. 통째로 잃어도 그냥 짜증날 뿐 피해는 절대 아니고. resume 은 더 시끄러운 게 아무것도 요청 안 할 때 도움 주고, 뭔가 요청하는 순간엔 비켜줘서 밥값을 해.

least astonishment 가 깊은 이유야

규칙 아래엔 어디든 가져갈 만한 원칙이 있어. 시스템은 제일 덜 놀라운 걸 해야 한다는 거. 네가 명시적으로 41:00 로 가라고 했는데 다른 데 떨어지면, 아무리 선의여도 놀랍거든. resume 은 네가 구체적인 걸 안 요청했을 때만 안 놀라워. 그러니 이 우선순위는 아무렇게나 고른 게 아니야. '사용자가 방금 말한 걸 존중해' 의 직접적 결과지. 기억된 기본값이랑 새 명시적 요청이 부딪힐 때마다, 새 요청이 거의 항상 사용자를 안 놀라게 지키는 쪽이고.

Code

시작 위치는 순수한 우선순위 문제. 명시적, 그다음 resume, 그다음 0·swift
struct OpenPlan {
    let file: URL
    let explicitTime: Double?   // from a Recall deep link, Jump to Time, or chapter
}

/// Precedence IS the feature: a just-asked-for time beats a remembered one.
func startPosition(for plan: OpenPlan, resume: Double?) -> Double {
    if let t = plan.explicitTime { return t }   // deep link / jump / chapter wins
    if let r = resume            { return r }   // else pick up where we left off
    return 0                                    // else the beginning
}

// A Recall open sets explicitTime, so resume is suppressed for THAT open.
// A plain reopen leaves explicitTime nil, so resume gets to be helpful.
// The whole 'lands at the right second' guarantee is these three lines.

External links

Exercise

네 앱에서 기억된 기본값이랑 새 명시적 요청이 둘 다 같은 걸 설정할 수 있는 곳을 찾아. 저장된 필터 대 URL 쿼리 파라미터, 기억된 정렬 대 사용자 클릭, 캐시된 선택 대 딥링크 같은 거. 지금 어느 게 이기는지 따라가 봐. 기억된 값이 새 명시적 걸 덮어쓸 수 있으면, 그걸 고치는 우선순위 규칙을 적고, 사용자가 지금 동작에 놀랄 케이스를 짚어봐.
Hint
우선순위는 거의 항상 이거야. 지금-명시적 > 전에-기억됨 > 시스템-기본. 네 코드가 기억된 값을 먼저 확인하고 명시적 요청으로만 폴백하면, 순서가 거꾸로야. 새 의도를 먼저 확인하고, 기억은 침묵만 채우게 해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.