| 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. |
|---|