Une entité est un granule du modèle structurel du domaine, en complémentarité avec les processus (classe Process), qui en sont le modèle fonctionnel, et les événements (classe Event), qui en sont le modèle dynamique.
Dans un simulateur écrit avec DIESE, une entité est décrite par ses caractéristiques propres (sous la forme de variables ou de fonctions) et par ses relations structurales avec d'autres entités.
Relations structurales entre entités
Les caractères structuraux sont les relations qui lient l'entité à ses parties. Dans DIESE, ces relations sont ramenées à seulement deux : la relation de composition et la relation ensembliste. Une entité est constituée d'un certain nombre de composants de types différents ou, exclusivement, contient un certain nombre d'éléments tous du même type. Réciproquement, une entité possède une, et une seule, super-entité (c'est-à-dire une entité dont elle est un composant), et appartient à un certain nombre de sur-ensembles (c'est-à-dire d'entités dont elle est élément, et qui peuvent être de différents types).
Pour mieux définir les notions de composant et d'élément, on peut ajouter que :
- Enlever ou ajouter un élément à un ensemble ne dénature pas cet ensemble. Un même entité (instance) peut appartenir à plusieurs ensembles, qui peuvent être de différents types. Un ensemble peut être vide, puis recevoir et se voir retirer des éléments, sans inhiberer ses fonctions.
- Enlever ou ajouter un composant à une entité dénature l'entité (le tout). Une entité ne peut pas être composant de plus d'une autre entité. Une entité peut être construite en assemblant ses composants les uns après les autres. Le retrait d'un composant détruit l'entité et inhibe tout ou partie de ses fonctions.
Caractéristiques propres des entités
Les descripteurs (proprement dit) d'une entité correspondent aux notions classiques de variables d'état et de propriétés à valeur constante. Dans DIESE, les descripteurs sont eux-aussi des objets. Ce sont des instances de sous-classes de Descriptor. Ces objets possèdent en particulier un attribut qui représente la valeur de la variable d'état ou de la constante. Toute entité, dans DIESE, possède un descripteur prédéfini dont la valeur est un tableau d'instances de Descriptor. On ajoute donc un élément à ce tableau pour chaque variable d'état et propriété à valeur constante de l'entité.
Il est d'autre part possible de doter une sous-classe d'entités par un ensemble de caractéristiques fonctionnelles, c'est-à-dire de connaissances procédurales sur l'entité. Dans la terminologie de la conception orientée objet, une telle caractéristique est généralement appelée 'méthode'.
Cette adjonction de méthodes à une entité dans le domaine d'application n'est pas inéluctable. En effet, et d'une part, des services généraux tels que la manipulation des variables d'état sont définis et fournis dans la bibliothèque DIESE. D'autre part, certaines connaissances procédurales sur l'entité sont en fait un granule du modèle fonctionnel du système dans lequel est incluse l'entité. On les représentera donc comme des processus et on les codera dans des sous-classes de Process de DIESE (voir la page dédiée).
Attacher un descripteur fonctionnel à une entité du domaine d'application peut être réalisé de deux manières :
- en déclarant (dans le fichier d'interface de la classe) et en réalisant (dans le fichier de réalisation) une méthode au sens du C++ natif, d'accès public (mot-clé public) ou restreint à la classe (mot-clé protected). On sait que cette méthode est alors une propriété constante de toutes les instances de la classe. Autrement dit, aucune instance ne peut être caractérisée par un corps particulier de la méthode. Toujours en C++ natif, on peut surcharger différement dans des sous-classes le corps d'une méthode virtuelle de la classe-mère, mais leurs instances propres restent indifférenciées.
- en exploitant la classe Method prédéfinie dans DIESE (voir la page dédiée) : une connaissance fonctionnelle sur l'entité fait l'objet d'une sous-classe de Method, et on attache à la classe d'entités, dans son constructeur, une instance de cette sous-classe de Method. Comme toute entité, dans DIESE, possède un descripteur prédéfini dont la valeur est un tableau d'instances de Method, il suffit d'ajouter l'instance à ce tableau. Une instance de Method possède en particulier un attribut qui est le corps de la méthode (de manière analogue au fait qu'un descripteur possède un attribut qui représente sa valeur). Il est ainsi possible de distinguer deux instances de la même sous-classe d'entités par deux corps distincts de la même méthode (de manière analogue au fait que deux entités peuvent avoir deux valeurs distinctes pour le même descripteur).
En résumé : la conception générérale d'une entité
Toute entité est caractérisée par les attributs suivants :
Ce jeu d'attributs définit la classe de base BasicEntity. Certaines entités peuvent en outre posséder :
- l'indication de sa super-entité
- éventuellement inexistante (l'indication est alors le pointeur NULL)- le tableau de ses composants
- éventuellement vide, et nécessairement vide si le tableau de ses éléments ne l'est pas- le tableau de ses sur-ensembles
- éventuellement vide- le tableau de ses éléments
- éventuellement vide, et nécessairement vide si le tableau de ses composants ne l'est pas
Ce complément définit la sous-classe DescriptedEntity de BasicEntity. Enfin, certaines entités peuvent posséder :
- un tableau de descripteurs constants
- un tableau de descripteurs variables (au sens de variables d'état)
Ce complément définit la sous-classe Entity de DescriptedEntity. Les tableaux de descripteurs peuvent être vides.
- un tableau de méthodes
Remarques importantes :
- Cette structure est la même d'une classe à l'autre. L'utilisateur ne peut donc introduire des différences entre classes qu'en différenciant les contenus des tableaux (de composants, d'éléments, de descripteurs, de méthodes, etc.).
- Une relation de particularisation/généralisation entre classes sera traduite par la classique hiérarchisation des classes (avec la fonctionnalité inhérente d'héritage). Une telle relation lie, par exemple, la classe des bâtiments et la classe des maisons (voir à la page 'Gestion de la hiérarchie des classes d'entités' la bonne manière d'installer une hiérarchie de classes).
- Une relation de type antécédent/image (par exemple la relation père/fils) pourra être modélisée par un descripteur approprié, prenant ses valeurs parmi les entités. Une relation réciproque fera l'objet de deux descripteurs, chacun installé dans une des deux classes : le fils est pointé par un descripteur de la classe du père et le père est pointé par un descripteur de la classe du fils.
On décrit par ailleurs la notion de démon. Un démon est une structure permettant de spécifier des morceaux de code que DIESE doit exécuter lorsqu'on accède à la valeur d'un descripteur, lorsqu'on modifie cette valeur, ou encore lorsqu'on modifie la structure de l'entité. L'utilisateur exploite les méthodes normales d'accès et de modification, mais le résultat de ces méthodes (en terme de valeur renvoyée ou d'effets de bord) passe par le "filtre" du démon, et peut donc varier en fonction de l'état courant de l'entité ou de ses descripteurs.
Les trois classes de base d'entités
Ainsi DIESE propose-t-elle trois classes de base pour représenter une entité.
descripteurs fonctionnels pas de
descripteurs fonctionnelsvariables d'état
et/ou constantesEntity DescriptedEntity
Entitypas de variables d'état
ni constantesEntity BasicEntity
DescriptedEntity
EntitySi l'entité possède des descripteurs fonctionnels (méthodes), c'est de la classe de base Entity que devra descendre la classe de l'entité considérée.
Si l'entité ne possède pas de descripteurs fonctionnels, mais possède des descripteurs au sens de variables d'état, elle pourra descendre d'Entity, mais DescriptedEntity suffirait comme classe de base, par mesure d'économie et de clarté.
Enfin, si l'entité ne possède de descripteurs d'aucun type, elle pourra descendre de DescriptedEntity ou d'Entity, mais BasicEntity suffirait comme classe de base.Ces classes de base ne sont pas destinées à avoir des instances directes. Les entités du domaine d'application de l'utilisateur font l'objet de classes spécifiques au domaine, lesquelles doivent être créées comme des sous-classes d'une de ces trois classes de base.
Les trois liens en haut de la présente page décrivent chacun une des trois classes de base des entités.