У вас есть состояние, когда вы связываете значения (числа, строки, сложные структуры данных) с идентификатором и моментом времени.
Например, число 10 само по себе не представляет никакого состояния: это просто четко определенное число, которое всегда будет само собой: натуральное число 10. В качестве другого примера, строка «HELLO» представляет собой последовательность из пяти символов, и это полностью описано символами, которые это содержит и последовательность, в которой они появляются. Через пять миллионов лет строка «HELLO» по-прежнему будет строкой «HELLO»: чистое значение.
Чтобы иметь состояние, вы должны рассмотреть мир, в котором эти чистые ценности связаны с какими-то сущностями, которые обладают идентичностью . Идентичность - это примитивная идея: это означает, что вы можете различать две вещи независимо от любых других свойств, которые они могут иметь. Например, две машины одной модели, одного цвета, ... это две разные машины.
Учитывая эти вещи с идентичностью, вы можете прикрепить к ним свойства, описанные чистыми значениями. Например, моя машина имеет свойство быть синим. Вы можете описать этот факт, связав пару
("colour", "blue")
к моей машине. Пара («цвет», «синий») - это чистая величина, описывающая состояние этого конкретного автомобиля.
Состояние связано не только с конкретным объектом, но и с конкретным моментом времени. Итак, можно сказать, что сегодня моя машина имеет состояние
("colour", "blue")
Завтра я буду перекрашивать его в черный цвет, и новое состояние будет
("colour", "black")
Обратите внимание, что состояние объекта может изменяться, но его идентичность не изменяется по определению. Ну, конечно, пока сущность существует: автомобиль может быть создан и уничтожен, но он сохранит свою идентичность на протяжении всей жизни. Нет смысла говорить об идентичности чего-то, чего еще не существует / больше нет.
Если значения свойств, прикрепленных к данной сущности, со временем меняются, вы говорите, что состояние этой сущности изменчиво . В противном случае вы говорите, что государство является неизменным .
Наиболее распространенной реализацией является сохранение состояния сущности в некотором виде переменных (глобальные переменные, переменные-члены объекта), то есть для хранения текущего снимка состояния. Изменяемое состояние затем реализуется с помощью присваивания: каждая операция присваивания заменяет предыдущий снимок новым. Это решение обычно использует ячейки памяти для хранения текущего снимка. Перезапись области памяти - это разрушительная операция, которая заменяет снимок новым. ( Здесь вы можете найти интересную беседу об этом подходе, ориентированном на место .)
Альтернативой является просмотр последующих состояний (истории) объекта в виде потока (возможно, бесконечной последовательности) значений, см., Например, главу 3 SICP . В этом случае каждый снимок хранится в другом месте памяти, и программа может одновременно просматривать разные снимки. Неиспользуемые снимки можно собирать, если они больше не нужны.
Преимущества / недостатки двух подходов
- Подход 1 потребляет меньше памяти и позволяет создавать новый снимок более эффективно, поскольку он не требует копирования.
- Подход 1 неявно передает новое состояние всем частям программы, содержащим ссылку на него, при подходе 2 потребуется некоторый механизм для передачи моментального снимка своим наблюдателям, например, в форме события.
- Подход 2 может помочь предотвратить несогласованные ошибки состояния (например, частичные обновления состояния): определив явную функцию, которая создает новое состояние из старого, легче различить моментальные снимки, созданные в разные моменты времени.
- Подход 2 является более модульным в том смысле, что он позволяет легко создавать представления о состоянии, которые не зависят от самого состояния, например, с использованием функций более высокого порядка, таких как
map
и filter
.