Vous avez l'état lorsque vous associez des valeurs (nombres, chaînes, structures de données complexes) à une identité et à un point dans le temps.
Par exemple, le nombre 10 en lui-même ne représente aucun état: il s'agit simplement d'un nombre bien défini et sera toujours lui-même: le nombre naturel 10. Autre exemple, la chaîne "HELLO" est une séquence de cinq caractères, et il est complètement décrit par les caractères qu’il contient et par la séquence dans laquelle ils apparaissent. Dans cinq millions d'années, la chaîne "HELLO" sera toujours la chaîne "HELLO": une valeur pure.
Pour avoir un état, vous devez considérer un monde dans lequel ces valeurs pures sont associées à une sorte d’entité possédant une identité . L'identité est une idée primitive: cela signifie que vous pouvez distinguer deux choses indépendamment de leurs autres propriétés. Par exemple, deux voitures du même modèle, de même couleur, ... sont deux voitures différentes.
Compte tenu de ces éléments d'identité, vous pouvez leur associer des propriétés, décrites par des valeurs pures. Par exemple, ma voiture a la propriété d'être bleue. Vous pouvez décrire ce fait en associant la paire
("colour", "blue")
à ma voiture. La paire ("couleur", "bleu") est une valeur pure décrivant l' état de cette voiture.
L'état n'est pas seulement associé à une entité particulière, mais également à un moment donné. Donc, vous pouvez dire qu'aujourd'hui, ma voiture a l'état
("colour", "blue")
Demain je le ferai repeindre en noir et le nouvel état sera
("colour", "black")
Notez que l'état d'une entité peut changer, mais que son identité ne change pas par définition. Bien sûr, tant que l'entité existe, bien sûr: une voiture peut être créée et détruite, mais elle gardera son identité tout au long de sa vie. Cela n'a aucun sens de parler de l'identité de quelque chose qui n'existe pas / plus.
Si les valeurs des propriétés attachées à une entité donnée changent avec le temps, vous indiquez que l'état de cette entité est modifiable . Sinon, vous dites que l'état est immuable .
La mise en œuvre la plus courante consiste à stocker l'état d'une entité dans un certain type de variables (variables globales, variables de membre d'objet), c'est-à-dire à enregistrer l' instantané actuel d'un état. L'état mutable est ensuite mis en œuvre à l'aide d'une affectation: chaque opération d'affectation remplace le cliché précédent par un nouveau. Cette solution utilise normalement des emplacements de mémoire pour stocker l'instantané actuel. Remplacer un emplacement de mémoire est une opération destructive qui remplace un instantané par un nouveau. ( Ici , vous pouvez trouver une discussion intéressante au sujet de cette programmation orientée lieu- approche.)
Une alternative consiste à visualiser les états suivants (historique) d'une entité comme un flux (éventuellement une séquence infinie) de valeurs, voir par exemple le chapitre 3 du SICP . Dans ce cas, chaque instantané est stocké dans un emplacement de mémoire différent et le programme peut examiner différents instantanés en même temps. Les instantanés non utilisés peuvent être ramassés lorsqu'ils ne sont plus nécessaires.
Avantages / inconvénients des deux approches
- L'approche 1 consomme moins de mémoire et permet de construire un nouvel instantané plus efficacement car il ne nécessite aucune copie.
- L'approche 1 pousse implicitement le nouvel état à toutes les parties d'un programme comportant une référence, l'approche 2 nécessiterait un mécanisme permettant d'envoyer un instantané à ses observateurs, par exemple sous la forme d'un événement.
- L'approche 2 peut aider à prévenir les erreurs d'état incohérentes (par exemple, les mises à jour partielles d'état): en définissant une fonction explicite qui produit un nouvel état à partir d'un ancien, il est plus facile de distinguer les instantanés produits à différents moments.
- L’approche 2 est plus modulaire en ce sens qu’elle permet de produire facilement des vues de l’état indépendantes de l’état lui-même, par exemple à l’aide de fonctions d’ordre supérieur telles que
map
et filter
.