root/docs/trunk/design_philosophies.txt

Revision 324, 11.2 kB (checked in by david, 7 months ago)

Corrections typos design_philosophies

Line 
1 ==========================
2 Philosophies de conception
3 ==========================
4
5 Ce document décrit les concepts fondamentaux que les développeurs de Django ont
6 suivis pour la création de ce framework. Son but est d'expliquer le passé et de
7 guider le futur.
8
9 Vue d'ensemble
10 ==============
11
12 Couplage faible
13 ---------------
14
15 Un des buts fondamentaux de Django est `le couplage faible et la forte cohésion`_.
16 Les différentes couches du framework ne devraient pas "se connaître" les unes
17 les autres à moins que cela soit absolument nécessaire.
18
19 Par exemple, le systÚme de gabarit ne connaît rien à propos des requêtes Web, la
20 couche de base de données ne connaît rien à propos de l'affichage des données et
21 le systÚme de vue ne soucie guÚre du systÚme de gabarit que le programmeur
22 utilise.
23
24 Bien que Django s'accompagne d'une pleine pile de fonctionnalités par commodité,
25 les piÚces de la pile sont indépendantes des autres autant que possible.
26
27 .. _`le couplage faible et la forte cohésion`: http://c2.com/cgi/wiki?CouplingAndCohesion
28
29 Moins de code
30 -------------
31
32 Les applications Django devraient utiliser aussi peu de code que possible; elles
33 devraient rester agiles. Django devrait profiter pleinement des possibilités
34 dynamiques de Python, tel que l'introspection.
35
36 Développement rapide
37 --------------------
38
39 L'intérêt d'un framework du 21Úme siÚcle est de rendre rapide les tâches
40 fastidieuses du développement Web. Django devrait permettre un développement Web
41 incroyablement rapide.
42
43 Ne vous répétez pas (DRY)
44 -------------------------
45
46 Chaque concept/portion de données distincts devrait résider en un, et un seul,
47 endroit. La redondance est mal. La normalisation est bien.
48
49 Le framework, dans la limite du raisonnable, devrait déduire autant que possible
50 à partir du minimum possible.
51
52        
53 Explicite est meilleur qu'implicite
54 -----------------------------------
55
56 Ceci, un `principe au coeur de Python`, veut dire que Django ne devraient pas
57 faire de choses trop "magiques". La magie ne devrait pas apparaître tant qu'il
58 n'y a pas de raison valable pour cela. La magie vaut la peine d'être employée
59 seulement si elle amÚne un grand confort, inaccessible d'une autre maniÚre, et
60 si elle n'est pas implémentée de maniÚre à rendre confus les développeurs qui
61 essayent d'apprendre à utiliser la fonctionnalité.
62
63 .. _`principe au coeur de Python`: http://www.python.org/dev/peps/pep-0020/
64
65 Cohérence
66 ---------
67
68 Le framework devrait être cohérent à tout niveau. La cohérence s'applique à tout
69 élément depuis le bas niveau (les rÚgles de codage Python utilisées) jusqu'au
70 haut niveau ("l'expérience" d'utilisation de Django).
71
72 ModÚles
73 =======
74
75 Explicite est meilleur qu'implicite
76 -----------------------------------
77
78 Les champs ne devraient pas adopter certains comportements basés uniquement sur
79 le nom du champ. Ceci nécessite trop de connaissance du systÚme et est source
80 d'erreurs. Au lieu de cela, les comportements devraient être basés sur des
81 arguments nommés et, dans certains cas, sur le type de champ.
82
83
84 Inclure toute la logique appropriée
85 -----------------------------------
86
87 Les modÚles devraient encapsuler chaque aspect d'un "objet", selon le patron de
88 conception `Active Record`_ de Martin Fowler.
89
90 C'est pour cette raison que les options d'administration spécifiques au modÚle
91 sont incluses dans le modÚle lui même; les données relatives au modÚle devraient
92 être stockées *dans* le modÚle.
93
94 .. _`Active Record`: http://www.martinfowler.com/eaaCatalog/activeRecord.html
95
96 API de la base de données
97 =========================
98
99 Les principes clés de l'API de la base de données sont :
100
101 Efficacité SQL
102 --------------
103
104 Elle devrait exécuter des requêtes SQL le moins souvent possible, et elle
105 devrait optimiser les requêtes en interne.
106
107 C'est pour cette raison que les développeurs doivent appeler explicitement la
108 méthode ``save()``, au lieu que ses soit le framework qui gÚre la sauvegarde de
109 maniÚre silencieuse en coulisse.
110
111 C'est aussi pour cela que les méthodes ``select_related()`` ``QuerySet``
112 existent. C'est une amélioration optionnelle des performances pour la tâche
113 courante de sélection de "chaque modÚle associé".
114
115 Syntaxe succinte mais puissante
116 -------------------------------
117
118 L'API de base de données devrait autoriser de riches et consistantes requêtes
119 dans un minimum de syntaxe possible. Elle ne devrait pas s'appuyer sur l'import
120 d'autres modules ou d'objets d'aide à la mise en forme.
121
122 Les jointures devraient être réalisées automatiquement, en coulisse, lorsque
123 nécessaire.
124
125 Chaque objet devrait pouvoir accéder à chaque objet associé, dans tout le
126 systÚme. Cet accÚs devrait fonctionner dans les deux sens.
127
128 Une option pour exécuter une requête SQL facilement, lorsque nécessaire
129 -----------------------------------------------------------------------
130
131 L'API de base de données devrait réaliser qu'elle est un raccourci mais pas
132 nécessairement un tout-en-un. Le framework devrait rendre facile l'écriture de
133 SQL sur mesure -- des requêtes complÚtes, ou juste des clauses ``WHERE``
134 personnalisées en tant que paramÚtres pour les appels à l'API.
135
136 Conception des URLs
137 ===================
138
139 Couplage faible
140 ---------------
141
142 Les URLs dans une application Django ne devraient pas être associées à un code
143 Python sous-jacent. L'association d'URLs à des fonctions Python nommées est une
144 Mauvaise et Vilaine Chose.
145
146 A travers ces lignes, le systÚme d'URL Django devrait permettre aux URLs
147 provenant de la même application d'être différentes dans des contextes
148 différents. Par exemple, un site peut mettre les articles à ``/articles/``,
149 alors qu'un autre peut utiliser ``/nouvelles/``.
150
151 Flexibilité infinie
152 -------------------
153
154 Les URLs devraient aussi flexibles que possible. Toute conception d'URL
155 imaginable devrait être permise.
156
157 Encourager les bonnes pratiques
158 -------------------------------
159
160 Le framework devrait faire en sorte qu'il soit facile (ou plus facile) pour un
161 développeur de concevoir de jolies URLs que des moches.
162
163 Les extensions de fichier dans les URLs des pages Web devraient être évités.
164
165 L'utilisation abusive de virgules dans les URLs est passible d'une sévÚre
166 punition.
167
168 URLs permanentes
169 ----------------
170
171 Techniquement, ``foo.com/bar`` et ``foo.com/bar/`` sont deux URLs différentes,
172 et les robots des moteurs de recherche (et quelques outils d'analyse du traffic)
173 pourraient les traiter de maniÚre séparées. Django devrait faire un effort pour
174 "normaliser" les URLs afin ne pas permettre la confusion aux robots des moteurs
175 de recherche.
176
177 Il s'agit du raisonnement derriÚre le paramÚtre de configuration ``APPEND_SLASH``.
178
179 SystÚme de gabarit
180 ==================
181
182 Séparer la logique de la présentation
183 -------------------------------------
184
185 Nous voyons un systÚme de gabarit comme un outil contrÎlant la présentation et
186 la logique relative à la présentation -- et c'est tout. Le systÚme de gabarit ne
187 devrait pas supporter de fonctionnalités qui vont au delà de ces principes de
188 base.
189
190 Si nous voulions tout mettre dans les gabarits, nous aurions utiliser PHP.
191 Sachant cela, mettez vous au parfum.
192
193 Décourager la redondance
194 ------------------------
195
196 La majorité des sites Web dynamiques utilisent des parties entiÚres et communes
197 du design du site -- un entête, pied de page, barre de navigation, etc. communs.
198 Le systÚme de gabarit de Django devrait rendre facile le stockage de tels éléments
199 en un seul endroit, supprimant les parties de code dupliquées.
200
201 C'est le concept derriÚre `l'héritage de gabarit`_.
202
203 .. _l'héritage de gabarit: ../templates/#template-inheritance
204
205 Etre dissocié du HTML
206 ---------------------
207
208 Le systÚme de gabarit ne devraient pas être conçu pour seulement produire du
209 HTML. Il devrait être également bon à générer d'autres formats basés sur du
210 texte, ou juste du texte.
211
212 Le XML ne devrait pas être utiliser pour les langages de gabarit
213 ----------------------------------------------------------------
214
215 L'utilisation d'un moteur de XML pour analyser les gabarits introduit tout un
216 monde nouveau pour les erreurs humaines dans l'édition de gabarit -- et implique
217 un niveau inacceptable de surcharge dans le traitement du gabarit.
218
219 Prendre en compte la compétence du designer
220 -------------------------------------------
221
222 Le systÚme de gabarit ne devrait pas être conçu de telle maniÚre que les
223 gabarits soient nécessairement bien affichés dans les éditeurs WYSIWYG tel que
224 Dreamweaver. C'est une limitation trop importante et ne permettrait pas à la
225 syntaxe d'être aussi aisée qu'elle l'est. Django pré-suppose que les auteurs de
226 gabarit sont à l'aise avec l'édition HTML.
227
228 Traiter les espaces blancs de maniÚre évidente
229 ----------------------------------------------
230
231 Le systÚme de gabarit ne devrait pas faire de choses magiques avec les espaces
232 blancs. Si un gabarit inclut des blancs, le systÚme devrait traiter les blancs
233 comme il le fait avec le texte -- juste l'afficher. Tout blanc qui ne fait pas
234 partie d'un marqueur de gabarit devrait être affiché.
235
236 Ne pas inventer un langage de programmation
237 --------------------------------------------
238
239 Intentionnellement, le systÚme de gabarit ne permet pas ce qui suit :
240
241     * L'assignement des variables
242     * La logique avancée
243
244 Le but n'est pas d'inventer un langage de programmation. Le but est juste
245 d'offrir une bonne fonctionnalité programmationnelle, tel que les conditions et
246 les boucles, ce qui est essentiel pour produire des présentations dirigées par
247 les décisions.
248
249 Le systÚme de gabarit de Django postule que les gabarits sont plus souvent
250 écrits par les *designers*, et non les *programmeurs*, et de ce fait ne
251 nécessite pas de connaissance en Python.
252
253 Sûreté et sécurité
254 ------------------
255
256 Le systÚme de gabarit, nativement, devrait interdire l'inclusion de code
257 malicieux -- tel que des commandes supprimant les données en base.
258
259 C'est une autre raison pour laquelle le systÚme de gabarit ne permet pas l'ajout
260 arbitraire de code Python.
261
262 Extensibilité
263 -------------
264
265 Le systÚme de gabarit devrait prendre en compte le fait que les auteurs de
266 gabarits de niveau avancé peuvent vouloir étendre cette technologie.
267
268 C'est le concept derriÚre les marqueurs et les filtres de gabarit personnalisés.
269
270 Vues
271 ====
272
273 Simplicité
274 ----------
275
276 L'écriture d'une vue devrait être aussi simple que d'écrire une fonction Python.
277 Les développeurs ne devraient pas avoir besoin d'instancier une classe quand
278 une fonction suffit.
279
280 Utiliser les objets de requête
281 ------------------------------
282
283 Les vues devrait avoir accÚs à un objet de requête -- un objet qui stocke les
284 métadonnées relatives à la requête courante. L'objet devrait être passé
285 directement à une fonction de vue, au lieu que ce soit la fonction de vue qui
286 doivent accéder aux données de la requête à travers une variable globale. Ceci
287 permet de tester de maniÚre légÚre, propre et facile les vues en leur passant
288 des "faux" objets de requête.
289
290 Couplage faible
291 ---------------
292
293 Une vue ne devrait pas se soucier du systÚme de gabarit que le développeur
294 utilise -- ou même si un systÚme de gabarit est utilisé ou non.
295
296 Différencier entre GET et POST
297 ------------------------------
298
299 GET et POST sont distincts; les développeurs devraient explicitement utiliser
300 l'un ou l'autre. Le framework devrait facilement distinguer les données GET et
301 POST.
Note: See TracBrowser for help on using the browser.