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

Delphi Discussion :

Concours Parnassus de mauvais code Delphi : les résultats


Sujet :

Delphi

  1. #1
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut Concours Parnassus de mauvais code Delphi : les résultats
    Nom : parnassus-bottom-aligned1.png
Affichages : 849
Taille : 6,5 Ko

    En ce 1er avril et par des temps tumultueux, un peu d’humour ne peut faire de mal Par conséquent, vous apprécierez sans doute le « concours de mauvais code Delphi » proposé par le site Delphi Parnassus et dont les résultats viennent d’être révélés.

    Du modèle de code censé améliorer une routine alors qu’il la ralentit ou l’estropie jusqu’au programme ambitieux illisible et/ou impossible à maintenir, il y en a pour tous les goûts.

    Le grand prix de la compétition revient de juste droit à Alexander Benikowski qui a réussi à écrire une boucle for…to de 14 000 signes ! Mais quand on rêve de cloner Mario, on ne compte pas !

    J’avoue cependant avoir une préférence pour les portions de code courtes mais très efficaces quand il s’agit de créer des bogues retors : celui qui a écrit une procédure Break qui cache la procédure originale ou encore celui qui a « optimisé » une routine de comparaison de chaînes à coups de hashcode mal maîtrisé sont mes programmeurs préférés.

    Voici la procédure Break à la perversité garantie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure Break;
    begin
      // Yeah, I'm pretty sure this will break something :)
    end;

    Source : https://parnassus.co/delphi-bad-code...sults-winners/

    Avez-vous vous aussi du code bien mauvais à soumettre à la communauté ?
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 659
    Points : 13 032
    Points
    13 032
    Par défaut
    Oui mais tout n'est pas correct dans ce qu'ils énoncent.

    First, it’s incorrect: the hash is case-sensitive (though the original code was too.)
    Faux ! StringCompareUnOpt n'est pas égale à StringCompareOpt.
    La première fonction est sensible à la casse mais pas la deuxième. GetHashCode commence par appeler ToUpper. 70063 correspond à "FOO" et non à "Foo".
    Ce qui explique en bonne partie la différence de vitesse.

    EDIT:
    Adrian Gallero avait relevé l'erreur.

    Second, what if the string constants change – you need to regenerate the constants
    Dans les deux cas, ça renverra Unknown. Cette remarque n'a pas beaucoup de sens.

    Dommage qu'ils n'expliquent pas, selon eux, la bonne pratique. Ne serait-ce que si on veut appeler cette fonction un million de fois, passer le paramètre en const pour éviter la gestion du compteur de référence.

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 421
    Points : 24 776
    Points
    24 776
    Par défaut
    J'ai aussi survolé, le sujet, j'aurais juste aimé voir le code complet du Mario, c'est intriguant cette grande boucle !

    Par contre, un concours du plus mauvais code : je ne sais pas si je dois en rire ou en pleurer !
    En tant que professionnel, je suis confronté à du mauvais code tous les jours,
    le dernier en date commité ce vendredi 8 Avril 2016 par un collègue m'hallucine par sa lourdeur :

    le code d'origine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
      LModeleFile: string;
    begin
      LModeleFile := ExtractFilePath(ParamStr(0))+ModeleFichier;
      ... DownloadFile(RemoteFileName, LModeleFile) ...
    le code modifié par mon collègue
    C'est pour privilégier un dossier local où l'utilisateur ou Excel peut lire et écrire
    C'est depuis la migration d'application locale de plus en plus lancé via CITRIX
    Donc ParamStr(0) retourne chez nous souvent \\server\dossier\module.exe, télécharger un fichier sur un dossier réseau c'est lourd

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    ...
      LModeleFile, LTest: string;
    begin
      LTest := IncludeTrailingPathDelimiter(GetEnvironmentVariable('APPDATA'));
      LModeleFile := ExtractFilePath(ParamStr(0))+ModeleFichier;
      if not DirectoryExists(LTest) then
      begin
        ForceDirectories(LTest);
      end;
      if DirectoryExists(LTest) then
      begin
        LTest := LTest+'\Microsoft'; 
        if not DirectoryExists(LTest) then
        begin
          ForceDirectories(LTest);
        end;
        if DirectoryExists(LTest) then
        begin
          LTest := LTest+'\Templates';
          if not DirectoryExists(LTest) then
          begin
            ForceDirectories(LTest);
          end;
          if DirectoryExists(LTest) then
          begin
            LModeleFile := LTest+'\'+ModeleFichier;
          end;
        end;
      end;
     
      ... DownloadFile(RemoteFileName, LModeleFile) ...
    Il y a une erreur au LTest := LTest+'\Microsoft';LTest contient déjà le \ ajouté par le IncludeTrailingPathDelimiter du coup cela fait « AppData\\Microsoft » au lieu de « AppData\Microsoft »
    Mais Windows supporte le \\ comme \ dans un chemin

    Mauvaise maitrise de ForceDirectories qui inclus l’appel à DirectoryExists


    le code simplifié par mes soins

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    …
      LModeleFile, LTest: string;
    begin
      LTest := IncludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(GetEnvironmentVariable('APPDATA')) + 'Microsoft') + 'Templates';
      if ForceDirectories(LTest) then
        LModeleFile := IncludeTrailingPathDelimiter(LTest) + ModeleFichier
     else
        LModeleFile := ExtractFilePath(ParamStr(0)) + ModeleFichier;
     
      ... DownloadFile(RemoteFileName, LModeleFile) ...
    Donc un concours, sur le plus mauvais code est franchement déprimant !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    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
    @Shai : pour moins de lourdeur, j'aurai plutôt vu le PathDelim dans les cas ou son abscence est connue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    …
      LModeleFile, LTest: string;
    begin
      LTest := IncludeTrailingPathDelimiter(GetEnvironmentVariable('APPDATA')) + 'Microsoft' + PathDelim + 'Templates';
      if ForceDirectories(LTest) then
        LModeleFile := LTest + PathDelim + ModeleFichier
     else
        LModeleFile := ExtractFilePath(ParamStr(0)) + ModeleFichier;
     
      ... DownloadFile(RemoteFileName, LModeleFile) ...

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 421
    Points : 24 776
    Points
    24 776
    Par défaut
    PathDelim, oui effectivement dans ce cas, c'est tout à fait opportun
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 404
    Points : 5 790
    Points
    5 790
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    J'ai aussi survolé, le sujet, j'aurais juste aimé voir le code complet du Mario, c'est intriguant cette grande boucle !

    Par contre, un concours du plus mauvais code : je ne sais pas si je dois en rire ou en pleurer !
    En tant que professionnel, je suis confronté à du mauvais code tous les jours,
    le dernier en date commité ce vendredi 8 Avril 2016 par un collègue m'hallucine par sa lourdeur :

    ...
    tu peut le récupérer sur sur ici
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 421
    Points : 24 776
    Points
    24 776
    Par défaut
    En Release, ça mets une erreur sur XE2 que je n'ai encore jamais vu "[MSBuild Erreur] "0" is an invalid value for the "DebugInformation" parameter of the "DCC" task. The "DebugInformation" parameter is of type "System.Boolean"."
    En Debug, je n'ai qu'un tas d'erreur de vérification d'étendu ou alors des Violations d'accès
    Comme sous Seattle comme c'est indiqué dans le sujet

    un petit try except en plus ça affiche difficilement le StartScreen.png

    Sous XE7 que j'ai aussi, ça affiche la fin du niveau directement

    Dommage, j'aurais aimé voir tourner cette petite folie
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Réponses: 8
    Dernier message: 15/03/2008, 21h14
  2. Concours des Smileys d'Or 2006 : les résultats !
    Par GrandFather dans le forum Jeux
    Réponses: 22
    Dernier message: 11/01/2007, 12h01

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