“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 146 — #156
i
i
i
i
i
i
i
i
146
3
• Techniques de programmation déclarative
on vous le donne explicitement dans le programme. Un appel de SS avec un argument
erroné lèvera simplement une exception. Le try nous assure que la clé n’est pas
divulguée à travers l’exception.
Nous pouvons définir une abstraction de données pour faire l’emballage et le déballage. L’abstraction définit deux opérations, Wrap (emballer) et Unwrap (déballer).
Chaque opération est une fonction d’un argument. Wrap prend une valeur et renvoie
une valeur protégée. Unwrap prend une valeur protégée et renvoie la valeur originale. Les opérations Wrap et Unwrap sont complémentaires. La seule manière de
déballer une valeur emballée est d’utiliser l’opération de déballage correspondante.
Nous pouvons définir une procédure NewWrapper qui renvoie de nouvelles paires
Wrap/Unwrap :
proc {NewWrapper ?Wrap ?Unwrap}
Key={NewName} in
fun {Wrap X} {Chunk.new w(Key:X)} end
fun {Unwrap W}
try W.Key
catch _ then raise error(unwrap(W)) end end
end
end
Pour une protection maximale, chaque ADT sécurisé que nous définissons doit utiliser
sa propre paire Wrap/Unwrap. Ainsi chaque ADT est protégé contre les autres aussi
bien que contre le reste du programme. Prenez la valeur S comme avant :
S=[a b c]
Nous la protégeons ainsi :
SS={Wrap S}
Nous retrouvons la valeur originale ainsi :
S={Unwrap SS}
3.5.4 Une pile sécurisée
Maintenant nous pouvons sécuriser la pile. L’idée est de déballer les valeurs qui entrent
dans l’abstraction et d’emballer les valeurs qui en sortent. Pour faire une opération
légale sur une valeur sécurisée du type, chaque opération déballe d’abord la valeur
sécurisée, fait ensuite l’opération pour obtenir une nouvelle valeur, et enfin emballe la
nouvelle valeur pour garantir la sécurité. Voici l’implémentation :
Précédent

- 161/370

Suivant