Lecture juridique
Un texte juridique ne vaut pas seulement par ses mots : il possède une autorité, une version, un champ d'application et des relations avec d'autres textes. Il en va de même pour un langage métier. Une liste de classes ne suffit pas ; il faut pouvoir dire qu'un concept est une entité, qu'une relation est obligatoire et qu'un invariant doit rester vrai.
dsl.dsl donne un nom à ces formes. Il ne connaît ni Employee ni Appeal. Il connaît Aggregate, Entity, ValueObject, Enum, Property, Relationship, Invariant et Projection.
Lecture architecture
Le fichier M2 est compatible YAML mais possède une sémantique plus stricte :
language:
id: Dsl
version: 1.0.0
level: M2
kind: meta-language
concepts:
Language:
kind: aggregate
relationships:
modules: { target: Module, cardinality: one-or-more, containment: true }language:
id: Dsl
version: 1.0.0
level: M2
kind: meta-language
concepts:
Language:
kind: aggregate
relationships:
modules: { target: Module, cardinality: one-or-more, containment: true }Le YAML ne sait pas ce qu'est un aggregate. Le compilateur, lui, vérifie l'identité du langage, les types de propriétés, les cibles de relations et les cardinalités autorisées.
Pourquoi l'Aggregate Root est Language
Une modification isolée de Property n'a pas de sens sans langage propriétaire. C'est Language qui garantit l'unicité des concepts, la cohérence de version et la résolution des imports. Les concepts internes restent modifiables seulement par cette frontière.
Le fichier complet est disponible dans assets/examples/dsl.dsl. Le test M2_bootstrap_describes_itself empêche la suppression silencieuse d'une primitive nécessaire à l'auto-description.
Diagnostics attendus
| Code | Sens |
|---|---|
DSL001 |
import absent |
DSL002 |
type ou cible inconnue |
DSL004 |
cardinalité invalide |
DSL005 |
cycle d'héritage |
DSL007 |
niveau M0/M1/M2 incohérent |
DSL008 |
primitive M2 nécessaire au bootstrap absente |
DSL010 |
intervalle temporel incohérent |
DSL011 |
valeur absente de l'enum métier ciblé |
Le chapitre suivant utilise ce vocabulaire pour composer Citizen et French Labor.