• Aucun résultat trouvé

Le modèle SHOOD a été défini de façon à gérer des connaissances dynamiques et évolutives. Il offre la possibilité d'ajouter, de détruire ou de modifier à tout moment les définitions des classes, à savoir leur nom, leurs descripteurs d'attributs et les relations qu'elles entretiennent entre elles (cf. chapitre 4). Pour cela, le modèle suit l'approche "tout objet" comme ObjVlisp [Cointe87] ; un objet peut être une connaissance élémentaire ("Dupond"), une connaissance générique ("toute personne a une tête"), une méthode ( "la différence entre deux entiers" ), une inférence ("l'âge d'une personne est calculé par la différence entre l'année courante et l'année de sa naissance").

Le modèle est réflexif : il possède la propriété de se décrire lui-même [Escamilla93]. Tous les concepts tels que les classes, les attributs, les méthodes peuvent être décrits à partir d'eux-mêmes. De même, le modèle est méta-circulaire : il s’implante avec ses propres concepts. Dans cette optique, un niveau méta a été introduit afin de spécifier le comportement des différents objets (Ecran 3-5). Au niveau du modèle, aucune différence n'est faite entre la classe Méta et un autre objet ; c'est dans notre esprit que nous faisons la différence afin de mieux comprendre le fonctionnement du système.

Les informations absolument nécessaires pour la génération automatique du système concernent la définition d'une classe au niveau système comme les attributs Nom_classe,

Super, Sous, Attributs, Instance_de et Instances. Pour définir et typer les attributs précédents,

il faut des informations comme Nom_attribut, Domaine et constructeur.

Pour élaborer le graphe de spécialisation, ce sont les attributs Super et Sous qui sont utilisés. Les attributs Instance_de et Instances permettent d'intégrer les classes dans le graphe

Ce minimum de connaissances doit exister pour que le modèle "fonctionne tout seul". Il existe un graphe d'héritage et un graphe d'instanciation minimums nécessaires pour décrire tous les autres concepts (Ecran 3-2).

Ecran 3-2 : Le graphe d'héritage minimum

Le graphe représente non seulement le graphe d'héritage, mais aussi une sorte de rangement des classes par rapport à leurs fonctionnalités. Ainsi, la classe Univers est créée pour servir de racine à deux sous-graphes indépendants : Objet et Objet_virtuel.

Un concept peut être décrit de deux manières : par extension ou par intention. Par extension, on fait une énumération de tous les individus qui sont représentés par le concept. Par intention, on fait une énumération des propriétés communes à tous les individus représentant le concept.

La classe Objet est la racine du graphe de spécialisation de toute classe instanciable. Une classe instanciable est définie en intention : pour que Dupond appartienne à la classe

Personne, il doit être explicitement créé dans cette classe. La classe Objet admet des

sous-classes prédéfinies telles que Méta et Attributs qui contiennent le comportement minimum des objets à créer.

La classe Objet-virtuel est racine du graphe de spécialisation des classes non instanciables. Ces dernières concernent les classes dont l'ensemble des instances est défini en extension, comme les classes des entiers et des réels, et qui n'auront pas d'instances.

La classe Méta et ses sous-classes vont servir à créer toutes les autres classes d'objets : la classe Méta est racine du graphe d'instanciation.

Méta

Objet Univers Objet_virtuel Chaîne

instance_de

Figure 3-16 : Le graphe d'instanciation minimum

Pour bien comprendre le mécanisme d'instanciation, nous allons détailler la création d'une classe, c'est-à-dire l'opération d'instanciation d'une méta-classe.

Ecran 3-3 : Schéma de la classe Méta

Lors de la création d'une classe, une instance est créée dans la classe Méta et les attributs de

Méta sont valués (Ecran 3-3). La valuation de l'attribut Nom_classe effectue réellement la

création de la classe en lui affectant un nom unique. Les valeurs affectées aux attributs Super et Sous permettent d'intégrer la classe dans le graphe d'héritage. La valuation de l'attribut

Instance_de permet d'intégrer la classe dans le graphe d'instanciation. L'attribut Instances sera

valué au moment de la création d'une instance de la nouvelle classe. Ainsi, tout concept peut être créé par instanciation d'une classe faisant partie du graphe de spécialisation de Méta.

Parmi toutes les instances d'une classe, on cherche parfois à trouver une instance particulière. On peut pour cela utiliser l'OID, qui est l'identificateur système d'un objet (Object IDentifier). Il est unique et est affecté à l'objet lors de sa création par le système.

Mais on peut tout aussi bien retrouver l'instance par des valeurs uniques pour un ensemble d'attributs, si l'instance en possède. Cet ensemble d'attributs constitue alors une clef permettant d'identifier d'une manière unique l'instance.

Si on veut que la classe Personne ait une clef constituée, par exemple, des attributs Nom et

Prénom, il faut que cette classe soit une instance d'une méta-classe qui définisse des classes à

clefs, c'est-à-dire des classes dont les instances seront identifiées par des valeurs de clefs. Pour cela, on crée une méta-classe Méta_a_clef, sous-classe de Méta, qui admet un attribut supplémentaire Clefs défini par une liste d'attributs. Lors de la création de la classe Personne, tous les attributs hérités de Méta seront valués, et l'attribut Clefs spécifique à Méta_a_clef sera valué par Nom et Prénom.

Toute classe (ou méta-classe) est identifiée dans SHOOD par son nom qui est donc unique dans la base. L'attribut nom-classe défini dans Méta est donc un attribut clef. Pour pouvoir définir

nom_classe comme étant un attribut clef, il est nécessaire que Méta et ses sous-classes soient

instances de Méta_a_clef. Finalement, c'est Méta_a_clef qui est racine du graphe d'instanciation :

Méta_à_clef

Toute méta-classe créée Méta

instance_de super-classe

Figure 3-17 : Graphe d'instanciation

Afin de maintenir la cohérence des clefs dans le graphe des classes, il est nécessaire de maintenir les deux invariants suivants :

I.S.7 : Invariant de l'héritage des clefs

Une classe hérite de toutes les clefs de toutes ses super-classes.

I.S.8 : Invariant des restrictions des clefs

Une clef dans une classe doit être composée d'attributs ayant un type défini. Toute nouvelle clef définie dans une classe doit être minimale par rapport aux clefs héritées.

Lorsqu’une classe est instance d'une méta-classe (par exemple Meta_à_clef), elle value les attributs de sa méta-classe (par exemple les clefs). Ses sous-classes doivent hériter de ces valeurs (les clefs) d'où l'invariant suivant :

I.I.6 : Invariant des méta-classes

Une classe doit hériter de toutes les propriétés de ses super-classes. Donc toute classe doit instancier au minimum les mêmes méta-classes que ses super-classes.