Возможно, сейчас самое время принять чисто функциональные ленивые структуры данных.
В двух словах, это требует запрета любых операций с мутациями на ваших объектах, то есть делает все ваши экземпляры объектов неизменными . Затем вы перепроектируете все операции, которые изменяют существующий объект, чтобы создать новый экземпляр объекта на основе на старом.
Например, пусть у вас есть экземпляр Order
, который содержит список OrderItem
с, и вам нужно добавить определенный OrderItem
в этот список. В этом случае вы создаете новый экземпляр Order
на , заменяя его список элементов новым списком, который, в свою очередь, создается cons ' добавление нового OrderItem
в старый список.
Позвольте мне проиллюстрировать этот пример далее в картинках. Представьте себе хранилище объектов (пусть это будет ОЗУ или реляционная база данных, что угодно):
Address | Object | Created by
--------+--------------------+------------------------------------------
1000 | list of OrderItems | empty list constructor
1001 | Order | Order constructor, uses address 1000
...
1300 | OrderItem | ...
1501 | list of OrderItems | cons of addr 1300 to addr 1000
1502 | Order | replace order_items in addr 1001 by addr 1501
Сама структура хранения данных таким образом постоянна (Крис Окасаки подробно описывает это в своей диссертации , например). Вы можете восстановить любую версию объекта, просто следуя его истории создания; управление версиями становится тривиальным. Просто запомните главное: не изменяйте данные, вместо этого создавайте новые экземпляры.