|
5.2. Fonction de validation : manipulation symbolique
Lorsque la
valeur d'un champ est modifiée dans le menu, il y a une première validation de
la nouvelle valeur qui est faite en fonction du type de donnée que peut
recevoir le champ (si ce type a été spécifié dans la définition de la
structure). A cela on peut vouloir ajouter une validation plus précise, comme
par exemple dans le cas du champ AGE où on voudrait vérifier que l'âge est
compris entre 0 et 120 :
(DEFUN VALIDATE-PERSON-AGE (NEW-AGE)
;; NEW-AGE: la nouvelle valeur introduite via le menu pour
;; le champ AGE d'une instance de structure PERSON.
;; Renvoie T si NEW-AGE est compris entre 0 et 120, sinon
;; renvoie NIL (NB: les symboles T et NIL représentent les 2
;; valeurs de vérité VRAI et FAUX).
(IF (AND (>= NEW-AGE 0)
(<= NEW-AGE 120))
T
NIL))
Par
quel mécanisme cette fonction est-elle appliquée lorsque l'utilisateur modifie
le champ AGE dans le menu? En fait, la fonction STRUCTURE-MENU vérifie
l'existence de la fonction dont le nom est la concaténation de VALIDATE- et du
nom de la fonction accesseur du champ courant (soit ici PERSON-AGE); si cette
fonction existe, elle est appliquée. Ceci pourrait être programmé ainsi :
(DEFUN
STRUCTURE-MENU (STRUCTURE-INSTANCE)
...
(SETF VALIDATION-FUNCTION-NAME
(MAKE-VALIDATION-FUNCTION-NAME STRUCTURE-NAME
SLOT-NAME))
(WHEN (FBOUNDP VALIDATION-FUNCTION-NAME)
(SETF OK?
(VALIDATION-FUNCTION-NAME NEW-VALUE)))
(IF OK?
(...)
(...))
...)
Commentaires
- MAKE-VALIDATION-FUNCTION-NAME
est la fonction qui génère le nom de la fonction de validation (par
concaténation de symboles), soit, ici, VALIDATE-PERSON-AGE.
- FBOUNDP est un prédicat qui vérifie
qu'il y a une valeur fonctionnelle associée à VALIDATION-FUNCTION-NAME (FBOUNDP est l'acronyme de Function-BOUND-Predicate).
- (VALIDATION-FUNCTION-NAME
NEW-VALUE) est l'application de la fonction de validation à la nouvelle valeur
introduite via le menu. La valeur de vérité (vrai ou faux, T ou NIL en Lisp) renvoyée par cette fonction est
assignée à la variable OK? via l'opérateur SETF.
- (IF OK?
(...)
(...))
Ceci correspond à la structure de
contrôle bien connue :
SI OK? = vrai
ALORS ...
SINON ...
- Remarquons
le style déclaratif de ce type de programmation : si le programmeur veut
ajouter une validation, il ne doit pas modifier le code existant (ce qui est un
facteur d'erreur); il doit simplement définir une nouvelle fonction.
|