|
Postscript, PDF | Didier Rémy | Polytechnique, INRIA |
|
|
||||
|
|
· | Les fonctions amis. |
· | Gestion d'événements. |
· | Abonnements à des services. |
|
· | les opérations sont réalisées par les fenêtres. |
· | les décisions sont prises par ou (ou plusieurs) gestionnaires. |
· | Les sujets exécutent les actions et rapportent aux observateurs |
· | Les observateurs décident et ordonnent aux sujets. |
nil
et
cons
sont des classes qui peuvent être raffinées, eg. avec une
méthode longueur; de plus une nouvelle classe append
peut être
ajoutée. Cependant, la communication entre les différentes classes est moins
intime que dans le motif subjet/observateur.
|
|
|
|
observateurs
et une méthode ajoute
pour gérér ses abonnés, et
une méthode envoie
pour faire suivre un message à l'ensemble des
abonnés.
|
|
|
|
|
déplace
exécute le déplacement et rend compte d'un
déplacement en envoyant par convention le message déplacé
à
l'observateur. La fenêtre a également une méthode dessine.observateur
:
|
déplacé
de l'observateur prend acte du déplacement et
demande à l'objet (reçu en argument) de se redessiner.
|
|
fenêtre
et gestionnaire
peuvent être raffinées
par héritage, indépendemment l'une de l'autre. Par exemple, on pourra:
· | ajouter des méthodes retaille et devant aux fenêtres.
|
· | améliorer la méthode dessine... |
· | faire prendre en compte de nouveaux messages au gestionnaire. |
|
|
grande_fenêtre
qui implémente une méthode retaille
(ce qui implique aussi de
redéfinir la méthode dessine
pour afficher la taille) qui rend compte
en appelant la méthode retaillée
de l'observateur.
On ajoutera également une méthode en_avant
pour placer une fenêtre sur
le devant (représenté par un booléen).
Dériver une classe grand_gestionnaire
capable de gérer les grandes
fenêtres (par exemple, à la récep
Étendre la classe inspecteur
en big_brother
qui trace tous les
ordres.
|
· | Multiplexer les messages sous forme d'un type variante pour les faire passer par le même canal. |
· | Séparer les messages, en utilisant une paire de noms (émetteur/récepteur) par type de message. |
|
|
· | Le multiplex nécessite de figer dès le départ l'ensemble des événements, à
monis d'utiliser des types variantes. Est-ce un problème dans le cas traité ? (cela dépend de l'application considérée) |
· | Le multiplex traite tous les événements de la même façon, le code est donc bien partagé. |
· | La séparation paraît plus souple: chaque type d'événement est associé à une méthode dédiée et peut donc être traité de façon appropriée. |
· | En contrepartie, le nombre de méthodes peut augmenter rapidement, beaucoup étant semblables. |
· | La multiplication du nombre de méthodes rend souvent le protocole plus confus et l'héritage plus contraignant (tous les composants doivent définir toutes les méthodes). |
|
|
|
|
self#désabonne
qui en retour appelle
s#désabonne f
de telle façon que l'utilisateur n'ait pas à connaître
(ou rappeler) le serveur s
.
|
client * client -> int -> unit
qui expose le type du client et le type du message ( int
ici). Le type
du client peut être caché en appliquant la fonction à l'argument de façon
retardée:
|
|
< >
.
|
|
|
|
(f, c)
a le type $ a. (a
× (a ® int ® unit)) dans lequel la variable
a n'est pas libre (elle est donc cachée et on parle de type abstrait
ou existentiel). unit -> unit
mais
comportant dans sa fermeture des effets de bords permettant d'informer le
client d'événements détectés par le serveur.
|
· | la sécurité en limitant le risque d'intrusion |
· | la flexibilité en rendant la plupart des informations non visibles (élimination des contraintes de typage). |
unit -> unit
, peuvent être
accidentellement interchangés. La sûreté (différent de sécurité) est donc
diminuée.
|
|
|
|
|
enregistre
'' et ``désabonne
'' du client sont des
exemples de relais: Elles font suivre les messages adressés au client vers
des messages associés du serveur.
|
|
désabonne
peut faire
des mises à jour, tracer, ou clore d'autres opérations.
|
|
|
|
figure
et d'un comportement de bouton,
on fabrique une classe bouton. Ou encore, on personnalise une classe figure
en lui ajoutant des menus locaux, etc.
|
|
|
|
|
|
point_annoté
à partir des classes précédentes.
|
|
|
|
· | Les deux classes parentes sont aplaties en une seule qui conserve la liaison tardive et permet de spécialiser toutes les méthodes. |
· | L'accès privilégié aux variables d'instance x
et s est normal.
|
· | Les méthodes peuvent avoir le même nom dans les deux classes parentes. (on peut former une classe de bipoints avec deux points). |
· | On peut maintenant facilement reconfigurer un objet de la classe
point_annoté , en changeant par exemple l'objet texte par un objet
texte_éditable (il suffit de rendre mutables les champs point et
texte .
|
|
|
This document was translated from LATEX by HEVEA and HACHA.