"관찰되는 속성을 구현해: duration, time, pause, tracks, chapters, cache, errors."
그림자 상태의 유혹
엔진을 감쌀 때 뻔한 수는 네 변수를 두는 거야: var isPlaying, var currentTime, var duration. 명령 보낼 때 뒤집고, UI 가 거기 바인딩하고, 끝. 되긴 해 — 엔진이랑 네 그림자가 안 맞기 전까진. 사용자가 엔진이 직접 처리한 미디어 키로 정지하고; 파일이 혼자 끝나고; seek 이 네가 가정한 것보다 짧은 duration 으로 clamp 돼. 이제 네 변수는 한 가지를 말하고 영상은 다른 걸 하고, 거짓말하는 UI 보다 미치게 하는 버그는 없어.
대신 엔진을 구독해
libmpv 는 더 나은 계약을 제공해: 관찰되는 속성. 네가 신경 쓰는 값을 알려줘 — time-pos, pause, duration, 트랙 목록, 챕터, cache, 에러 — 그럼 엔진의 값이 실제로 바뀔 때마다 변경 이벤트를 밀어줘. 네 UI 는 네가 뒤집는 변수 뭉치이길 멈추고 엔진이 보고하는 것의 거울이 돼.
구독은 작고, 신뢰의 방향을 뒤집어 — 네 추측을 미는 걸 멈추고 엔진의 사실을 받기 시작해:
왜 이게 어려운 모든 것으로 확장되나
패턴이 자리 잡으면, 어려운 경우들이 쉬워져. 미디어 키? 엔진이 pause 를 바꿨고, 네가 관찰했고, UI 가 업데이트됐어 — 키를 네가 라우팅할 필요도 없었어. 파일 끝? time-pos 가 멈추고 end 이벤트가 발화했어. seek 이 짧게 떨어졌어? time-pos 가 네가 요청한 데가 아니라 실제로 있는 데를 보고해. 넌 reconciliation 코드를 절대 안 짜, 애초에 맞출 두 사본이 없었으니까. 그게 그림자 대신 관찰하는 것의 조용한 초능력이야: 드리프트 버그가 그냥 살 곳이 없어.