Création d'une classe persistée
Déclaration de la classe sans propriétés
Commençons par créer une classe Utilisateur, qui représenterait les utilisateurs de notre application. Cette classe peut être organisée dans un module, ici ce sera Users.
Dans TopModel, le modèle est décrit dans des fichiers au format yaml, mais avec l'extension .tmd. Ce format est pris en charge par VSCode et l'extension TopModel. La classe proposée sera représentée de la manière suivante dans un fichier "Utilisateur.tmd" que l'on créera :
---
module: Users # Module commun de toutes classes du fichier
---
class:
name: Utilisateur # Nom de la classe
comment: Utilisateur de l'application # Commentaire associé à la classe (il est obligatoire)
Nous avons donc déclaré notre classe Utilisateur, dans le module Users, et nous lui avons associé un commentaire.
Si vous utilisez l'extension TopModel, vous devriez avoir une erreur due à l'absence de l'attribut
tagsdans les en-têtes. Nous n'évoquerons lestagsque dans la partieGénérer du codede ce tutoriel. En attendant, vous pouvez ajoutertags: []dans toutes les en-têtes des fichiers que nous allons créer. De plus, vous devriez avoir une erreur sur le champ "class". Cela est dû à l'absence du champ propriété qui est obligatoire pour toute classe que l'on crée. Ce point est traité dans la section suivante.
Déclaration des propriétés
Nous souhaitons maintenant ajouter à notre classe Utilisateur des propriétés. Tout d'abord, notre classe Utilisateur doit pouvoir être sauvegardée dans une base de données, c'est pourquoi nous lui ajoutons un identifiant unique.
| Propriété | Description |
|---|---|
| Id | Identifiant unique de l'utilisateur |
A cette propriété, nous souhaitons associer un domaine. Il s'agit du type théorique de la propriété, qui sera par la suite décliné dans les différents langages utilisés ( ex : java - Long, TypeScript - number etc).
Ajoutons donc un identifiant à la classe Utilisateur
---
module: Users # Module commun de toutes classes du fichier
tags: []
---
class:
name: Utilisateur # Nom de la classe
comment: Utilisateur de l'application # Commentaire associé à la classe (il est obligatoire)
properties:
- name: Id # Nom de la propriété
comment: Identifiant unique de l'utilisateur # Commentaire associé à la propriété (il est obligatoire)
primaryKey: true # Indique qu'il s'agit de la clé primaire de la classe
domain: DO_ID # Type théorique de la propriété. Il sera décliné dans différents langages par la suite
Déclaration du domaine
Le domaine représente le type théorique de la propriété, à décliner dans les différents langages utilisés pour la génération. Ici, nous allons prendre un exemple en Java, Typescript (TS) et SQL. Créons donc un fichier "Domains.tmd" où nous définirons tous nos domaines.
---
module: Users # Module obligatoire, bien qu'inutile dans le cas des domaines
tags: # tags obligatoires, bien qu'inutiles dans le cas des domaines
- ""
---
domain:
name: DO_ID # Nom du domaine utilisé dans la définition des propriétés
label: ID technique # Description du domaine
ts:
type: number # Type TS à utiliser pour ce domaine
java:
type: long # Type Java à utiliser pour ce domaine
sql:
type: int8
Selon le langage, vous pourrez améliorer la définition des domaines pour les personnaliser totalement à vos besoins. Ci dessous quelques exemples avec lesquels nous compléterons notre fichier "Domains.tmd" précédemment créé :
---
domain:
name: DO_DATE
label: Date
ts:
type: string
java:
type: LocalDate
imports:
- java.time.LocalDate # Imports nécessaires au bon fonctionnement de la classe Java
sql:
type: timestamp
---
domain:
name: DO_EMAIL
label: Email
length: 50 # Taille maximum de la chaine de caractères représentée par ce domaine
ts:
type: string
java:
type: String
sql:
type: varchar
---
domain:
name: DO_CODE
label: Code
length: 3
ts:
type: string
java:
type: String
sql:
type: varchar
---
domain:
name: DO_LIBELLE
label: Libellé
length: 15
ts:
type: string
java:
type: String
sql:
type: varchar
Exemple de propriétés
Ajoutons maintenant quelques propriétés à la classe utilisateur, qui nous servirons par la suite : un nom, une date d'inscription, et une adresse mail. Nous pouvons compléter ces propriétés avec des informations facultatives. Les plus communes :
required: Indique que la propriété est obligatoirelabel: Libellé d'affichage de la propriété
Notre fichier "Utilisateur.tmd" devrait donc ressembler à ça :
---
module: Users # Module commun de toutes classes du fichier
tags: []
---
class:
name: Utilisateur
comment: Utilisateur de l'application
properties:
- name: Id
comment: Identifiant unique de l'utilisateur
primaryKey: true
domain: DO_ID
- name: Email
comment: Adresse mail de l'utilisateur
domain: DO_EMAIL
required: true # Indique que la propriété Email est obligatoire dans le modèle de données
label: Adresse mail # Libelle d'affichage de la propriété
- name: Nom
comment: Nom de l'utilisateur
domain: DO_LIBELLE
label: Nom # Libelle d'affichage de la propriété
- name: DateInscription
comment: Date d'inscription
domain: DO_DATE
label: Inscrit depuis le # Libelle d'affichage de la propriété
Nous avons donc créé une classe Utilisateur dans le module Users contenant quatre propriétés.
Aller plus loin dans la documentation complète de classes
Répertoire Projet
A ce stade du tutoriel, notre répertoire "Projet" devrait contenir les fichiers suivants:
- Projet
- topmodel.config
- Utilisateur.tmd
- Domains.tmd
Exemple de code généré
- Java
- C#
- SQL
package tuto.entities.users;
/**
* Utilisateur de l'application.
*/
@Generated("TopModel : https://github.com/klee-contrib/topmodel")
@Entity
@Table(name = "UTILISATEUR")
public class Utilisateur {
/**
* Identifiant unique de l'utilisateur.
*/
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@Column(name = "ID", nullable = false, columnDefinition = "int")
private Integer id;
/**
* Adresse mail de l'utilisateur.
*/
@Column(name = "EMAIL", nullable = false, length = 50, columnDefinition = "varchar")
private String email;
/**
* Nom de l'utilisateur.
*/
@Column(name = "NOM", length = 100, columnDefinition = "varchar")
private String nom;
/**
* Date d'inscription.
*/
@Column(name = "DATE_INSCRIPTION", columnDefinition = "date")
private LocalDate dateInscription;
// Getters and Setters
}
namespace Tuto.Clients.Db.Models.Users;
/// <summary>
/// Utilisateur de l'application.
/// </summary>
[Table("utilisateur")]
public partial record Utilisateur
{
/// <summary>
/// Identifiant unique de l'utilisateur.
/// </summary>
[Column("id")]
[Domain(Domains.Id)]
[Key]
public int? Id { get; set; }
/// <summary>
/// Adresse mail de l'utilisateur.
/// </summary>
[Column("email")]
[Required]
[Domain(Domains.Email)]
[StringLength(50)]
public string Email { get; set; }
/// <summary>
/// Nom de l'utilisateur.
/// </summary>
[Column("nom")]
[Domain(Domains.Libelle)]
[StringLength(100)]
public string Nom { get; set; }
/// <summary>
/// Date d'inscription.
/// </summary>
[Column("date_inscription")]
[Domain(Domains.Date)]
public DateOnly? DateInscription { get; set; }
}
/**
* Création de la table UTILISATEUR
**/
create table UTILISATEUR (
ID int not null,
EMAIL varchar(50) not null,
NOM varchar(100),
DATE_INSCRIPTION date,
constraint PK_UTILISATEUR primary key (ID)
);
/**
* Création de la séquence pour la clé primaire de la table UTILISATEUR
**/
create sequence SEQ_UTILISATEUR as INT start 1000 increment 50 owned by UTILISATEUR.ID;