diff --git a/chapters/api.tex b/chapters/api.tex index 15b3faf..4328980 100644 --- a/chapters/api.tex +++ b/chapters/api.tex @@ -128,7 +128,7 @@ Il convient de: Les sérialiseurs agissent litérallement comme des \texttt{forms}, mais au niveau de l'API. Ils se basent sur un modèle, définit au niveau de la \texttt{class Meta}, permettent de choisir les champs qui seront sérialisés, définissent différentes méthodes d'accès à des propriétés spécifiques et des méthodes de validation. Tout comme les forms. -Par exemple: +Par exemple, avec Django Rest Framework: \begin{minted}{python} # serializers.py diff --git a/chapters/models.tex b/chapters/models.tex index ddf20d1..4bd99de 100644 --- a/chapters/models.tex +++ b/chapters/models.tex @@ -640,10 +640,15 @@ Par défaut, le gestionnaire est accessible au travers de la propriété \section{Services} -Une des recommandations que l'on peut lire pour django consiste à créer des \texttt{fat models}. -Le soucis, c'est que l'on arrive rapidement à créer des classes de plusieurs centaines de lignes, qui dialoguent directement avec la base de données. -Un des patterns proposé par GoF est d'avoir des \texttt{repositories}, qui consistent à isoler l'accès à la base de données en utilisant des DTO. -Le soucis (que nous avons déjà vu avec Django) est que l'ORM est de type ActiveRecords, et donc à l'opposé de ces DTO (qui doivent être bêtes comme chou): +Une des recommandations que l'on peut lire pour django consiste à créer des \textit{fat models} et à conserver des \textit{thin views}, c'est-à-dire à compléter le maximum d'informations directement au niveau du modèle et sortir le maximum de règles métiers des vues. +Le soucis, c'est que l'on arrive rapidement à créer des classes de plusieurs centaines de lignes, qui dialoguent directement avec la base de données, et qui pourraient potentiellement: + +\begin{enumerate} + \item + Réaliser des requêtes N+1 vers d'autres objets + \item + Ajouter un couplage supplémentaire directement au niveau des propriétés. +\end{enumerate} \begin{quote} The "Fat Models" recommendation is one of the most destructive in my opinion: https://django-best-practices.readthedocs.io/en/latest/appli..., along with Django Rest Framework "Model Serializers". A JSON serializer that talks directly to the database is just madness. @@ -651,6 +656,24 @@ Le soucis (que nous avons déjà vu avec Django) est que l'ORM est de type Activ -- \url{https://news.ycombinator.com/item?id=23322880} \end{quote} +La proposition consiste à créer des services qui viennent se glisser entre les vues et les managers. +De cette manière, nous : + +\begin{enumerate} + \item + Conservons le principe de \textit{thin views} + \item + Ajoutons un concept intermédiaire, entre ces vues et les managers, afin de limiter la maintenance des requêtes, mais aussi + \item + Gardons les managers comme couche d'accès à la base de données, + \item + Conservons des modèles cohérents, dans lesquels il serait logique de trouver une propriété spécifique, + \item + Gardons les modèles à la frontière entre la représentation mentale d'un concept et sa presistance. +\end{enumerate} + +\includegraphics{images/diagrams/views-services-managers-models.drawio.png} + \section{Refactoring et héritages} On constate que plusieurs classes possèdent les mêmes propriétés \texttt{created\_at} et \texttt{updated\_at}, initialisées aux mêmes valeurs. diff --git a/images/diagrams/views-services-managers-models.drawio b/images/diagrams/views-services-managers-models.drawio new file mode 100644 index 0000000..470508a --- /dev/null +++ b/images/diagrams/views-services-managers-models.drawio @@ -0,0 +1 @@ +7VdNc5swEP01HNsxyB/02DhOM5nkUmba5ChLa1AiWEZeDM6vrzDCwDBJ3GkzziEntG+1i/btWz48tkyrH4bnyR1K0F4wkZXHLr0g8P1JYC81snfIJJg1SGyUbLBJB0TqGdqNDi2UhK3DGogQNal8CArMMhA0wLgxWA63bVDLAZDzGEZAJLgeo7+VpKRBw2DR4deg4qS9sz//1njWXDzFBovM3S/DDBpPyts0rsZtwiWWPYitPLY0iNSs0moJuuZ1yNjVC97jkQ1kdEpA+TwVj+p+fR1dpQZufgryF19clh3XhaPiV2Eb0RyY9i0/hwqhTjTx2EWZKIIo56L2llYSFkso1dby7dKlBENQvXhW/8iAVRVgCmT2dosLYI4zp6eWwrLrTRA6LOn1pQ3jTg7xMXHHi104av6CptmIEZBWQM5EQwnGmHG96tCLIWfdnlvE3DH1CER7Nw28IBzyCJWi+zr868xZDy5Zvb6s+sa+NTJbbi+oNh/afLXRhR2sNq6pry7q9Y5ZDrAwAl7hyj0LiJsY6C3pjRVgQHNSu+E5/ntDg5HuIzA7Jf5V+5Jvk8Pe2tgorZeo0RwSMckh3AiLb8ngE/Q8cxHCevMuoxOee3Tmn6Nz8uiwE0cnOOfosNHo3PHMviDNh3tt+NNzi3/xKf6TxT89UfzsnOKfjsWP0lsy73uoP+J30/sNgDW7b9eDr/dzwFZ/AA== \ No newline at end of file diff --git a/images/diagrams/views-services-managers-models.drawio.png b/images/diagrams/views-services-managers-models.drawio.png new file mode 100644 index 0000000..8f7c223 Binary files /dev/null and b/images/diagrams/views-services-managers-models.drawio.png differ