API + Models services
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Fred Pauchet 2022-06-05 22:01:19 +02:00
parent a41d71d0a8
commit 0158ba537b
4 changed files with 29 additions and 5 deletions

View File

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

View File

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

View File

@ -0,0 +1 @@
<mxfile host="Electron" modified="2022-06-05T17:39:44.315Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/16.5.1 Chrome/96.0.4664.110 Electron/16.0.7 Safari/537.36" etag="3iHkDEuivSrTqpw3b5fn" version="16.5.1" type="device"><diagram id="Ydo78euwI9dIE6LB2MPQ" name="Page-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==</diagram></mxfile>

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB