Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BACKEND] Refactorisation des repositories/uniformisation #410

Open
rv2931 opened this issue Jan 26, 2025 · 0 comments
Open

[BACKEND] Refactorisation des repositories/uniformisation #410

rv2931 opened this issue Jan 26, 2025 · 0 comments

Comments

@rv2931
Copy link
Collaborator

rv2931 commented Jan 26, 2025

Les repositories on pas mal évolués pendant la saison 12 dataforgood et n'ont pas forcément suivi le pattern initial pendant la saison
Pour une mise au propre, il serait peut-être intéressant de remettre en cohérence tout ça mais pour ça il faudrait d'abord rappeler ou préciser les lignes directrices prévues initialement
D'après les discussions que j'ai pu avoir avec Amine, et ce que je pense en avoir compris, j'ai noté quelques axes de travail:

  • A priori c'était un Domain Driver Design qui a été pensé au départ. Si on suit cette philosophie les classes Domain sont les classes de bases qui doivent se retrouver un peu partout, cela signifie que les repositories devraient recevoir et renvoyer exclusivement des classes Domain. Actuellement certaines fonctions renvoient ou prennent des DataFrame pandas ce qui contravient à ce principe. Pour ce besoin il me semble qu'il faudra prévoir des mappers selon les types comme il en existe déjà model_to_domain/domaine_to_model et donc dataframe_to_domain/domain_to_dataframe (A confirmer le principe)
  • Pour coller au design pattern repositories, il est préconisé d'avoir une classe de base abstraite "AbstractRepository" pour tous les repositories (desgin pattern interface/repository). Puis en subclasse cette classe de base avec des classes toujours abstraites qui viennent spécialiser selon le type de stockage (SqlAlchemy, JSON, CSV,...) puis des sous-classes spécifiques à chaque Domain/Model afin d'y ajouter les fonctions propres aux Domain/Model. Une fois en place c'est assez pratique et propre, et surtout ça permet de simplifier grandement la création de répositories de tests (en évitant de mocker) à partir de jeux de fichier de tests en JSON, CSV, parquet, ou autres
  • Au départ c'était le design pattern repository exclusivement (session générée par le construsteur de chaque répository) qui a été mis en place mais dans la pratique toutes les fonctions des repositories qui sont aujourd'hui utilisées reçoivent en argument la session créée préalablement afin de pouvoir réaliser plusieurs opérations sur la même session et pouvoir rollback la totalité des opérations en cas de problème. Donc dans les faits on a mis en place le design pattern UnitOfWork+Repository et pas seulement le Repository. Dans l'idée on pourrait éventuellement un peu plus l'assumer et utiliser la nomenclature UnitOfWork pour que ce soit peut-être un peu plus explicite et qui se justifie de toutes manières

Voilà pour les points que j'ai pu identifier en terme de mise au propre concernant les repositories. Tout ceci reste à discuter/valider

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant