Pattern pour des contraintes entre Objet
Tchô,
Je cherche un pattern pour écrire de manière générique des contraintes sur des objets seuls ou sur des couples d'objets.
Par exemple j'ai les classes suivantes
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Patient
{
int age;
double poids;
double taille;
String nom;
}
Medicament
{
String nom;
int limiteAge;
double limiteParPoids;
} |
Et je voudrais pouvoir définir différents types de contraintes génériques sur ces objets. Par exemple je voudrais pouvoir définir une contrainte sur l'age ou la taille du patient. Je voudrais aussi pouvoir lier deux champs entre deux objets comme le champ age du patient et le champ limiteAge de Médicament pour pouvoir vérifier automatiquement une sorte de "compatibilité" entre les deux instances. Bien sûr je veux pouvoir le faire en ayant juste à choisir le type de contrainte à définir "contrainte a seuil" ou "contrainte de compatibilité" et préciser au constructeur correspondant les instances à comparer et les champs à comparer. Ainsi je voudrais définir une contrainte de type SupZeroContrainte sur un objet quelquonque dans ce cas Patient qui permet de verifier qu'un champ quelquonque est superieur à 0. Je veux écrire quelque chose de générique qui NE ressemble donc PAS à ce qui suit :
Code:
1 2 3 4 5 6 7 8
|
class SupZeroContrainte
{
static boolean verifier(Object obj, String nomDuChamp)
{
return ((Patient)(obj)).age > 0;
}
} |
Je veux pouvoir verifier n'importe quel champ de n'importe quelle classe. Et j'aimerais pouvoir vérifier des compatibilités entre champs de différentes classes. Par exemple, vérifier que l'age du Patient est bien inférieur à l'age min du Médicament (avec une sorte de contrainte du genre CompatibilitéContrainte)
Code:
1 2 3 4 5 6 7 8
|
class CompatibilitéContrainte
{
static boolean verifier(Object obj1, Obj2, String champ1, String champ2)
{
return ((Patient)(obj1)).age > ((Medicament)(obj2)).limiteAge;
}
} |
Je me doute que je pourrais utiliser la reflexivité Java pour cela, ou les Beans (ce qui revient au même sans doute dans ce cas), mais je me demandais s'il n'y avait pas moyen de résoudre ce pb avec un pattern connu (visitor ? mais je vois pas comment puisqu'il faut passer plus que le visitor à chaque classe dans le cas des contraintes binaires).
Code:
1 2 3 4 5 6 7 8 9 10 11
| class Patient
{
int age;
double poids;
double taille;
String nom;
boolean accept(Visitor v)
{
V.verifierAgeSupZeroContrainteOnPatient(this);
}
} |
Toutes vos suggestions seront donc les bienvenues :)