IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Comportement bizarre avec une méthode de classe


Sujet :

WinDev

  1. #1
    Nouveau membre du Club Avatar de chenevierebooks
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    décembre 2017
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 51
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeuse informatique

    Informations forums :
    Inscription : décembre 2017
    Messages : 36
    Points : 26
    Points
    26
    Par défaut Comportement bizarre avec une méthode de classe
    Bonjour à tous et à toutes,

    J'ai commencé a travailler sur la partie connectivité d'une application qui devra se connecter a HFSQL et MySQL.
    Pour le faire, j'ai créé une classe qui gère les connexion aux bases : je rempli les infos de connexion et lance une méthode "Connexion" que j'utilise de cette façon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
    SELON sType
     
    	CAS "HFSQL"
    		clConnexion.p_stServeurCS.sTypeConnexion	= "HFSQL"
    		clConnexion.p_stServeurCS.sServeur ="tulipe"
    		clConnexion.p_stServeurCS.nPort = 4900
    		clConnexion.p_stServeurCS.sUtilisateur = "Celine"
    		clConnexion.p_stServeurCS.sMotDePasse = "Test"
    		clConnexion.p_stServeurCS.sBase = "Articles"
     
    		clConnexion.ConnexionCS()
     
    	CAS "MYSQL" :
     
             ...
     
    FIN
    La méthode connexion est très simple, ce qui se passe c'est que, si je lance Windev et si je fais un GO, ça ne fonctionne pas. Si je mets un point d'arrêt et que j’avance en pas à pas détaillé, l'exécution ne rentre pas dans la méthode clConnexion.ConnexionCS(), il n'y a pas d'erreur, l'exécution se termine et la connexion n'est pas faite. C'est la même chose en mode test ou avec l'exe généré
    Si je quitte Windev et que je relance le projet, ça fonctionne parfaitement. En HFSQL , en MySQL, cela fonctionne aussi bien en mode test qu'en mode exe compilé. Si je trace le code en pas à pas détaillé, je rentre bien dans la fonction et ça ne m'embête plus jusqu'au lendemain. C'est systématique lors du premier lancement du projet. La méthode connexion ne fais rien d'autre qu'un HCChangeConnexion() et HChangeRep()
    J'ai ce comportement sur deux ordinateurs différents avec un Windev 23 installé, c'est vraiment curieux je n'arrive pas à comprendre ce qui cloche.

  2. #2
    Expert confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    juin 2017
    Messages
    2 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : juin 2017
    Messages : 2 428
    Points : 4 439
    Points
    4 439
    Par défaut
    Bonjour,
    Je suppose que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    clConnexion.p_stServeurCS.sTypeConnexion	= "HFSQL"
    est transformé dans connexionCS en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MaConnexion.Provider = hAccèsHFClientServeur
    Par ailleurs, lorsque tu écris
    il n'y a pas d'erreur,
    Comment les interceptes tu ?
    Il y a peut être plus simple, mais ça tourne

  3. #3
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    juin 2003
    Messages
    4 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2003
    Messages : 4 656
    Points : 8 054
    Points
    8 054
    Par défaut
    Bonjour,

    Je vais encore passer pour le vieux schnok mais pourquoi utiliser une classe ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //Dans le code du projet
    gpcnxHFCS, gpcnxMySQL sont des connexions
    // Renseignement des infos de connexion HFCS
    gpcnxHFCS.Provider = hAccèsHFClientServeur
    [...]
    SI PAS houvreconnexion(gpcnxHFCS) ALORS
    // gestion de l'erreur
    FIN
    // Renseignement des infos de connexion MySQL
    gpcnxMySQL.Provider = hAccèsNatifMySQL
    [...]
    SI PAS houvreconnexion(gpcnxMySQL) ALORS
    // gestion de l'erreur
    FIN
    Sans oublier le code de déconnexion en fermeture du projet
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  4. #4
    Expert confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    juin 2017
    Messages
    2 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : juin 2017
    Messages : 2 428
    Points : 4 439
    Points
    4 439
    Par défaut
    Citation Envoyé par frenchsting Voir le message
    Je vais encore passer pour le vieux schnok mais pourquoi utiliser une classe ?
    Meu non, meu non.
    Je pense que la POO deviens à la mode en WLangage.
    L'année prochaine on aura des questions du type comment faire de la PF en WL
    Il y a peut être plus simple, mais ça tourne

  5. #5
    Nouveau membre du Club Avatar de chenevierebooks
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    décembre 2017
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 51
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeuse informatique

    Informations forums :
    Inscription : décembre 2017
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    Coucou !
    Merci de vous pencher sur mon problème. Oui, c'est bien comme ça que je traite le choix du serveur
    est transformé dans connexionCS en MaConnexion.Provider = hAccèsHFClientServeur
    Pour les erreurs, j'ai essayé un peu tout. Dans la méthode j'ai un traitement des erreurs avec un CAS ERREUR et CAS EXCEPTION qui font tous les deux un ErreurPropage() et un ExceptionPropage(). Dans l'appel de la méthode j'ai également mis un traitement d'erreur pour les afficher, mais rien ne vient. J'ai essayé également de faire QUAND EXCEPTION DANS .... FAIRE, mais il n'y a rien qui n'en ressort, le débugueur passe par dessus l'appel de la méthode.
    J'ai mis une trace au début de la méthode quand le code fonctionne, j'ai une trace et rien quand ça ne fonctionne pas. C'est la première fois que j'ai ce genre de comportement.

  6. #6
    Membre éclairé
    Homme Profil pro
    Chef de projet
    Inscrit en
    mars 2017
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2017
    Messages : 302
    Points : 713
    Points
    713
    Par défaut
    Citation Envoyé par frenchsting Voir le message
    Bonjour,

    Je vais encore passer pour le vieux schnok mais pourquoi utiliser une classe ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //Dans le code du projet
    gpcnxHFCS, gpcnxMySQL sont des connexions
    // Renseignement des infos de connexion HFCS
    gpcnxHFCS.Provider = hAccèsHFClientServeur
    [...]
    SI PAS houvreconnexion(gpcnxHFCS) ALORS
    // gestion de l'erreur
    FIN
    // Renseignement des infos de connexion MySQL
    gpcnxMySQL.Provider = hAccèsNatifMySQL
    [...]
    SI PAS houvreconnexion(gpcnxMySQL) ALORS
    // gestion de l'erreur
    FIN
    Sans oublier le code de déconnexion en fermeture du projet
    Justement, pour éviter de tout mettre dans le code du projet déjà

    La gestion par classe marche aussi bien qu'un procédural propre, mais par les classes on peut gérer du multi connexion plus facilement quand les classes sont bien conçues. Me concernant, 3 jeu de fichiers sur 3 bases différentes sont gérés par 3 instances de classe.
    Ce sont également les classes qui gèrent le requêtage qui est centralisé et journalisé en un seul endroit du soft.

    Tout ceci est encore une fois tout à fait possible en procédural, mais moins simple lié au fait que le procédural est un ensemble de procédure indépendantes, pas des objets qui interagissent entre eux et peuvent implémenter des attributs et des comportements.
    Je n'ai cependant pas l'impression que la POO devient à la mode, malheureusement, car ça en aiderait beaucoup à structurer leur code et à éviter de me coller des globales, cad des déclarations de variables/constantes partout dans le code du projet. De même que ça leur faciliterait grandement la factorisation par la suite et la réutilisabilité de leurs codes qui appellent l'IHM à tour de bras sans isoler les logiques métiers dans des éléments indépendants (le plus criant exemple est la quantité de code legacy que je trouve derrière les boutons et les champs, c'est ignoble)


    @chenevierebooks pour commencer, si tu es dans le projet censé être déployé plus tard, crée plutôt un nouveau projet qui ne fera que ça: se connecter aux bases. Si ce projet réussi il sera facile d'en réimplémenter les classes dans le projet final. Et le fait que le projet de test ne fasse que ça facilitera le débuggage dans l'environnement qui est le tien.

  7. #7
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    juin 2003
    Messages
    4 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2003
    Messages : 4 656
    Points : 8 054
    Points
    8 054
    Par défaut
    Finalement, tes objets sont globaux au projet ?

    D'après tout ce que j'ai vu en objet jusqu'à présent, j'ai quand même l'impression que l'objet est une méthode plus classe pour utiliser des variables globales... (Les jeux de mots sont volontaires...)

    Et quant à structurer la pensée, de ce que je vois dans mon boulot aujourd'hui, c'est qu'ils ont commencé par faire des objets sans le poser la question de savoir si c'était bien utile (et bien bien pensé)
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  8. #8
    Membre éclairé
    Homme Profil pro
    Chef de projet
    Inscrit en
    mars 2017
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2017
    Messages : 302
    Points : 713
    Points
    713
    Par défaut
    La ligne qui déclare l'objet de BDD est parfois globale au projet, dans le projet auquel je pensais en répondant ce n'est pas le cas.
    Quand ça l'est, tu as donc une ligne, pas un code entier déclarant les variables et les traitements métier au même endroit, ce qui ne permet pas la réutilisation par ailleurs. Du reste là il ne parlait que de connexion, mais la classe implémente bien d'autres comportements: création des fichiers, modifs de structure (mots de passe y compris) mise à jour métier avant et après ouverture, procédures de réindexation et compactage des mémo bref.....tout un programme si j'ose dire qui n'a pas sa place dans un code de projet.

    Mais si tu le vois comme une méthode plus classe pour utiliser des globales...tu es en effet passé à côté de ses atouts. Si ça ne servait qu'à ça on pourrait s'en sortir avec de simples collections de procédure.

    L'objet n'est pas fait pour tout et même quand il est adapté il faut savoir le mettre en oeuvre, et si il faut pour autant le faire. Ce n'est pas toujours le cas pour d'autres raisons pas liées au dev. Windev étant utilisés par beaucoup de non développeurs, on va donc tomber sur des conceptions parfois bancales, qu'un procédural aurait mieux remplacé. L'inverse étant du coup aussi vrai.

    Quand je vois des codes de projet remplis de déclaration de structures, bool, int et j'en passe, en fait ces variables servent soit à transmettre des paramètres, soit représentent des notions métiers qui pourraient être isolées dans des objets qui les représentent. Ici, une connexion à une BDD, mais on peut aussi avoir une connexion à un FTP, une classe de gestion pour le multithreading, une pour représenter une facture, un état, un client...c'est extrêmement vaste et c'est pas juste pour remplacer des globales, c'est un paradigme de programmation différent.

    Ces codes à rallonge que j'ai vu dans quasiment tous les projets légacy codé en procédural (jusqu'à près de 2000 lignes le code de projet, record à battre), compliquent la factorisation la rendant très difficile, j'ai malheureusement eu à en faire énormément sur des projets que je qualifie sans problème de "malades" puisque cette façon de faire conduisait les décideurs à soit ne plus rien toucher, soit demander du refurb et donc du retest pour un coût énorme, car les logiques métiers n'étant pas isolées, il fallait reprendre le code existant, les refurb, tout retester pour vérifier que les sorties n'étaient pas altérées et ensuite, un simple link de la classe dans le GDS (ou un copier coller...) suffisait à utiliser le fonctionnel ailleurs, souvent dans des projets web d'ailleurs, sans IHM car ce sont des API. L'usage intensif de l'IHM par les globales du projet étant par ailleurs un autre problème.

    J'ai d'ailleurs un projet objet, dont la rapidité de déploiement est telle qu'il a été désigné pour compléter le fonctionnel d'un projet procédural dont chaque modif impose un testing atroce. Mon projet étant livré en 48 heures au max, et souvent 2 heures, l'autre se prenant au minimum 15 jours dans la vue. Pas ouf pour les clients à l'heure où le mantra du "il me le faut vite" est devenu roi en entreprise. Certes, j'ai passé près de 3 semaines en conception mais désormais, le code et les tests vont vite, et la réutilisation est enfantine, by design

    On peut arriver au même résultat en procédural, mais là, les lacunes en modélisation des supposés dev qui sont derrière l'écran rendent cet exercice difficile dans l'environnement PC SOFT et c'est pas un truc qu'on apprend à l'école malheureusement (l'algorithmie, c'est différent de la modélisation), et là l'objet n'y est pour rien. Pour leur défense, j'admets que si je devais remplacer les objets en question par du procédural, j'y arriverais, mais je mettrais plus de temps pour le faire aussi propre et j'en chierais pas mal. J'ai déjà eu à le faire et je trouve l'exercice très peu agréable.

    Mais si je croisais uniquement du legacy procédural propre, je ne ferais même pas d'objet, j'en fais pour les refurb ou les nouveaux projets seulement.

  9. #9
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    juin 2003
    Messages
    4 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2003
    Messages : 4 656
    Points : 8 054
    Points
    8 054
    Par défaut
    Hello kunnskap,

    Merci pour ton retour circonstancié. Je fais un petit complément d'information.

    Si j'ai utilisé cette expression, c'est que jusqu'à présent, je n'ai pas vu de code orienté objet qui ne soit pas implémenté comme l'utilisation (grosso modo) d'une variable globale (avec une collection de procédures globales associée).

    Comme je l'ai expliqué dans ce forum, là où je bosse, ils ont commencé les dévs en windev (imposé). et comme ils n'aimaient pas, ils ont décidé de faire de l'objet en C# (prétextant que Windev ne permettait pas de faire les dévs demandés)... Et on en arrive à des aberrations totales : dans un code d'init d'un état, appeler des classes globales à l'état, certes, là où 2 hlitrecherchepremier auraient suffit (ou une belle requête sql).

    Quant à l'utilisation de l'IHM dans les procédures globales, je suis d'accord avec toi, c'est un non sens total.

    Je suis également d'accord avec toi concernant la façon de penser et de concevoir "objet". Malheureusement, beaucoup de dévs considèrent qu'il faut justifier l'emploi de l'objet en en créant tellement et qui sont tellement bien conçus (et "mélangés") qu'ils ne sont pas réutilisables...

    J'ai déjà vu une procédure globale (décorticage de XML) de plus de 2000 lignes. Mais pas un code de projet d'autant (ils étaient motivés, il faut croire).

    La question (et la réponse) est toujours la même : être développeur ou savoir développer ?
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

Discussions similaires

  1. Comportement bizarre d'une méthode
    Par guatto dans le forum OpenGL
    Réponses: 2
    Dernier message: 07/08/2017, 13h27
  2. Problème avec une méthode d'une classe
    Par ChPr dans le forum Android
    Réponses: 5
    Dernier message: 16/03/2013, 12h52
  3. Réponses: 0
    Dernier message: 20/05/2012, 21h58
  4. class: modifier une var d'instance avec une méthode
    Par jean-pat dans le forum Général Python
    Réponses: 5
    Dernier message: 29/09/2011, 16h25
  5. Pb avec une méthode de classe
    Par damien27000 dans le forum Langage
    Réponses: 5
    Dernier message: 29/08/2007, 18h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo