3.3Programmation orientée objet (classes) en WLangage
Le WLangage supporte la PROGRAMMATION ORIENTÉE OBJET (POO), une façon d'organiser le code autour d'OBJETS qui regroupent des DONNÉES et les TRAITEMENTS qui les concernent. Les notions fondamentales. (1) La CLASSE : le MODÈLE, le plan de construction (la classe Client décrit ce qu'est un client et ce qu'on peut faire avec). (2) L'OBJET (ou instance) : un exemplaire concret créé à partir de la classe (LE client Dupont). (3) Les MEMBRES (ou attributs) : les données de l'objet (nom, adresse, solde). (4) Les MÉTHODES : les procédures de la classe, qui agissent sur ces données (CalculeSolde, EstSolvable). (5) Le CONSTRUCTEUR : la méthode appelée automatiquement à la création de l'objet (pour l'initialiser).
Les PRINCIPES qui font l'intérêt de la POO. (1) L'ENCAPSULATION : regrouper données et traitements, et PROTÉGER l'accès direct aux données (membres privés) pour forcer le passage par des méthodes. On garantit ainsi que les règles sont respectées (impossible de mettre un solde incohérent). (2) L'HÉRITAGE : créer une classe à partir d'une autre en récupérant ses caractéristiques et en les spécialisant (ClientParticulier et ClientEntreprise héritent de Client). Cela évite de dupliquer le code commun. (3) Le POLYMORPHISME : appeler la même méthode sur des objets différents, chacun réagissant à sa façon. Quand la POO est-elle UTILE en WinDev ? Pour les applications COMPLEXES, les règles métier riches, le code destiné à être RÉUTILISÉ (composants), le travail en équipe. Mais elle n'est PAS OBLIGATOIRE : une application de gestion classique se développe très bien en procédural avec des procédures bien organisées. Le pragmatisme prime : utilisez la POO là où elle apporte de la CLARTÉ, pas par principe.
Vocabulaire de la section
- Classe et objet
- La CLASSE est le MODÈLE (le plan : ce qu'est un client et ce qu'on peut en faire) ; l'OBJET (ou instance) est un exemplaire concret créé à partir d'elle (LE client Dupont).
- Membres et méthodes
- Les MEMBRES (attributs) sont les données de l'objet (nom, solde) ; les MÉTHODES sont les procédures de la classe qui agissent sur ces données (CalculeSolde, EstSolvable).
- Encapsulation
- Regrouper données et traitements, et PROTÉGER l'accès direct aux données (membres privés) pour forcer le passage par des méthodes — garantissant que les règles sont respectées.
- Héritage
- Créer une classe à partir d'une autre en récupérant ses caractéristiques et en les spécialisant (ClientParticulier hérite de Client). Évite de dupliquer le code commun.
- POO : utile mais pas obligatoire
- La POO brille sur les applications COMPLEXES, les règles métier riches, le code réutilisable et le travail en équipe. Une application de gestion classique se développe très bien en procédural bien organisé.
La POO est-elle obligatoire dans un projet WinDev de gestion ?
En pratique — Créer et utiliser une classe
- Créez une CLASSE représentant un concept métier (Client, Commande) avec ses MEMBRES (les données) et ses MÉTHODES (les traitements associés).
- Ajoutez un CONSTRUCTEUR pour initialiser l'objet à sa création, et protégez les membres sensibles (encapsulation) en forçant le passage par des méthodes.
- Instanciez un OBJET à partir de la classe et appelez ses méthodes ; observez que données et traitements voyagent ensemble.
- Si plusieurs variantes partagent un socle commun, utilisez l'HÉRITAGE (ClientParticulier / ClientEntreprise) plutôt que de dupliquer le code.
Points clés à retenir
- La POO organise le code autour d'OBJETS regroupant DONNÉES et TRAITEMENTS : la CLASSE est le modèle, l'OBJET l'exemplaire concret, les MEMBRES sont les données, les MÉTHODES les traitements, le CONSTRUCTEUR initialise à la création.
- Trois principes : ENCAPSULATION (regrouper et PROTÉGER les données pour garantir le respect des règles), HÉRITAGE (spécialiser une classe existante sans dupliquer le code commun), POLYMORPHISME (même appel, comportements différents selon l'objet).
- La POO est UTILE pour : applications COMPLEXES, règles métier riches, code destiné à être RÉUTILISÉ (composants), travail en ÉQUIPE.
- Elle n'est PAS OBLIGATOIRE en WinDev : une application de gestion classique se développe très bien en procédural avec des procédures bien organisées. PRAGMATISME : utilisez la POO là où elle apporte de la CLARTÉ, jamais par principe.
Questions fréquentes
Faut-il utiliser la POO dans un projet WinDev de gestion classique ?
Pas forcément : une application de gestion classique se développe très bien en PROCÉDURAL structuré (procédures bien organisées en collections). La POO devient intéressante quand la complexité, la réutilisation ou le travail en équipe le justifient — c'est un outil, pas une obligation. Pourquoi le procédural suffit souvent : (1) La nature du travail : une application de gestion consiste largement à saisir, contrôler, enregistrer, rechercher et imprimer des données. Le modèle de données est déjà porté par l'ANALYSE, et les fonctions HFSQL manipulent directement les enregistrements. La couche objet n'apporte pas toujours grand-chose par-dessus. (2) Le RAD et l'atelier sont conçus autour de ce fonctionnement : fenêtres, champs liés, événements, requêtes, états. Vouloir tout « objectiser » peut aller à contre-courant de l'outil. (3) SIMPLICITÉ : des procédures bien nommées, regroupées par thème dans des collections, suffisent à obtenir un code clair, réutilisable et maintenable. C'est déjà 80 % du bénéfice recherché. (4) Équipe et compétences : si l'équipe n'est pas à l'aise avec la POO, l'introduire à moitié produit un code hybride plus confus que du procédural propre. Quand la POO apporte vraiment quelque chose : (1) Règles métier RICHES et complexes : quand un concept (une commande, un contrat, un calcul tarifaire) porte de nombreuses règles, les regrouper avec ses données dans une classe donne un code plus cohérent et plus sûr. (2) ENCAPSULATION nécessaire : quand il est vital que personne ne puisse modifier une donnée sans passer par les contrôles (un solde, un statut de document). (3) VARIANTES d'un même concept : plusieurs types de clients, de tarifs, de documents partageant un socle commun avec des différences — l'héritage évite alors une cascade de conditions dupliquées. (4) COMPOSANTS RÉUTILISABLES destinés à plusieurs projets : la POO facilite une interface propre et stable. (5) Gros projets en ÉQUIPE : la structuration en classes aide à répartir le travail et à limiter les interférences. (6) Tests automatiques : les classes bien conçues se testent souvent plus facilement. Le vrai enjeu (au-delà de la POO) : (1) Ce qui compte d'abord, c'est la SÉPARATION des responsabilités : ne pas mettre le métier dans les boutons, éviter la duplication, nommer clairement, découper. Ces principes s'appliquent AUSSI en procédural. (2) Un code procédural bien structuré vaut infiniment mieux qu'une POO mal comprise. (3) L'inverse est vrai aussi : de la POO bien utilisée sur un domaine complexe est un vrai gain. La bonne approche (pragmatique) : (1) Commencez par bien structurer en procédures (collections par thème). (2) Introduisez la POO là où elle apporte de la clarté : un concept métier riche, un composant réutilisable, une famille de variantes. (3) N'objectivez pas par principe : créer une classe qui ne fait que recopier les rubriques d'un fichier sans logique ajoutée est du travail pour rien. (4) Restez COHÉRENT et documentez les choix, surtout en équipe. En résumé : NON, la POO n'est pas nécessaire dans un projet WinDev de gestion classique — un code PROCÉDURAL bien structuré (procédures nommées, regroupées par thème en collections, sans duplication, avec le métier séparé de l'interface) répond à l'essentiel du besoin, et c'est d'ailleurs la façon dont l'atelier est pensé, l'ANALYSE portant déjà le modèle de données et les fonctions HFSQL manipulant directement les enregistrements. La POO devient réellement payante dans des cas précis : règles métier RICHES autour d'un concept (commande, contrat, tarification), besoin d'ENCAPSULATION pour garantir qu'aucune donnée sensible ne soit modifiée hors des contrôles, VARIANTES d'un même concept partageant un socle commun (l'héritage évitant des cascades de conditions dupliquées), COMPOSANTS réutilisables entre projets, gros développements en ÉQUIPE et tests automatiques. Retenez surtout que l'enjeu véritable n'est pas « POO ou pas » mais la SÉPARATION DES RESPONSABILITÉS — principes valables dans les deux paradigmes. Un procédural propre bat toujours une POO mal comprise. Soyez donc pragmatique : structurez d'abord en procédures, introduisez des classes là où elles clarifient réellement, et ne créez jamais une classe qui se contente de recopier des rubriques sans logique ajoutée.
Quelle différence entre une classe et une structure, et laquelle choisir ?
La STRUCTURE regroupe seulement des DONNÉES (un conteneur d'informations liées) ; la CLASSE regroupe des données ET des TRAITEMENTS (méthodes), avec encapsulation et héritage. Choisissez la structure pour transporter des informations, la classe quand il y a du COMPORTEMENT. La STRUCTURE : (1) C'est un CONTENEUR de données : vous définissez un type regroupant plusieurs informations liées (une structure Adresse avec rue, complément, code postal, ville, pays). (2) Avantages : simple, légère, immédiate à comprendre. Elle remplace avantageusement une poignée de variables séparées ou une liste de paramètres interminable. (3) Usages typiques : passer un ensemble cohérent d'informations à une procédure, représenter une ligne lue dans un fichier importé, structurer un résultat de calcul, transporter des paramètres. (4) Limite : aucun comportement associé, aucune protection des données — tout est accessible directement. La CLASSE : (1) Données + TRAITEMENTS : en plus des membres, elle possède des MÉTHODES qui agissent sur ces données. Le comportement voyage avec l'information. (2) ENCAPSULATION : on peut rendre des membres privés et n'exposer que des méthodes contrôlées, garantissant que les règles sont toujours respectées (impossible d'affecter directement un solde ou un statut incohérent). (3) HÉRITAGE et POLYMORPHISME : possibilité de spécialiser (ClientParticulier / ClientEntreprise) sans dupliquer le socle commun. (4) Constructeur pour garantir une initialisation correcte. (5) Limite : plus lourde à mettre en place ; inutile si l'objet ne fait rien d'autre que porter des données. Comment choisir : (1) « J'ai juste besoin de regrouper des informations » → STRUCTURE. C'est le cas le plus fréquent, et le plus simple est le meilleur. (2) « Ces données ont des RÈGLES et des comportements propres » (calculs, contrôles, changements d'état) → CLASSE. (3) « Je dois GARANTIR que personne ne modifie ces données n'importe comment » → CLASSE (encapsulation). (4) « J'ai plusieurs VARIANTES d'un même concept » → CLASSE (héritage). (5) « Je transporte des paramètres ou un résultat » → STRUCTURE. (6) Dans le doute, commencez par une STRUCTURE : vous pourrez toujours évoluer si le besoin de comportement apparaît. Ne partez pas d'une classe « au cas où ». Le rapport avec les fichiers de l'analyse : (1) Attention à ne pas dupliquer inutilement : les rubriques d'un fichier HFSQL sont déjà accessibles directement, et WinDev offre des mécanismes efficaces (champs liés, ÉcranVersFichier). (2) Créer une classe qui ne fait que recopier les rubriques d'un fichier, sans logique ajoutée, apporte peu et coûte du travail. (3) En revanche, une classe qui porte les RÈGLES MÉTIER autour d'un concept (calcul du total d'une commande avec remises, contrôles de validité, transitions d'état) apporte une vraie valeur. En résumé : la STRUCTURE est un simple CONTENEUR de données — elle regroupe des informations liées sous un même nom (une adresse, une ligne importée, un jeu de paramètres, un résultat de calcul), ce qui rend le code bien plus lisible que des variables éparses ou des listes de paramètres à rallonge, mais elle n'offre ni comportement ni protection. La CLASSE ajoute les TRAITEMENTS (méthodes agissant sur ses propres données), l'ENCAPSULATION (membres privés et accès contrôlés, garantissant qu'aucune règle ne peut être contournée), l'HÉRITAGE (spécialiser sans dupliquer) et un CONSTRUCTEUR (initialisation correcte garantie). Le critère de choix est donc la présence de COMPORTEMENT : s'il s'agit seulement de transporter ou regrouper des informations, prenez une structure ; s'il existe des règles, des calculs, des contrôles ou des états à protéger, ou plusieurs variantes d'un même concept, prenez une classe. Dans le doute, commencez simple avec une structure et faites évoluer si nécessaire. Enfin, gardez à l'esprit la spécificité WinDev : les rubriques de l'analyse sont déjà directement accessibles, et créer une classe qui se contente de les recopier n'apporte rien — la valeur d'une classe vient des règles métier qu'elle porte.