Le chemin le plus court
Lorsqu'une tâche est urgente, le chemin le plus simple finit généralement par être utilisé. Fougere cherche donc à rendre le chemin conventionnel plus court que son contournement.
Cette page décrit un principe de conception et l'outillage associé. fougere graph est
disponible aujourd'hui. Les contrôles de graphe en CI et le catalogue de refus présentés
plus bas sont encore à l'étude.
Une API par besoin courant
Les opérations courantes ont une API recommandée :
| Besoin | API |
|---|---|
| lire depuis une page | useQuery |
| modifier depuis une page | useCommand |
| gérer un formulaire | useFormFor |
| appeler depuis le serveur | invoke |
| valider une entrée | Entity.validate |
Ces API partagent la même désignation par entité et opération. Elles transmettent aussi le contexte attendu par les collectors et normalisent les erreurs. Un appel assemblé à la main doit prendre ces responsabilités en charge explicitement.
Comment une codebase dérive
Une dérive architecturale vient souvent de corrections locales raisonnables : une règle ajoutée dans un formulaire, puis dans une route, puis dans un adapter. Chaque modification résout son problème immédiat, mais la règle n'a plus de propriétaire unique.
La convention de Fougere place les règles de champ dans les entités et les règles métier dans les opérations. Elle ne garantit pas que le modèle est correct, mais elle donne un emplacement commun aux éléments qui doivent évoluer ensemble.
Lire le graphe
Le scanner connaît les Fronds, leurs entités et leurs références. La commande suivante affiche ces relations :
fougere graph
Post -> Author, Category (2 incoming)
Author
Ce graphe peut être lu selon trois dimensions :
- couplage : nombre de relations attachées à une entité ;
- duplication : endroits où une même règle est déclarée ;
- propriété : domaine responsable d'une règle ou d'une donnée.
La commande actuelle expose les relations et propose des regroupements au-delà de six entités. Elle ne mesure pas encore automatiquement la duplication ou la propriété. Une présentation des écarts de graphe dans les pull requests reste une piste pour la CI.
Des erreurs qui indiquent une solution
Un garde-fou utile doit préciser l'usage détecté, le risque et l'API recommandée. La forme
suivante illustre le catalogue envisagé ; defineRefusal n'est pas une API livrée :
defineRefusal({
id: 'F-042',
detect: (site) => isHandRolledCallToFrond(site),
message: (site) => dedent`
Appel assemblé à la main vers la Frond ${site.frond}.
Cet appel ne transmet pas automatiquement l'identité et la locale.
-> invoke('${site.suggestion}')
`,
origin: 'incident : contexte oublié dans plusieurs routes',
});
Ces erreurs de build seraient distinctes des erreurs métier renvoyées au runtime.
Limite
Fougere peut vérifier la structure d'une déclaration, pas sa pertinence métier. Une règle incorrecte reste incorrecte même lorsqu'elle est déclarée une seule fois. Le choix des concepts et de leurs frontières reste une décision de conception.
Suite : Les entités.