Зачем нужен флаг isUpdated в модели чата и кто его выставляет
Что проверяют
Умеете ли вы уточнить смысл поля и понимаете ли, кто в чате источник истины. Флаг isUpdated встречается в двух разных ролях, и интервьюер смотрит, различаете ли вы их. Следом обычно спрашивают про офлайн-правки и правки с другого устройства.
Как отвечать
Сначала уточните, о каком смысле речь, затем разберите оба:
- «сообщение отредактировано»: доменный признак, по нему UI рисует пометку «изменено». Выставляет его сервер, потому что правка может прийти с другого устройства или от собеседника. Клиент узнаёт о ней из события по WebSocket, из пуша или при синхронизации и пишет в Room. Лучше хранить не голый boolean, а
editedAtили номер версии: по ним видно, какая правка новее; - «локальные изменения не отправлены»: технический флаг синхронизации (dirty flag). Выставляет его клиент: репозиторий в одной транзакции Room меняет текст и ставит флаг. Сбрасывает его воркер синхронизации на WorkManager после успешного ответа сервера. Удобнее не boolean, а статус
PENDING,SENT,FAILED: интерфейс покажет часики или ошибку с повтором.
Смешивать эти роли в одном поле нельзя: у них разные владельцы и разный жизненный цикл.
Скажите и о том, для чего флаг не нужен: для перерисовки списка. DiffUtil.ItemCallback.areContentsTheSame в ListAdapter или ключи в LazyColumn сами находят изменившиеся элементы, когда Room через Flow отдаёт новый список. Флаг, который после показа кто-то должен сбросить, рано или поздно залипает.
Где спотыкаются
Отвечают без уточнения и смешивают роли: клиент ставит флаг при локальной правке, а сервер потом перетирает его своим значением.
Выставляют признак «отредактировано» только на клиенте. На других устройствах пометка не появится.
Не думают о гонке при синхронизации. Воркер отправил правку и сбросил флаг, а пользователь за это время изменил сообщение ещё раз, и вторая правка теряется. Сбрасывать флаг можно, только если версия не менялась с момента отправки.