From 0158ba537b854709688c1737da0a69c6d9457d83 Mon Sep 17 00:00:00 2001 From: Fred Pauchet Date: Sun, 5 Jun 2022 22:01:19 +0200 Subject: [PATCH] API + Models services --- chapters/api.tex | 2 +- chapters/models.tex | 31 +++++++++++++++--- .../views-services-managers-models.drawio | 1 + .../views-services-managers-models.drawio.png | Bin 0 -> 7817 bytes 4 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 images/diagrams/views-services-managers-models.drawio create mode 100644 images/diagrams/views-services-managers-models.drawio.png 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 0000000000000000000000000000000000000000..8f7c223b62b3a00264ebb9f53f7949d6e966ed45 GIT binary patch literal 7817 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