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

Langage Delphi Discussion :

Mixer Directive de compilation et tests de variable


Sujet :

Langage Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 459
    Points : 3 090
    Points
    3 090
    Par défaut Mixer Directive de compilation et tests de variable
    Bonjour

    Petite curiosité du vendredi (non, ça sera pas du poisson).

    Dans une procédure, j'utilise une directive pour faire une opération précise si je suis en DEBUG.
    Mais cette opération peut aussi être déclenchée (par commodité) selon un paramètre reçu en ligne de commande.
    En gros ça donne un truc comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      {$IFDEF DEBUG}
        AdjustDestDirForTest;
        AdjustedDir := True;
      {$ENDIF}
     
      if not AdjustedDir then
        if Settings.ModeTest then   //  défini par un ParamStr bien précis, ce qui me permet de simuler le DEBUG dans la version prod.
          AdjustDestDirForTest;
    que j'aurais pu écrire aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      if Settings.ModeTest then
        AdjustDestDirForTest
      else
      begin
        {$IFDEF DEBUG}
          AdjustDestDirForTest;
        {$ENDIF}
      end;
    Et là, je me demandais si je pouvais mixer les 2 , bien qu'AMHA, ça ne soit pas possible.
    Comme plus rien ne m'étonne à mon âge, est-ce que vous vous êtes déjà posé la question ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      {$IFDEF DEBUG} or Settings.ModeTest
        AdjustDestDirForTest;
      {$ENDIF}

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 754
    Points : 13 340
    Points
    13 340
    Par défaut
    Ce n'est pas possible, c'est une condition de compilation. Le bloc n'existe pas hors débogue.

    Tu devrais simplement conditionner ModeTest :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function TSettings.ModeTest :boolean;
    begin
      Result := {$IFDEF DEBUG}TRUE{$ELSE}FindCmdLineSwitch(...){$ENDIF};
    end;
     
    if Settings.ModeTest then
      AdjustDestDirForTest;

  3. #3
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 459
    Points : 3 090
    Points
    3 090
    Par défaut
    Je me doutais bien que ça pouvait pas le faire.

    Mais j'aime bien cette façon concise de l'écrire.

    Merki

    D'ailleurs, comme ModeTest est une variable initialisée à la création de Settings, j'ai fais encore plus court:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      if {$IFDEF DEBUG}True{$ELSE}Settings.ModeTest{$ENDIF} then
        AdjustDestDirForTest;

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 754
    Points : 13 340
    Points
    13 340
    Par défaut
    J'avais hésité à te proposer cette solution mais je m'étais ravisé par ce qu'elle n'est pas logique à travers le projet complet

    Indépendamment du débogue, tu es en mode "test" ou tu ne l'es pas. Conditionner certaines fonctions mais pas d'autres va juste biaiser tes tests, voire engendrer un troisième comportement en plus des modes debug et release qui n'aidera pas forcément à la recherche d'erreurs.

    Aujourd'hui, il n'y a peut-être qu'un seul endroit où tu veux forcer ModeTest, mais demain...

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    tu peux aussi faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    const
      DEBUG = {$IFDEF DEBUG}True{$ELSE}False{$ENDIF};
     
    begin
      if DEBUG then
    end;

  6. #6
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 459
    Points : 3 090
    Points
    3 090
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    J'avais hésité à te proposer cette solution mais je m'étais ravisé par ce qu'elle n'est pas logique à travers le projet complet

    Indépendamment du débogue, tu es en mode "test" ou tu ne l'es pas. Conditionner certaines fonctions mais pas d'autres va juste biaiser tes tests, voire engendrer un troisième comportement en plus des modes debug et release qui n'aidera pas forcément à la recherche d'erreurs.

    Aujourd'hui, il n'y a peut-être qu'un seul endroit où tu veux forcer ModeTest, mais demain...
    J'ai une procédure qui envoie des fichiers sur un FTP de test.
    Dans Delphi, je teste en DEBUG, ce qui envoie les fichiers dans un dossier précis (Dossiers_test).
    Mais le client doit pouvoir tester la version prod en envoyant lui aussi les fichiers dans le même dossier que moi en debug parce que le dossier utilisé par la prod est scanné en permanence par un autre logiciel qui récupère tous les fichiers déposés à cet endroit et les traite comme des commandes clients.
    Et comme le nom du dossier est en dur dans le programme, je simule le mode debug pour cet envoie de fichier.
    ça ne remplace pas complètement le mode DEBUG de Delphi

  7. #7
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Perso je vote pour la première réponse de AndNotOr. Comme il le dit,
    Citation Envoyé par Andnotor Voir le message
    Aujourd'hui, il n'y a peut-être qu'un seul endroit où tu veux forcer ModeTest, mais demain...
    Sinon, si tu veux garder ta modif seulement à cet endroit, une autre façon d’écrire serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      {$IFNDEF DEBUG}if Settings.ModeTest then{$ENDIF}
        AdjustDestDirForTest;

  8. #8
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 459
    Points : 3 090
    Points
    3 090
    Par défaut
    encore plus court Joli

  9. #9
    Membre émérite
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 216
    Points : 2 303
    Points
    2 303
    Par défaut
    Bonjour,

    quel intérêt d'utiliser la directive de compilation {$ifdef debug} si tu as déjà un paramètre qui permet de te mettre dans les mêmes conditions ? Je pense que si le client a la possibilité par un paramétrage de se mettre en mode test, il est préférable aussi de tester de la même façon de ton côté, l'avantage étant qu'ainsi tu es certains d'avoir le même comportement chez toi et chez le client.

    @++
    Dany

  10. #10
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par skywaukers Voir le message
    quel intérêt d'utiliser la directive de compilation {$ifdef debug} si tu as déjà un paramètre qui permet de te mettre dans les mêmes conditions ? Je pense que si le client a la possibilité par un paramétrage de se mettre en mode test, il est préférable aussi de tester de la même façon de ton côté, l'avantage étant qu'ainsi tu es certains d'avoir le même comportement chez toi et chez le client.
    D'où l'intéret de la proposition de AndNotOr, soit tu es en debug, auquel cas tu va toujours gérer l'emplacement de tes fichiers dans un dossier spécial sans avoir a te soucier de la ligne de commande; soit tu es en prod, mais tu as besoin de faire des tests sur l'environnement de prod, et dans ce cas c'est juste le parametre qui te permet de passer dans un état "de test"

  11. #11
    Membre émérite
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 216
    Points : 2 303
    Points
    2 303
    Par défaut
    Citation Envoyé par guillemouze Voir le message
    D'où l'intéret de la proposition de AndNotOr, soit tu es en debug, auquel cas tu va toujours gérer l'emplacement de tes fichiers dans un dossier spécial sans avoir a te soucier de la ligne de commande; soit tu es en prod, mais tu as besoin de faire des tests sur l'environnement de prod, et dans ce cas c'est juste le parametre qui te permet de passer dans un état "de test"
    ok, mais quelque part on mixe le mode de test d'une autre manière, et là aussi il peut y avoir confusion un jour. Peut-être que dans ce cas l'utilisation de la directive de compilation n'est pas la plus appropriée puisqu'il y a besoin de faire du test en production. Il vaudrait peut-être mieux tout mettre en configuration dans ce cas là. L'avantage en plus est qu'on peut se mettre en condition de prod tout en étant en mode DEBUG et pouvoir faire du pas à pas.

    @++
    Dany

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Directives de compilation pour g++
    Par Jfrancois57 dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 09/11/2005, 11h23
  2. Directives de compilation (globales ?)
    Par korntex5 dans le forum Langage
    Réponses: 6
    Dernier message: 24/10/2005, 14h13
  3. compilation: javac ? test.java
    Par ista9im dans le forum Langage
    Réponses: 1
    Dernier message: 08/10/2005, 09h34
  4. directive de compilation
    Par gandf dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/02/2005, 10h46
  5. Directives de compilations.
    Par ushu dans le forum Langage
    Réponses: 2
    Dernier message: 28/01/2003, 10h44

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