Ви маєте стан, коли асоціюєте значення (числа, рядки, складні структури даних) до ідентичності та моменту часу.
Наприклад, число 10 саме по собі не представляє жодного стану: це просто чітко визначене число і завжди буде собою: натуральне число 10. Як ще один приклад, рядок "HELLO" - це послідовність з п'яти символів, і вона повністю описана символами, які вона містить, і послідовністю, в якій вони з'являються. Через п’ять мільйонів років відтепер рядок "HELLO" все ще буде рядком "HELLO": чисте значення.
Для того, щоб мати державу, ви повинні розглядати світ, в якому ці чисті цінності асоціюються з деякими сутностями, що володіють ідентичністю . Ідентичність - це примітивна ідея: це означає, що ви можете розрізнити дві речі незалежно від будь-яких інших властивостей, які вони можуть мати. Наприклад, дві машини однієї моделі, одного кольору, ... це дві різні машини.
Враховуючи ці речі з ідентичністю, ви можете прикріпити до них властивості, описані чистими значеннями. Наприклад, моя машина має властивість бути блакитним. Ви можете описати цей факт, об'єднавши пару
("colour", "blue")
до моєї машини. Пара ("колір", "синій") - це чисте значення, що описує стан саме цього автомобіля.
Держава пов'язана не тільки з конкретною сутністю, але і з певним моментом часу. Отже, ви можете сказати, що сьогодні моя машина має стан
("colour", "blue")
Завтра я його перефарбую в чорний колір, і буде новий стан
("colour", "black")
Зауважте, що стан суб'єкта може змінюватися, але його особа не змінюється за визначенням. Ну, доки сутність існує, звичайно: автомобіль може бути створений і знищений, але він зберігатиме свою ідентичність протягом усього життя. Немає сенсу говорити про тотожність того, чого ще не існує / вже не існує.
Якщо значення властивостей, приєднаних до даної сутності, змінюються з часом, ви говорите, що стан цієї сутності може змінюватися . Інакше ви кажете, що стан незмінний .
Найпоширеніша реалізація - це зберігання стану сутності в якихось змінних (глобальних змінних, змінних членів об'єкта), тобто для зберігання поточного знімка стану. Потім стан змінних реалізується за допомогою призначення: кожна операція призначення замінює попередній знімок на новий. Це рішення зазвичай використовує місця пам'яті для зберігання поточного знімка. Перезапис місця на пам'ять - це руйнівна операція, яка замінює знімок новою. ( Тут ви можете знайти цікаву бесіду про цей підхід до програмування, орієнтований на місце .)
Альтернативою є перегляд подальших станів (історії) сутності як потоку (можливо, нескінченна послідовність) значень, див., Наприклад, Розділ 3 SICP . У цьому випадку кожен знімок зберігається в іншому місці пам'яті, і програма може одночасно досліджувати різні знімки. Невикористані знімки можна збирати сміття, коли вони більше не потрібні.
Переваги / недоліки двох підходів
- Підхід 1 споживає менше пам’яті і дозволяє більш ефективно сконструювати новий знімок, оскільки він не передбачає копіювання.
- Підхід 1 неявно підштовхує новий стан до всіх частин програми, на які посилається на нього, підхід 2 потребує певного механізму, щоб надіслати знімок своїм спостерігачам, наприклад, у формі події.
- Підхід 2 може допомогти запобігти непослідовні помилки стану (наприклад, часткові оновлення стану): шляхом визначення явної функції, яка створює новий стан від старого, простіше розрізнити знімки, створені в різні моменти часу.
- Підхід 2 більш модульний тим, що дозволяє легко створювати погляди на стан, незалежний від самого стану, наприклад, використовуючи функції вищого порядку, такі як
map
і filter
.