-
Notifications
You must be signed in to change notification settings - Fork 5
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
Refactor(pulicodes-state): code review + refactoring #93
Conversation
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
80dd4de
to
e6d570a
Compare
e6d570a
to
3ba9b65
Compare
bc7ce1c
to
ad09960
Compare
18e7675
to
4ad34ed
Compare
const categories = useMemo<string[]>(() => { | ||
const sum = safeGetRule(root)?.rawNode?.formule?.somme | ||
return order | ||
? // NOTE(@EmileRolley): what should be the wanted behavior if the order |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Je me suis aussi posé la question ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On ne compare rien ici. On ordonne juste la liste des catégories selon un paramètre order
9e84210
to
3b5b39e
Compare
680dfa0
to
872c7f3
Compare
872c7f3
to
c5a5ad4
Compare
2 failed tests on run #518 ↗︎Details:
|
…statement instead of if-then-else
c5a5ad4
to
d0ed2e1
Compare
Report for the pull request #93🌐 Translation statusUI's texts
FAQ's questions
|
d0ed2e1
to
cf64546
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Plusieurs questions àgauche et à droite :) Le rebase preprod risque de faire MAL on a changé l'archi de PS !
rule: NGCRuleNode | null | any // Model shenanigans: question alimentation . local . consommation is missing "formule" | ||
dottedName: RuleName | ||
// Model shenanigans: question alimentation . local . consommation is missing "formule" | ||
// NOTE(@EmileRolley): I don't get why it's a problem? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ici est-ce que ça vaudrait pas le coup de mettre un commentaire sur la PR plutôt que dans le code pour en discuter ?
@@ -22,7 +26,7 @@ export default function useEngine() { | |||
const getCategory = (dottedName: string): string => dottedName.split(' . ')[0] | |||
|
|||
const checkIfValid = (dottedName: string): boolean => | |||
safeGetRule(dottedName) ? true : false |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pour le coup, ici je trouve que le code préexistant incluait plus de cas de figure : false
undefined
null
🤔
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
safeGetRule
a comme signature :
nosgestesclimat-site-nextjs/src/publicodes-state/providers/simulationProvider/context.ts
Line 15 in cf64546
safeGetRule: (rule: string) => NGCRuleNode | null |
Donc on a uniquement besoin de vérifier si la valeur de retour est différente de null
.
@@ -1,65 +1,77 @@ | |||
/* eslint @typescript-eslint/no-unused-vars: "warn" */ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Warum ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pour ne pas avoir de warnings avec l'utilisation de _
. Je ne sais pas si c'est recommandé mais j'ai trop l'habitude d'utiliser _
pour ignore des variables.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tu n'as pas d'erreur si la variable est obligatoire il me semble (exemple : map(_, index)
-
[engine] | ||
) | ||
|
||
const everyMosaicChildWhoIsReallyInMosaic = useMemo<string[]>( | ||
// FIXME(@EmileRolley): refactoring not tested yet |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Il faudrait peut-être tester ça avant de demander une relecture non ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm il me semble que c'est un oublie 🤔
@@ -21,6 +21,8 @@ export type User = { | |||
hasSavedSimulation?: boolean | |||
} | |||
|
|||
export type RuleName = string |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Je vois pas trop l'intérêt d'ajouter un type comme ça, autant utiliser string
directement non ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Cf. #156 (comment)
Ca permet de réduire l'ensemble des valeurs possible. Par exemple, si tu sais que t'as fonction attend un argument de type RuleName
tu ne vas pas avoir envie de l'appeler avec n'importe qu'elle string
. Dans le contexte de TS ce n'est pas très efficace parce que rien ne t'interdit de passer n'importe quelle string en argument, mais dans les language avec un vrai système de type ça permet de forcer l'utilisation de certaines fonctions.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Je trouve ça assez lourd pour un apport qui me semble minime
@@ -21,6 +21,8 @@ export type User = { | |||
hasSavedSimulation?: boolean | |||
} | |||
|
|||
export type RuleName = string | |||
|
|||
export type Rules = any |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pareil ici @florianpanchout 🙄
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
J'espérais faire quelque chose de plus détaillé à terme
order: RuleName[] | null | ||
} | ||
|
||
export default function useCategories({ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pourquoi est-ce qu'il s'agit d'un nouveau fichier ? On n'avait pas déjà ce hook ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ca doit être un legacy de rebase
Je réponds aux retours qui appellent une réponse (le reste n'est soit plus d'actualité, soit je suis d'accord et n'ai rien à y ajouter)
Je pense qu’on peut abandonner pour l’instant l’ambition d’avoir une librairie réutilisable telle quelle par d’autres projets. J’avais sous-estimé la spécificité des besoins de NGC ; j’ai préféré réduire les possibilités de réutilisation plutôt que d’ajouter de multiples niveaux d’abstractions.
pristineEngine est une shallow copie de engine, donc plus efficient pour le besoin.
À cause de l’ambition du début d’avoir une librairie réutilisable. Ça n’a plus forcément beaucoup de sens aujourd’hui.
Axios est utilisé côté client (conjugué à React Query). Fetch côté serveur
Pour avoir la même config que Vercel |
On s'organise comment pour les points sur lesquels ont est d'accord ?
On parle de quoi en terme de gains de perfs ? Afin de comparer avec la complexité que ça ajoute.
Ce n'est pas possible d'utiliser l'un ou l'autre à la fois côté serveur et client ? |
Code review - publicodes-state
J’avais en tête quelque chose du style https://publi.codes/docs/api/react-ui qui permettrait d’avoir un composant React
PublicodesForm
au quel on fournit un moteur et/ou un ensemble de règles et qui créer un formulaire à partir de celles-ci, mettant à jour une situation en fonction des réponses de l’utilisateur-ice. La gestion du state global de l’app serait alors laissée à l’utilisateur.ice — qui comprendrait dans le cas de NGC toute la gestion des users, actions, etc…En l’état actuel, c’est un ensemble de hooks autour d’un state React. Ce qui est très bien pour isoler la logique métier, mais qui je pense est trop complexe et spécifique à NGC pour en faire une lib standalone.
Remarques
Contenu
🔴 La gestion de l’utilisateur est spécifique à NGC et ne devrait pas faire partie de
publicodes-state
.🔴 A plusieurs endroits sont utilisés des noms de règle hardcodés du modèle NGC (ex.
bilan
etservices sociétaux
).🟠 ❓ Entre
useDisposableEngine
etuseEngine
qui retourne deux moteurs différents, il est un peu compliqué de si retrouver et de savoir lequel utiliser. En particulier, pour lepristineEngine
qui est utilisé à un seul endroit. Pourquoi ne pas utiliseruseDisposableEngine
avec une situation vide ?🟠 Les actions sont pour l’instant assez spécifique à NGC donc je m’interroge sur la pertinence de garder
useActions
danspublicodes-state
.🟠 Un peu de doc pour dans chaque fichiers
index
ne serait pas de trop. De préférence au format tsdoc, ce qui permettrait de générer automatiquement une documentation de l’API facilement utilisable par d’autre dev.Tech/TS
🔴 Le fichier
types.d.ts
mélange tous les types, là où il serait préférable de séparer ce qui concerne la gestion des simulations/users des types relatifs au modèle Publicodes.🔴 ❓ De plus il y a une perte d’information par rapport au fichier
publicodesUtils
, dans lequel j’avais fais l’effort de rédiger un minimum de documentation et pourquoi les types ne sont pas réutilisés ?🔴
any
aliases (ex.Formule
etRules
danstypes.d.ts
)🟠 Chaque function possède un type
Props
pour ses arguments ce qui est vraiment bien 👍. En revanche, très peu possède un type de retour, ce qui est dommage 😕🟠 ❓ Pourquoi ne pas utiliser la format d’import
@/...
comme pour le reste de l’app ?🟠 Plusieurs fonctions possèdent le même nom ce qui rend complique la manipulation du code, comme par exemple
useRules
.🟡 Utiliser
root: string
n’est pas forcément très parlant,rootRule: string
ouroot: RuleName
serait déjà plus clair je trouve.Général
🔴 Plusieurs casts passant par
unknown
🔴 Problème de l'utilisation de
useRule
dans le composantChoicesValue
. Par exemple, on obtient l'erreur suivante à la page/simulateur/bilan
:Le problème vient d'ici :
nosgestesclimat-site-nextjs/src/components/misc/ChoicesValue.tsx
Line 9 in c676e90
🟠 L’utilisation de yarn 3 est forcée, cependant, le
yarn.lock
ne fonctionne plus une fois regénéré🟠 ❓ Pourquoi utilise-t-on à la fois
axios
etfetch
?🟠 Ce pattern apparait plusieurs fois dans le code, il pourrait être factorisé dans un fonction avec un nom explicite :
nosgestesclimat-site-nextjs/src/app/(layout-with-navigation)/stats/_components/content/IframeFigures.js
Lines 60 to 62 in c676e90
🟡 34 erreurs du type
error TS2786: 'XXXX' cannot be used as a JSX component
🟡 ❓ Il y a-t-il une raison particulière pour forcer l’utilisation de Node 18 ?
🟡 Ce serait top de garder quelques
console.debug
pour pouvoir savoir combien de règles sont chargées, quand, le temps que ça a pris etc...Questions
Tech/TS
Trans
danspublicodes-state
? Je ne pense pas, et en tel cas, leuseForm/index.ts
n’a peut-être pas sa place danspublicodes-state
.Changelog
NGCQuestionType
(+ useswitch
statement instead ofif-then-else
)