Demander un devis

Blog · Architecture

WLangage vers TypeScript ou C# : pourquoi traduire ligne à ligne ne suffit pas

Publié le 27 octobre 2026 · Version longue d’un post de la page LinkedIn de WinExit

Dans une application WINDEV®, le code de clic d’un bouton mélange tout : l’interface, la règle métier et l’accès aux données. Le traduire tel quel dans un autre langage reproduit le problème. La migration est l’occasion de séparer les couches.

Avant : tout est dans le bouton

Voici le code de clic d’un bouton « Valider » dans une fenêtre de saisie de commande. Exemple simplifié, écrit par notre équipe, mais représentatif de ce que l’on trouve dans les projets de quinze ou vingt ans.

WLangage : BTN_Valider, code de clic

// Interface, règles métier et accès HFSQL® au même endroit
SI SAI_Quantité = 0 ALORS
    Erreur("Quantité obligatoire") ; RETOUR      // interface
FIN
HLitRecherchePremier(CLIENT, IDClient, COMBO_Client)   // données
SI CLIENT.Encours + SAI_Montant > CLIENT.Plafond ALORS  // règle
    Info("Plafond dépassé") ; RETOUR             // interface
FIN
SI CLIENT.Catégorie = "GC" ALORS
    COMMANDE.Remise = 5                          // règle
FIN
HAjoute(COMMANDE)                                // données
TableAffiche(TABLE_Commandes)                    // interface

Trois règles métier (quantité obligatoire, plafond d’encours, remise grand compte) sont enfouies dans un événement d’interface. Elles ne sont écrites nulle part ailleurs. Si la même commande peut être saisie depuis une autre fenêtre, les règles y sont recopiées, avec le risque qu’une copie diverge.

Ce que donnerait une traduction ligne à ligne

Un outil de conversion mécanique produirait un gestionnaire de clic en TypeScript ou en C# qui fait exactement la même chose : lire la base, tester, afficher, écrire. Le code compile, mais rien n’a changé :

Après : une architecture découplée

TypeScript : les règles métier, sans écran ni base

export function verifierPlafond(client: Client, montant: number): void {
  if (client.encours + montant > client.plafond) {
    throw new RegleMetier('Plafond dépassé');
  }
}

export function calculerRemise(client: Client): number {
  return client.categorie === 'GC' ? 5 : 0;
}

TypeScript : le service appelé par l’API

export async function creerCommande(cmd: NouvelleCommande): Promise<Commande> {
  if (cmd.quantite <= 0) throw new RegleMetier('Quantité obligatoire');
  const client = await clients.lire(cmd.clientId);
  verifierPlafond(client, cmd.montant);
  return commandes.ajouter({ ...cmd, remise: calculerRemise(client) });
}

Le même découpage s’écrit en C# avec ASP.NET Core : voir notre page vers C# / .NET, ou vers React / Node.js.

Ce que ça change pour vous

L’IA pour accélérer, des développeurs seniors pour relire

Séparer les couches demande de comprendre ce que fait chaque ligne. L’IA traduit et propose le découpage ; nos développeurs seniors valident l’architecture, relisent chaque module et contrôlent les règles critiques.

Pour juger sur pièce, commencez petit : une preuve de concept sur une ou deux vues, de 2 000 à 3 000 € HT, déduite de la migration si vous la validez sous 30 jours.

Estimer ma migration en 2 minutes Demander mon devis gratuit

Autres articles : Migrer sans tout casser · Rester en WINDEV 2025 : un sursis · Le carnet de recette · Éditeurs : la redevance et votre marge. Tous nos articles sont sur le blog ; les versions courtes, sur LinkedIn.