Во-первых, если вы в конечном итоге используете либо один фрагмент изменяемого состояния, либо несколько независимых фрагментов (независимо от того, что «нет смысла спрашивать, совместимо ли одно с другим»), почему бы не использовать Atoms, а не Refs?Это довольно значительное сокращение накладных расходов, которое может иметь значение, если вы делаете много обновлений.
Во-вторых, сохранение имени файла, позиции прокрутки и т. Д. В отдельных ссылках (но не в атомах) - это хорошо, пока вы разрабатываетеваши транзакции тщательно (то есть все соответствующие ссылки должны быть упомянуты, некоторые, возможно, должны быть ensure
d и т. д. - в основном транзакция должна обязательно провалиться, если возникнет несогласованное состояние).Тщательный дизайн таких транзакций может быть пустой тратой усилий, если вы управляете состоянием графического интерфейса, большинство из которых почти никогда не изменяются (кроме позиции прокрутки и содержимого буфера, что на самом деле может часто меняться? - я имею в виду, что это стоит серьезно рассмотреть,В качестве ответа следует определить окончательный дизайн).Существует множество сценариев, в которых наличие нескольких объектов ссылочного типа предпочтительнее, чем одного, я просто не уверен, что одним из них является управление базовым состоянием графического интерфейса.: -)
Обратите внимание, что выполнение обновлений для вложенных структур, содержащихся в объектах ссылочного типа, очень чисто в Clojure, например (с использованием атома):
;; assuming that state-o-matic is an Atom which holds a map,
;; which holds the key of :foo, with which a vector is associated,
;; whose first item is another vector, whose first item is a map
;; which holds the key of :bar associated to a number,
;; the following increments said number
(swap! state-o-matic update-in [:foo 0 1 :bar] inc)
См. Также get-in
& assoc-in
.