Découpler des composants Seaside

By bioskop

Lorsque l’on écrit des composants Seaside, il arrive souvent que l’on veuille qu’ils communiquent ou interagissent entre eux. On peut alors se demander comment procéder pour éviter de les coupler explicitement, et qu’ils restent réutilisables.

Il existe une solution pratique et élégante à ce problème : les annonces. Plusieurs implémentations existent en Squeak, j’ai choisi d’utiliser celle fournie avec OmniBrowser, pour sa simplicité.

L’idée est simple : créer un annonceur dans la session, un composant peut déclencher l’annonce, et un autre y répondre.

WASession subclass: #MySession
instanceVariableNames: 'announcer'
classVariableNames: ''
poolDictionaries: ''
category: 'Announcement-Demo'

MySession>>announcer
^announcer ifNil: [announcer := OBAnnouncer new]

Il ne faut pas oublier d’initialiser correctement le composant principal de l’application :

MyMainComponent class>>initialize
(self registerAsApplication: 'Announcement-Demo')

preferenceAt: #sessionClass put: MySession

Il faut ensuite créer une annonce, sous-classe de OBAnnouncement :

OBAnnouncement subclass: #MyAnnouncement
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Announcement-Demo'

Tout composant intéressé par cette annonce peut alors le spécifier lors de son initialisation, et prévoir une action à effectuer lors de son annonce :

MyFirstComponent>>initialize
super initialize.
self session announcer observe: MyAnnouncement send: #action to: self

MyFirstComponent>>action
"Do something when MyAnnouncement is announced."

Et un autre composant peut l’annoncer :

MySecondComponent>>renderContentOn: html
html anchor callback: [self announceAction]; with: 'do something'

MySecondComponent>>announceAction
self session announcer announce: MyAnnouncement

Vous pouvez donc très facilement faire interagir plusieurs composants de cette manière, avec différentes annonces, et ainsi garder des composants réutilisables.

3 réponses vers «Découpler des composants Seaside»

  1. Sop dit :

    Salut,

    Je suis un utilisateur de Visualworks, je n’ai jamais essayé squeak, mais je crois que je vais me laisser tenter !

    Il existe un framework équivalent pour VW ?

    PS : On trouve peu de blogs sur smalltalk en français, alors continue !

  2. bioskop dit :

    salut

    si tu veux essayer Squeak, le site de la communauté francophone se trouve ici :

    http://community.ofset.org/wiki/Squeak

    Je ne connais pas bien VisualWorks, mais je sais qu’il existe AXAnnouncements, qui a d’ailleurs été porté pour Squeak.

    Lukas renggli a écrit un billet sur ce sujet : http://www.lukas-renggli.ch/blog/decoupling

  3. Serge Stinckwich dit :

    Seaside existe pour VW également. Cincom le supporte officiellement depuis peu de temps.

Laisser un commentaire