“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 246 — #256
i
i
i
i
i
i
i
i
246
5
• La programmation avec état explicite
local Wrap Unwrap
...
proc {Union C1 C2}
S1={Unwrap C1} S2={Unwrap C2} in
{DoUntil fun {$} {Stack.isEmpty S2} end
proc {$} {Stack.push S1 {Stack.pop S2}} end}
end
in
Collection=collection(... union :Union)
end
Remarquez que cette implémentation a besoin des représentations internes de C1 et
C2, c’est-à-dire des deux piles. Voici une exécution :
C1={Collection.new} C2={Collection.new}
for I in [1 2 3] do {Collection.put C1 I} end
for I in [4 5 6] do {Collection.put C2 I} end
{Collection.union C1 C2}
{Browse {Collection.isEmpty C2}}
{DoUntil fun {$} {Collection.isEmpty C1} end
proc {$} {Browse {Collection.get C1}} end}
Nous pouvons faire une deuxième implémentation qui n’utilise que les interfaces
externes de C1 et C2 :
local Wrap Unwrap
...
proc {Union C1 C2}
{DoUntil fun {$} {Collection.isEmpty C2} end
proc {$}
{Collection.put C1 {Collection.get C2}} end}
end
in
Collection=collection(... union:Union)
end
En résumé, nous avons le choix d’utiliser ou non la représentation interne des collections. Nous avons la liberté de faire une implémentation plus efficace en utilisant les
représentations internes, mais dans ce cas nous perdons le polymorphisme.
5.5.3 Ajouter une opération union dans le cas objet
Ajoutons maintenant une opération union à l’objet Collection. Dans le style objet on
l’appelle comme {C1 union(C2)}. Voici l’implémentation :
Précédent

- 261/370

Suivant