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 :

Opportunité d'un choix syntaxique


Sujet :

Langage Delphi

  1. #1
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut Opportunité d'un choix syntaxique
    Bonjour,

    J'ai créé un objet qui encapsule une BD SQLite. Il permet par exemple de récupérer le résultat de requêtes dans une grille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function TMyBD.ToStringGrid(aRequest: string; aGrid: TStringGrid): integer;
    Je lui ai ajouté un objet ParamSQL qui contient une requête paramétrée. Pour lui dire d'utiliser cette requête, il suffit de passer UseParamSQL (qui vaut nil) à la place de la chaîne Request :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if MyBD.ToStringGrid(UseParamSQL, MyGrid) = SQL_OK then...;
    Voici donc ma question : est-il opportun (au sens de classique, intelligible, etc.) de redéfinir les fonctions sur le modèle suivant ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function TMyBD.ToStringGrid(aGrid: TStringGrid; aRequest: string default UseParamSQL): integer;
    Delphi 5 Pro - Delphi 10.4 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    Perso, j'aime bien utiliser des paramètres par défaut, mais il faut que ce soit le cas général utilisé la majeur partie du temps. Sinon, ça ne fait qu’alourdir la déclaration.
    Certaines fois, je préfère cependant m'en passer pour conserver un ordre logique des paramètres. Par exemple une encapsulation de ShellExecute et le verbe 'open'. Le placer à la fin ne me plait pas.

    Dans le cas que tu évoques et puisque la méthode s'appelle ToStringGrid, avoir aGrid en premier est tout à fait logique et si personnaliser aRequest est l'exception, une valeur par défaut est tout indiquée

    ps: La valeur par défaut se déclare dans l'interface et n'a pas besoin d'être répété dans l'implémentation. On pourrait d'ailleurs ne déclarer aucun paramètre dans l'implémentation, mais ne facile pas la lecture.
    Ceci est parfaitement accepté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    interface
     
    type
      TForm1 = class(TForm)
      public
        procedure ShowMsg(aText :string; aTitle :string = 'Information');
      end;
     
    implementation
     
    procedure TForm1.ShowMsg;
    begin
      MessageBox(Handle, PChar(aText), PChar(aTitle), MB_OK);
    end;

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    Merci beaucoup pour ton avis argumenté.

    Pour la non répétition du default, OK : je codais ici dans le forum...

    Par contre, qu'on puisse ne pas reprendre du tout les paramètres dans l'implémentation, tu me l'apprends !
    Delphi 5 Pro - Delphi 10.4 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Je suis d'accord également, l'ordre de déclaration des paramètres doit se faire du plus "logique"/"important" au facultatif.


    si on regarde quelques fonctions designée par Borland :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TryStrToInt( string , var int) boolean
    il serait idiot, même si pas faux de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TryStrToInt(var int, string) boolean
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TryStrToInt(var boolean, string) int

    C'est encore plus important quand on overload, on se rend bien compte que les paramètres facultatif doivent être placés vers la fin (en prenant également en compte les types qui pourrait créer des erreur de sélecteur).

    D'autant plus, qu'il faut privilégier les meilleurs registres pour les paramètres important, et laisser les paramétres moins important dans les registres "pourris".

    un exemple vulgaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    methode (A [eax], B [edx], C [esi], D [esi+0x]...): [eax]
    A est forcement le paramètre le plus important. et beneficie du registre le plus rapide d’accès, le plus simple à utiliser.
    c'est également vrai pour le choix d'utiliser PROCEDURE ou FUNCTION.

    doit on faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure BSWAP(A: integer; out B: integer);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function BSWAP(A: integer): integer;
    l'exemple est un peu pourrie

    mais dans la procedure on devra faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    asm
      mov eax, edx;
      bswap edx;
    end;
    alors que dans la fonction on fera tout simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    asm
      bswap eax;
    end;
    soit une instruction de moins, donc une rapidité accrue.


    dans ta fonction, l'avantage est que tout de suite on mets l'objet TStringGrid visé puis la requette (qui peu être longue si on l'écrit en dur), donc qui ne laisserai plus apparaitre à l'écran, l'objet visé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ToStringGrid(StringGrid1, 'SELECT * FROM maTable WHERE blabla=1 AND blibli=2 AND bloblo=4 GROUP BY id SORT BY blabla ASC LIMIT 0,1000;');
    c'est quand même plus sympa.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    Bien vu !

    Merci pour ton approche didactique en terme d'efficacité.

    Grâce à vous, j'ai des arguments pour choisir
    Delphi 5 Pro - Delphi 10.4 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    Je propose juste un petit quizz (de Noël) sur ce qu'a dit le Docteur : Quelle est la façon la plus simple de faire un Int64 à partir de deux entiers ?

    La réponse est... ne rien faire !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function MakeInt64(aLow, aHigh: integer): Int64; asm end;
    Explication:
    Le premier paramètre est chargé dans EAX et le second dans EDX. Dans le résultat, le double-mot de poids faible se trouve dans EAX et celui de poids fort dans EDX. Aucune transformation n'est nécessaire

  7. #7
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Je propose juste un petit quizz (de Noël) sur ce qu'a dit le Docteur : Quelle est la façon la plus simple de faire un Int64 à partir de deux entiers ?

    La réponse est... ne rien faire !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function MakeInt64(aLow, aHigh: integer): Int64; asm end;
    Explication:
    Le premier paramètre est chargé dans EAX et le second dans EDX. Dans le résultat, le double-mot de poids faible se trouve dans EAX et celui de poids fort dans EDX. Aucune transformation n'est nécessaire
    tu peux utiliser int64Rec,LongRec en guise de macros sans quelles introduisent aucun code supplémentaire

Discussions similaires

  1. Choix syntaxique pour operator<()
    Par camboui dans le forum SL & STL
    Réponses: 4
    Dernier message: 11/01/2010, 11h38
  2. [Choix] Quelles attentes par rapport aux SGBD ?
    Par thierry34 dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 13/07/2002, 21h08
  3. [Choix] SGDB pour Entreprise : coût, efficacité, etc.
    Par grassat dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 15/06/2002, 09h52
  4. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 16h23
  5. Choix d'un ORB
    Par Anonymous dans le forum CORBA
    Réponses: 4
    Dernier message: 06/05/2002, 12h15

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