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 :

BesoinAPI
lire depuis une pageuseQuery
modifier depuis une pageuseCommand
gérer un formulaireuseFormFor
appeler depuis le serveurinvoke
valider une entréeEntity.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.

Construit avec Fougere — ce site tourne sur le framework qu'il documente.