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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 class SupZeroContrainte { static boolean verifier(Object obj, String nomDuChamp) { return ((Patient)(obj)).age > 0; } }
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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![]()
Partager