En reprenant notre exemple de l’article Les bases – Création de types, de sous-types et d’instances nous allons voir comment ajouter des attributs et des propriétés sur notre type Vehicle.
Introduction
Generic System permet de poser des attributs et des propriétés sur un type :
- un attribut peut avoir plusieurs valeurs ;
- une propriété ne peut avoir qu’une seule valeur.
Attribut
Dans Generic System, la valeur d’un attribut est représentée par un holder : c’est un nœud qui encapsule la valeur de l’attribut.
Reprenons notre exemple, et ajoutons l’attribut
Options au type
Vehicle :
1 2 3 4 5 6 |
// Get the type Vehicle and its instance myVehicle from the Engine Generic vehicle = engine.getInstance("Vehicle"); Generic myVehicle = vehicle.getInstance("myVehicle"); // Add an attribute on our vehicle Generic options = vehicle.addAttribute("Options"); |
Les premières lignes de code permettent de récupérer une information dans le moteur de Generic System, à savoir le type Vehicle et son instance myVehicle. Nous verrons dans un prochain article comment rechercher une information dans Generic System.
Vous pouvez constater que la création d’un attribut n’est pas plus compliquée que celle d’un type. Cette fois, c’est la méthode
addAttribute du type
Vehicle qui est appelée.
Ajoutons maintenant quelques options à notre véhicule :
1 2 3 4 5 6 7 |
// Now that our vehicle has options, let's customize it Generic abs = myVehicle.addHolder(options, "ABS"); Generic musicPlayer = myVehicle.addHolder(options, "MusicPlayer"); Generic gps = myVehicle.addHolder(options, "GPS"); // Persist the changes engine.getCurrentCache().flush(); |
Comme nous l’avons vu plus haut, la valeur d’un attribut est représentée par un holder. On fait donc appel à la méthode addHolder de myVehicle pour ajouter de nouvelles options.
Représentation schématique
Voici comment pourrait être représentée de façon schématique un type Vehicle et son instance myVehicle, associé à un attribut Options comportant deux holders music et ABS :
Propriété
Une propriété est un cas particulier d’attribut, puisqu’elle ne peut avoir qu’une seule valeur. Dans notre exemple,
Options est un attribut pour lequel il est logique de posséder plusieurs valeurs : ABS, ESP, autoradio, GPS, etc.
Un exemple d’attribut qui ne pourrait avoir qu’une seule valeur serait la puissance de la voiture : elle est (normalement) unique.
Reprenons notre exemple, et ajoutons une propriété Power à notre type Vehicle :
1 2 3 4 5 6 7 8 |
// Get the type Vehicle and its instances myVehicle and yourVehicle from the Engine Generic vehicle = engine.getInstance("Vehicle"); Generic myVehicle = vehicle.getInstance("myVehicle"); Generic yourVehicle = vehicle.getInstance("yourVehicle"); // We add the property Power to our type Vehicle Generic power = vehicle.addAttribute("Power"); power.enablePropertyConstraint(); |
Comme pour créer un attribut, on crée une propriété grâce à la méthode addAttribute du type Vehicle. Par contre, il faut indiquer au moteur de Generic System que notre nouvel attribut est une propriété. On utilise pour cela la méthode enablePropertyConstraint() de notre attribut, qui permet d’indiquer que l’attribut Power ne peut avoir qu’un seul holder.
Nous parlerons plus en détails des contraintes dans l’article Avancé – Les contraintes dans Generic System.
Pour terminer notre exemple, indiquons la puissance de nos deux instances de Vehicle :
1 2 3 4 5 6 |
// Now we can add the power of our vehicles myVehicle.addHolder(power, 114); yourVehicle.addHolder(power, 116); // Persist the changes engine.getCurrentCache().flush(); |
Si vous essayez d’ajouter un autre holder à myVehicle ou yourVehicle, votre modification sera refusée et Generic System lèvera une exception PropertyConstraintViolationException.
Représentation d’une propriété et d’un holder par instance :
Représentation schématique
Voici comment pourrait être représentée de façon schématique un type Vehicle comportant deux instances, associé à une propriété Power :
En résumé
Generic System permet de créer des attributs et des propriétés. Les instances des attributs et des propriétés sont représentées par un holder.
- un attribut peut prendre plusieurs valeurs ;
- une propriété ne peut avoir qu’une seule valeur.
Pour déclarer un attribut ou une propriété sur un type, il faut faire appel à la méthode addAttribute de ce type. Pour déclarer une propriété, il faut ajouter une contrainte d’unicité PropertyConstraint sur l’attribut grâce à la méthode enablePropertyConstraint().
Enfin, l’ajout de valeurs se fait grâce à la méthode addHolder. Un holder est un nœud qui représente la valeur d’un attribut ou d’une propriété ; il peut être assimilé à une instance.