Как реализовать передачу нового состояния первым аргументом в callback при вызове методов addCard и removeCard?
Что проверяют
Обычно это кусок лайв-кодинга: есть объект с методами addCard и removeCard, и после каждого изменения он должен вызвать переданный callback, отдав ему новое состояние первым аргументом. Проверяют, умеете ли вы спроектировать такой контракт без побочных эффектов. Следом просят добавить второй аргумент с предыдущим состоянием или отписку.
Как отвечать
Сначала уточните условия: callback передаётся в конструктор или через subscribe, что считается состоянием (массив карт или объект целиком), нужно ли вызывать callback, если ничего не изменилось.
Дальше каркас:
- иммутабельное обновление:
addCardстроит новый массив[...this.cards, card],removeCardфильтрует поid. Старый массив не трогается, поэтому его можно передать вторым аргументом какprevState; - порядок действий: сначала записать новое состояние в объект, потом вызвать
callback(nextState, prevState). Если callback прочитаетgetState(), он увидит то же, что получил в аргументе; - пропуск холостых изменений: если
removeCardне нашёл карту, состояние не меняется и callback не вызывается; - защита внутреннего состояния: либо
Object.freezeв режиме разработки, либо явная договорённость, что полученное состояние только для чтения.
Полезно показать, что вы видели такой контракт в библиотеках. В Zustand слушатель subscribe получает (state, prevState). В Redux слушатель вызывается без аргументов, и состояние берут через getState(). В React похожий приём это функциональное обновление setCards(prev => [...prev, card]), но там функция вычисляет состояние, а не получает уведомление.
Где спотыкаются
Вызывают callback до присвоения, и подписчик получает старое состояние или видит расхождение между аргументом и getState().
Мутируют массив через push и splice и передают его же. Тогда prevState и nextState оказываются одним объектом, сравнение изменений ломается, а подписчик, сохранивший ссылку, видит данные, которые меняются у него на глазах.
Удаляют по индексу или по ссылке на объект. После любой перестановки удаляется не та карта, а по ссылке не найдётся копия, пришедшая с сервера. Нужен стабильный id.