Le terme « état » peut être utilisé dans divers sens, qui peuvent même ne pas tous être susceptibles d'une définition précise. Il était donc important que vous incluiez une définition dans votre document, pour bien expliquer comment vous utilisiez le terme. Dans ce qui suit, je n'offre pas une définition unique de l'état d'un objet, mais j'essaie plutôt d'esquisser un certain nombre de façons de penser à ce sujet, qui peuvent être appropriées dans différents contextes.
Cependant, vous devez d'abord penser à ce que vous entendez par « objet »: pensez-vous à un objet conceptuel, c'est-à-dire à une entité que vous essayez de modéliser, ou à une instance d'une classe dans un programme spécifique; peut-être voulez-vous également penser à l'état d'une variable qui pourrait à différents moments faire référence à différents objets ou à un système, peut-être comme accessible via une certaine interface utilisateur.
Une partie de la difficulté à définir l'état d'un objet dans la POO est que lorsque nous modélisons des entités dans un langage particulier, ce langage ne nous permet souvent pas de distinguer les attributs d'objet qui font conceptuellement partie de la même entité de ceux qui ne le sont pas. Par exemple, une liste liée de Car
sera constituée d'un certain nombre d' Link
objets, qui contiennent des pointeurs vers le suivant (et peut-être le précédent) Link
bien que conceptuellement la liste soit un seul objet; les liens peuvent également être intégrés dansCar
-objets ou contiennent des pointeurs vers eux, mais dans ce cas, les objets liés sont conceptuellement séparés plutôt que partie de la liste; dans une liste de modifications récentes, cependant, les modifications ne peuvent être présentes que dans la liste et considérées comme faisant partie de celle-ci. Dans ces différents cas, nous devons décider si nous considérons que l'état d'un objet inclut celui des objets liés. De plus, un Car
peut avoir un lien vers un Registering_Authority
- nous ne considérons probablement pas que l'état de la voiture change lorsque son autorité d'enregistrement change l'URL de son site Web. À moins que le langage d'implémentation ne permette de distinguer différents types de liens, il ne sera pas possible de faire une définition générale de l'état d'un objet en termes de langage seul.
Le « externe » ou « fonctionnel » état peut être défini comme « comment elle se comporte », ee.g. comment il réagit aux invocations de méthodes ou à une interface utilisateur. Pour un objet en tant qu'instance de classe, cette définition dépend du type auquel l'objet est considéré comme appartenant: vu comme un Circle
, la couleur d'unColoured_Circle
n'est pas visible, et donc sans rapport avec son état. Une difficulté avec cela est que «comment il réagit» peut devoir être défini en termes de valeurs renvoyées, et ces «valeurs» peuvent être les états d'autres objets. Une façon de formaliser cela est de dire que deux états d'un objet sont identiques si toutes les exécutions futures possibles d'un système dans lequel il est intégré entraînent le même mappage des entrées vers ce système aux sorties de celui-ci. Ce système d'enceinte peut être requis pour être un système autonome, capable d'être exécuté indépendamment de son environnement; d'autre part, on pourrait lui permettre d'être aussi petit que l'objet en question lui-même. Dans tous les cas, une approche mathématique consiste alors à définir un état comme une classe d'équivalence de
Le « interne » état peut être défini comme l'état de la représentation. Une première tentative est apparemment circulaire mais peut-être utile: «L'état interne d'un objet est l'état de ses membres». Ici, nous devons prendre soin de distinguer les aspects significatifs de la représentation des aspects insignifiants: au niveau le plus bas, la représentation d'un objet peut bien inclure des adresses d'autres objets, mais il est peu probable qu'il soit utile d'envisager un changement dans une telle adresse comme un changement d'état. D'un autre côté, un changement dans l'état d'un cache pour le résultat d'une requête, alors qu'il ne fait aucune différence pour l'état fonctionnel (comme décrit ci-dessus), sera important lors de l'examen des tests de performances.