root/rmll_workshops/zope3_interfaces/zope3_interfaces.txt

Revision 80, 6.1 KB (checked in by ogrisel, 4 years ago)

savepoint

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
Line 
1.. include:: <s5defs.txt>
2
3====================================
4L'architecture �omposants de Zope3
5====================================
6
7:Authors: Olivier Grisel <olivier@afpy.org>
8:Date:    $Date: 2006-06-23$
9
10.. class:: small
11
12  Adaptation de `ce blog`_ de Jeff Shell
13
14.. _`ce blog`: http://griddlenoise.blogspot.com/2005/12/zope-component-architecture-interfaces.html
15
16.. class:: small
17
18  * Interfaces et duck typing
19
20  * Modularisation du code, l'approche composants
21
22  * Branchements avec les adapteurs
23
24
25.. container:: handout
26
27    Ce tutorial pr�nte rapidement les concepts fondamentaux de
28    l'architecture �ase de composant mise en place pour le d�loppement
29    du serveur d'application Zope3
30
31.. contents::
32   :class: handout
33
34.. |bullet| unicode:: U+02022
35.. |mode| unicode:: U+00D8 .. capital o with stroke
36
37.. footer:: Location |bullet| Date
38
39
40Une histoire de canards
41=======================
42
43.. class:: incremental
44
45  * Si ca fait coin comme un canard, alors c'est un canard
46
47  * Et m� si c'est pas un vrai, ca m'est �l
48
49  ::
50
51    >>> from StringIO import StringIO
52    >>> f = StringIO('data')
53    >>> f.read()
54    'data'
55
56  * Contractualisation cette relation gr� �a notion d'interface
57
58  * But formaliser les relations entre composants pour les rendre
59    interchangeables
60
61
62Les interfaces Zope3 (1/2)
63==========================
64
65.. class:: incremental
66
67  * Histoire : Zope2 est bas�ur une architecture ancienne dans laquelle les
68    objets sont rendus tr�puissants en (ab)usant de l'h�tage multiple
69
70  * PBM : si on souhaite changer une classe parent, de grosse portion du code
71    sont remises en question
72
73
74Les interfaces Zope3 (2/2)
75==========================
76
77.. class:: incremental
78
79  * R�ltat 1 : Zope2 a une architecture avec des couches s�mentaires qui rend
80    le code rigide et difficilement refactorable
81
82  * R�ltat 2 : Pour Zope3, besoin d'isoler les composants en les
83    responsabilisant explicitement
84
85  * Cons�ence : cr�ion du module ``zope.interface`` et de son associ�   ``zope.component``
86
87  * Utilisables et utilis�en dehors de Zope3, par exemple:
88
89    - twisted_
90
91.. _twisted: http://twistedmatrix.com
92
93
94Formalisons la canarditude (1/2)
95================================
96
97.. class:: incremental
98
99  ::
100
101    >>> from zope.interface import implements, providedBy, Interface
102    >>> class IFaitCoinCoin(Interface):
103    ...
104    ...     def coin_coin():
105    ...         """Retourne un son de coin coin"""
106    ...
107
108  ::
109
110    >>> class Colvert(object):
111    ...     implements(IFaitCoinCoin)
112    ...
113    ...     def coin_coin(self):
114    ...         return 'En tant que colvert, je fais "coin ! coin !"'
115    ...
116
117Formalisons la canarditude (2/2)
118================================
119
120.. class:: incremental
121
122  ::
123
124     >>> bob = Colvert()
125     >>> IFaitCoinCoin.providedBy(bob)
126     True
127     >>> print bob.coin_coin()
128     En tant que colvert, je fais "coin ! coin !"
129
130
131Les adapteurs
132=============
133
134.. class:: incremental
135
136  * Impl�ntation du "design pattern" nomm�delegation"
137
138  * Peut tr�souvent s'utiliser en lieu et place de l'h�tage
139
140  * Adapte une (ou plusieurs) interface(s) source vers une interface cible
141
142  * Sur un exemple, ca sera plus clair :)
143
144
145La notion de chasseuritude
146==========================
147
148* Commencons par d�nir une seconde interface pour caract�ser le
149  comportement d'un chasseur
150
151.. class:: incremental
152
153  ::
154
155    >>> from zope.interface import Attribute
156    >>> class IChasseur(Interface):
157    ...
158    ...     nom = Attribute("Le nom du chasseur")
159    ...
160    ...     def pan_pan(cible):
161    ...       """Fait pan pan sur une cible"""
162
163
164Le bien et le mal
165=================
166
167.. class:: handout
168
169  Dans la vie, il y a deux types de chasseurs. Le mauvais est le plus simple
170  �mpl�nter:
171
172.. class:: incremental
173
174  ::
175
176    >>> class MauvaisChasseur(object):
177    ...     implements(IChasseur)
178    ...
179    ...     def __init__(self, nom):
180    ...         self.nom = nom
181    ...
182    ...     def pan_pan(self, cible):
183    ...       print "pan ! pan !"
184    ...       cible.coin_coin = lambda: "argl !"
185    ...
186    >>> tom = MauvaisChasseur('Tom')
187
188  ::
189
190    >>> IChasseur.providedBy(tom)
191    True
192
193  ::
194
195    >>> IFaitCoinCoin.providedBy(tom)
196    False
197
198
199Et les adapteurs dans tout ca ?
200===============================
201
202.. class:: incremental
203
204  * Le probl� du chasseur c'est qu'il voudrait se faire passer pour un canard
205
206  * Premi� solution :
207
208    .. class:: incremental
209
210    - cr� une nouvelle classe ChasseurQuiFaitCoinCoin(MauvaisChasseur, Colvert)
211
212    - c'est contre nature !
213
214  * Deuxi� solution :
215
216    .. class:: incremental
217
218    - cr�ion d'un classe ``Appeau`` qui adapte ``IChasseur`` vers
219      ``IFaitCoinCoin``
220
221
222Adaptons
223========
224
225.. class:: incremental
226
227  ::
228
229    >>> from zope.component import adapts
230    >>> class Appeau(object):
231    ...     implements(IFaitCoinCoin)
232    ...     adapts(IChasseur)
233    ...
234    ...     def __init__(self, chasseur):
235    ...         self.chasseur = chasseur
236    ...
237    ...     def coin_coin(self):
238    ...         return self.chasseur.nom + ' fait "coin ! coin!" avec son appeau'
239    ...
240
241  ::
242
243    >>> from zope.component import provideAdapter
244    >>> provideAdapter(Appeau)
245
246
247Utilisation
248===========
249
250.. class:: incremental
251
252  ::
253
254     >>> IFaitCoinCoin(tom)
255     <Appeau object at 0x...>
256
257  ::
258
259     >>> print IFaitCoinCoin(tom).coin_coin()
260     Tom fait "coin ! coin!" avec son appeau
261
262
263Exemple d'utilisation dans Zope3
264================================
265
266.. class:: incremental
267
268  * Les vues sont des adapteurs sur des request et un context
269
270  * Pour une requ� donn�et un objet publi�ans un certain context, on
271    g�re un objet vue qui se charge du rendu HTML
272
273  * Dans ce cas il s'agit d'un multi-adapter
274
275
276Concr�ment, je dois installer quoi ?
277======================================
278
279.. class:: incremental
280
281  * zope.interface
282
283  * zope.component
284
285  * Se trouvent ici : http://download.zope.org/distribution
286
287  * Avec ``setuptools``, il est possible de r�udre cette d�ndance
288    automatiquement:
289
290  ::
291
292    setup(
293      ...
294      install_requires=["zope.interface", "zope.component"],
295      dependency_links=["http://download.zope.org/distribution"],
296      )
297
298
299Questions ?
300===========
301
Note: See TracBrowser for help on using the browser.