klee-contrib / topmodel

Outil de modélisation et générateurs pour divers langages
https://klee-contrib.github.io/topmodel/#/
MIT License
9 stars 9 forks source link

Clarification utilisation de `values` et enums explicites #212

Closed JabX closed 1 year ago

JabX commented 1 year ago

Fix #206

Cette PR retire les restrictions d'utilisation de values pour qu'elles soient utilisables pour toutes les classes. En particulier, il n'y a plus besoin de clé d'unicité et on peut en renseigner pour une clé primaire composite.

Désormais, topmodel connaît officiellement la notion d'enum (ce n'est pas une nouvelle notion mais elle était totalement implicite avant). Une enum est une classe avec une clé primaire non composite (ou sans clé primaire si on ne veut pas qu'elle soit persistée) dont les values sont exhaustives, c'est-à-dire qu'elles contiennent l'ensemble des instances possibles de cette classe. Il faut donc au moins une value pour être une enum. topmodel considère par défaut qu'une telle classe est une enum si le domaine de la clé primaire (ou la propriété qui la remplace, soit la première propriété non composée de la classe) précise que ses valeurs ne sont pas auto-générées (autoGeneratedValue: false, ce qui est le défaut). C'était déjà le comportement actuel avant cette PR (sans nommer ça "enum"), mais il est maintenant possible de surcharger cette catégorisation en renseignant enum: true | false sur la classe. enum: true n'est évidemment possible que si la classe peut effectivement être une enum.

Dans la génération, l'impact de la catégorisation en enum se verra sur la clé primaire, qui pourra être générée comme une vraie enum (C#/Java si possible/configuré), comme une union des valeurs possibles (JS), ou bien simplement comme son type avec une liste de constantes à côté (fallback C#/Java). La aussi, c'est tout à fait ce que topmodel faisait déjà avant cette PR.

La notion d'enum n'a rien à voir avec le notion de reference. reference indique que la classe est une "liste de référence", ce qui une indication pour les générateurs afin qu'ils puissent décider d'ajouter des indications pour de la mise en cache des valeurs. En particulier, une reference peut être une enum, ou non, et une reference peut avoir des values, ou non.

Impacts sur la génération