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

Actualités Discussion :

Le pire bout de code que vous ayez vu

  1. #301
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par C_edd Voir le message
    Lorsque nous parlons de sécurité, on nous répond qu'il est peu probable que quelqu'un s'amuse à hacker le serveur.
    C'est qui le client final ?

  2. #302
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2
    Points : 5
    Points
    5
    Par défaut
    Une très grosse entreprise, connus par tous. (Ce qui est sans doute le plus désolant)

  3. #303
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 321
    Points
    4 321
    Par défaut
    Citation Envoyé par C_edd Voir le message
    Plusieurs applications commerciales, "sécurisées", que mon collègue et moi même sommes chargés de maintenir, et à l'occasion d'y ajouter de nouvelles fonctionnalités.

    voici un exemple type du code dont sont constitués ces applications :

    fichier index.php :



    je vous laisse deviner ce qu'il ce passe lorsque l'on appelle directement le fichier index2.php.

    en prime, voici le résultat lorsque l'on lit le code source depuis le navigateur :



    Aujourd'hui, on m'a demandé d'installer "ça" pour un client.

    La direction ne veux pas entendre parler de "refonte" des applications au point que nous envisageons sérieusement de prendre du temps en cachette histoire de corriger ce qui peut l'être.

    La direction considère qu'une semaine est un délai suffisant pour une application, de l'analyse jusqu'à la mise en prod, le tout en étant chargé d'assurer la maintenance matérielle chez un autre client. (avez vous déjà essayé de programmer avec un téléphone sonnant tous les quarts d'heure pour des histoires d'imprimantes ou de mot de passe oublié ?)

    Lorsque nous parlons de sécurité, on nous répond qu'il est peu probable que quelqu'un s'amuse à hacker le serveur.

    Une des méthodes de travail utilisé est de demander une nouvelle application. La base : une vague idée écrite sur un papier brouillon tenant en deux ligne. Puis une fois la chose manipulable par le demandeur, celui-ci s'en sert de base pour demander de nouvelles fonctionnalités. (le résultat : on jette tout, et on recommence)

    Nous sommes désespéré. A l'aide.

    Ps : y'a t-il une section de soutien psychologique sur le forum ?
    Faut changer de boite XD
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  4. #304
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mars 2007
    Messages : 185
    Points : 134
    Points
    134
    Par défaut
    Citation Envoyé par C_edd Voir le message
    La direction considère qu'une semaine est un délai suffisant pour une application, de l'analyse jusqu'à la mise en prod, le tout en étant chargé d'assurer la maintenance matérielle chez un autre client. (avez vous déjà essayé de programmer avec un téléphone sonnant tous les quarts d'heure pour des histoires d'imprimantes ou de mot de passe oublié ?)
    Tiens on a du bosser dans la même boite !!!
    Heureusement je suis parti.... j'aurai fini dingue !! Dans mon cas, il faut rajouter les persécutions permanentes et les critiques à tout va, genre "on ne fait que de la merde"... ben oui mais en même temps on avait des conditions de m****. Depuis c'est marrant mais je m'éclate sur de vrais et beaux projets...

    MDR et avec toute ma solidarité !!

  5. #305
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 2
    Points : 12
    Points
    12
    Par défaut
    Je profite de ce post pour faire une petite parenthèse :

    quand dans un fichier .cpp .php .java .js je voit ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(true){
    ... code à executer ou pas
    }
    Certains développeurs m'expliquent que ca permet d'activer / desactiver du code rapidement.

    Comme ils sont nouveaux, je leur donne l'astuce suivante qui marche en C++ (pas en C) en Java , en php, et en javascript.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /* Un petit commentaire qui explique que ce code est sujet à supression
    ... code à exécuter ou pas
    // */
    en ajoutant ou en enlevant un slash sur la première ligne on peut commenter / décommenter le bloc de code.

    Mais une fois c'etait un quadra qui se prennait pour un cador, qui laissait entendre à mes collègues que j'étais un incapable. Alors je me suis un peut foutus de sa gueule en lui proposant la structure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    switch(true){
    case true :
    ... code à executer ou pas
    default :
    }

    bon ensuite passons aux petit bout de code exquis, qu'un développeur un peut fatigué m'a fournit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <script type="text/javascript">var clicked_after_confirm_<?php echo $id ; ?> = false ;</script><a id="link-suppress-<?php echo $id ; ?>" class="link-suppress" href="suppress.php?id=<?php echo $id ; ?>" onclick="if(clicked_after_confirm_<?php echo $id ; ?>) window.location = this.href ; else return $('#msg-warning-container').html('<div class=&quot;msg&quot;>Vous êtes sur le point de supprimer définitivement ce commande, êtes vous sur de vouloir continuer ?</div><div class=&quot;msg-warning-show-command&quot;><a href=&quot;detail.php?id=<?php echo $id ; ?>&quot;>Voir le détail de la commande</a></div><div class=&quot;button&quot; id=&quot;msg-warning-button-no&quot; >NON revenir à la liste</div><div class=&quot;button&quot; id=&quot;msg-warning-button-yes&quot;>OUI supprimer la commande</div>').bind('click',function(e){if(e.target.id=='msg-warning-button-yes'){ clicked_after_confirm_<?php echo $id ; ?> = true ; $('#link-suppress-<?php echo $id ; ?>').click(); }else{ $('#msg-warning-container').html('') } }).hasClass('null');">cliquez ici</a>
    <!-- Nb: pour simplifier la lecture du code j'ai mis le code une fois que le php a été interprété avec $id = 28 -->
    <script type="text/javascript">var clicked_after_confirm_28 = false ;</script><a id="link-suppress-28" class="link-suppress" href="suppress.php?id=28" onclick="if(clicked_after_confirm_28) window.location = this.href ; else return $('#msg-warning-container').html('<div class=&quot;msg&quot;>Vous êtes sur le point de supprimer définitivement ce commande, êtes vous sur de vouloir continuer ?</div><div class=&quot;msg-warning-show-command&quot;><a href=&quot;detail.php?id=28&quot;>Voir le détail de la commande</a></div><div class=&quot;button&quot; id=&quot;msg-warning-button-no&quot; >NON revenir à la liste</div><div class=&quot;button&quot; id=&quot;msg-warning-button-yes&quot;>OUI supprimer la commande</div>').bind('click',function(e){if(e.target.id=='msg-warning-button-yes'){ clicked_after_confirm_28 = true ; $('#link-suppress-28').click(); }else{ $('#msg-warning-container').html('') } }).hasClass('null');">cliquez ici</a>
    
    <div id="msg-warning-container"></div>
    NB: si vous incluez jquery dans une page html et ce bout de code vous devriez pouvoir le voir fonctionner

    Pour vous ressituer un peut le contexte on avait une liste de commandes dans une page web et un lien supprimer pour chaque commange. On a eu l'audasse, de demander au prestataire de rajouter un message de confirmation avant de suprimmer définitivement la commande. Bien sur il nous a pourris la gueule et a pleuré toutes les larmes de son corps parceque ce n'était pas dans le cahier des charge. Non mais c'est vrai ca ! Qu'est ce qui nous a pris de demander ca ! C'est pas parcequ'on lache 200k€ a une société comme Ajilon pour une application qu'on peut demander ca ! ( oui oui vous avez bien lu deux cent mille euros )

    Comme je suis masochiste ( et responsable de ce que font nos prestataires ) j'ai déchiffré ce code miraculeux.

    Et voici sans plus attendre les explications du code qui sont le fruit d'une longue quette spirituelle. Une quette qui consistait à comprendre ce qu'un développeur sous-payé et doppé au guronsan avait pondu au beau milieu de la nuit.

    A savoir si vous ne connaissez pas jquery :

    Ce qui est un avantage comme un inconvénient avec jquery et les fontions anonymes ; c'est qu'on peut tout faire en une seule ligne.

    $('#msg_warning-container') c'est une fonction jquery qui recherche tous les éléments dont l'id est msg-warning-container ( jusque là tout va bien )
    cette fonction nous retourne une liste avec un élément (c'est un cas particulier car l'id est unique)

    la méthode html('...') permet de changer le contenu html de chaque balise de la liste et retourne la dite liste

    la méthode bind('click',function(e){...}) rajoute un event handler qui intercepte l'événement click sur chaque éléments de la liste et retourne la liste

    la méthode hasClass('null') retourne true si un des éléments de la liste correspond au sélécteur css .null

    si indépendemment chacune de ces méthodes peut s'avérer très utile en js le chainage des méthodes rend le code inbitable ( un ligne de 1057 caractères soit a peu près 1.03 ko ).

    Maintenant interressons nous au event handler :

    il regarde quel est la balise qui a recu l'événement click (e.target.id)
    si c'est de div OUI ... (e.target.id == 'msg-warning-button-yes' )
    il change la variable globale clicked_after_confirm_28 et déclenche l'évenement click sur le lien : $('$link-suppress-28').click() .
    sinon il efface le contenu du dic qui contient le message d'avertissement : $('#msg-warning-container').html('')

    examinons le code du onclick="" :

    si la variable globale clicked_after_confirm_28 est vrai alors il change l'url de la fenetre avec la valeur de l'attribut href ( je vous expliquerais cette manoeuvre ) sinon il execute tout un merdier.

    Maintenant procédons par ordre chronologique pour comprendre ce que fait ce medrier:

    Etape 1 je clique sur le lien cliquez ici :

    le navigateur déclenche le javascript placé dans l'attribut onclick=""
    clicked_after_confirm_28 est à false on va dans la partie du else :

    PUT*!# mais quel merdier ! (j'ai déjà dis ? non ?)

    on voit un return mais on sait pas trop ce qu'il retourne

    on récupère avec jquery la balise div avec l'id msg-warning-container
    on affecte le contenu html ( 4 div avec : le message de message de confirmation , le lien vers le détail de la commande , le bouton non , le bouton oui )
    on lui rajoute un event handler
    et on regarde si a balise à la classe null et comme ce n'est pas le cas ca retourne false ;


    comme le javascript placé dans l'attribut onclick="" retourne false le navigateur ne va pas sur la page suppress.php?id=28

    C'est bon tout le monde arrive à suivre ?

    Ensuite Etape 2 on clique sur non :

    l'événement est récupéré par le handler
    le handler regarde quelle balise a été cliqué
    comme c'est non le handler efface le contenu de la div avec l'id msg-warning-container

    Enfin Etape 2 (bis) on clique sur oui
    l'événement est récupéré par le handler
    le handler regarde quelle balise a été cliqué
    comme c'est oui le handler passe la variable globale clicked_after_confirm_28 à true et déclenche l'évenement on click du lien
    cette fois ci le code placé dans onclick="" execute window.location = this.href ce qui a pour effet d'aller sur la page supress.php?id=28

    Alors vous me demandez pourquoi faire window.location = this.href en javascript alors que les liens normaux s'en passent très bien ?

    réponse du développeur :

    Ben ! je croyais que $('$link-suppress-28').click() faisait comme si on avait cliqué sur le lien mais en fait ca déclenche juste onclick="". Comme je pouvais pas tout recoder ben j'ai mis ca.

  6. #306
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Comme ils sont nouveaux, je leur donne l'astuce suivante qui marche en C++ (pas en C) en Java , en php, et en javascript.
    en C tu peux jouer avec des #ifdef, ensuite en fonctions des defines de compilation ton code est actif ou pas.

    Exemple bateau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifdef DEBUG
    printf("ma trace de debug\n");
    #endif
    a utiliser avec parcimonie, car quand ces blocs se multiplient (avec des define différents) on finit par de plus savoir ce qui est exécuté ou pas
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  7. #307
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 519
    Points : 1 104
    Points
    1 104
    Par défaut
    À noter que Kate colore un bloc « #if 0 ... #endif » comme un commentaire

  8. #308
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mars 2007
    Messages : 185
    Points : 134
    Points
    134
    Par défaut
    Citation Envoyé par LinkerError Voir le message
    bon ensuite passons aux petit bout de code exquis, qu'un développeur un peut fatigué m'a fournit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <script type="text/javascript">var clicked_after_confirm_<?php echo $id ; ?> = false ;</script><a id="link-suppress-<?php echo $id ; ?>" class="link-suppress" href="suppress.php?id=<?php echo $id ; ?>" onclick="if(clicked_after_confirm_<?php echo $id ; ?>) window.location = this.href ; else return $('#msg-warning-container').html('<div class=&quot;msg&quot;>Vous êtes sur le point de supprimer définitivement ce commande, êtes vous sur de vouloir continuer ?</div><div class=&quot;msg-warning-show-command&quot;><a href=&quot;detail.php?id=<?php echo $id ; ?>&quot;>Voir le détail de la commande</a></div><div class=&quot;button&quot; id=&quot;msg-warning-button-no&quot; >NON revenir à la liste</div><div class=&quot;button&quot; id=&quot;msg-warning-button-yes&quot;>OUI supprimer la commande</div>').bind('click',function(e){if(e.target.id=='msg-warning-button-yes'){ clicked_after_confirm_<?php echo $id ; ?> = true ; $('#link-suppress-<?php echo $id ; ?>').click(); }else{ $('#msg-warning-container').html('') } }).hasClass('null');">cliquez ici</a>
    <!-- Nb: pour simplifier la lecture du code j'ai mis le code une fois que le php a été interprété avec $id = 28 -->
    <script type="text/javascript">var clicked_after_confirm_28 = false ;</script><a id="link-suppress-28" class="link-suppress" href="suppress.php?id=28" onclick="if(clicked_after_confirm_28) window.location = this.href ; else return $('#msg-warning-container').html('<div class=&quot;msg&quot;>Vous êtes sur le point de supprimer définitivement ce commande, êtes vous sur de vouloir continuer ?</div><div class=&quot;msg-warning-show-command&quot;><a href=&quot;detail.php?id=28&quot;>Voir le détail de la commande</a></div><div class=&quot;button&quot; id=&quot;msg-warning-button-no&quot; >NON revenir à la liste</div><div class=&quot;button&quot; id=&quot;msg-warning-button-yes&quot;>OUI supprimer la commande</div>').bind('click',function(e){if(e.target.id=='msg-warning-button-yes'){ clicked_after_confirm_28 = true ; $('#link-suppress-28').click(); }else{ $('#msg-warning-container').html('') } }).hasClass('null');">cliquez ici</a>
    
    <div id="msg-warning-container"></div>
    J'ai déjà voté, mais dans le genre code inbitable, in-maintenable et affreux il est pas mal non plus, allez je le mets second dans mon best of !!

  9. #309
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LinkerError Voir le message
    Je profite de ce post pour faire une petite parenthèse :

    quand dans un fichier .cpp .php .java .js je voit ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(true){
    ... code à executer ou pas
    }
    Certains développeurs m'expliquent que ca permet d'activer / desactiver du code rapidement.

    Comme ils sont nouveaux, je leur donne l'astuce suivante qui marche en C++ (pas en C) en Java , en php, et en javascript.
    En ce qui concerne Java il est bien plus pratique d'utiliser le if(true/false) :
    • Comme il s'agit d'une constante, le if n'existera plus après la compilation.
      En clair le if(true){ } est remplacé par un bloc de code, et le if(false) {} sera tout simplement supprimé.
    • La mise en commentaire de code avec /* et */ peut être gênante avec certains EDIs lors de la réorganisation du code, qui rajoute un " * " devant toutes les lignes.
    • On peut activer le code en un seul endroit, voir même utiliser une constante static pour activer/désactiver d'un coup plusieurs codes. Ce qui se rapproche un peu de la compilation conditionnelle du C...


    a++

  10. #310
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 803
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 803
    Points : 32 056
    Points
    32 056
    Par défaut
    Je nécroposte un peu pour citer un code sur lequel un de mes collègues vient de tomber (en tentant de fiabiliser une série de programmes):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    redim varlist(1)
    redim varlist(2)
    redim varlist(1)
    
    varlist(0)=.....
    varlist(1)=.....
    varlist(2)=.....
    Sans rien entre les redim

    Fatalement, le subscript est out of range.....
    Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
    1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
    2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
    3)le temps de comprendre toutes les exigences, le projet est terminé
    4)le temps de terminer le projet, les exigences ont changé
    Et le serment de non-allégiance :
    Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.

  11. #311
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 28
    Points : 68
    Points
    68
    Par défaut trop de paramètres...
    J'ai eu un gars qui a battu certains records au niveau programmation cryptique... quasiment un obfusctateur à lui tout seul.


    On programme en Java, mais à la base, le gars s'obstine à programmer en procédural avec des classes contenant plusieurs dizaines de grosses procédures (qui peuvent facilement faire une centaine de ligne chacune, voir plus), avec pour chaque procédure au moins 5 à 10 paramètres différents, et dont la plupart de ces paramètres ne servent à rien (plus utilisés, ou bien ils sont là uniquement pour être re-transférés à une autre procédure...)

    Donc ça donne des trucs du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void maFonction(float maxX, float minX, 
            int b12, double minTime, double maxTime,
            boolean condition, Double monCoeff, double pi) {
    
    ...
    Vous noterez en prime l'ordre assez aléatoire des paramètres, qui change d'une méthode à une autre, avec des types pris un peu au pif, et le fin du fin, un paramètre pour transmettre la valeur de Math.PI "parce que ça va ralentir si on appelle cette fonction dans chaque méthode".

    Bien sûr, on l'engueule... mais il s'en fout royalement, sa réponse typique : "de quoi vous vous plaignez, mes formules sont bonnes, ça tourne. Et j'en ai rien à foutre de vos histoires d'informatique, pourquoi je me casserais la tête avec ça, j'ai pas l'intention de faire de la programmation toute ma vie moi...".

    Là-dessus, on met en place un système qui analyse le code et détecte comme suspicieux toute méthode qui a beaucoup de paramètres. Et là le gars il ne se démonte pas, il se met à faire ça : (attention, ça pique les yeux...)

    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
    public void maFonction(float[] args) {
        double maxX = args[0];
        double minX = args[1];
        int b12 = args[2];
        double minTime = args[3];
        double maxTime = args[4];
        double condition = args[5];
        double monCoeff = args[6];
        double pi = args[7];
    
        // et bien sûr il utilisera ça au lieu du booléen
    
        if (condition == 0) {
            // algorithme sans la condition
        } else if (condition == 1) {
           // algorithme avec la condition
        }

    Il a été à peine surpris qu'on ne lui propose pas de CDI...

  12. #312
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Points : 19
    Points
    19
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    if (i == 0)
    return (0);
    if (i == 1)
    return (1);
    if (i == 2)
    return (2);
    if (i == 3)
    return (3);
    ...
    if (i == 24)
    return (24);
    if (i == 25)
    return (25);
    Je sais pas jusqu'ou il serait alle, on l'a coupe a ce moment la!!!!

  13. #313
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 519
    Points : 1 104
    Points
    1 104
    Par défaut
    On croirait que les débutants pensent que certaines choses comme « return i; » sont interdites

  14. #314
    Futur Membre du Club
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Points : 9
    Points
    9
    Par défaut
    Une fois j'ai dû faire de la rétro-ingénérie de code (ah, le développement sans specs...) sur de l'antique Progress 4GL (maintenant OpenEdge ABL), modifié des dizaines de fois par des gens qui n'y connaissaient rien (forcément, un langage pareil) et qui n'avaient pas le temps de ne serait-ce que relire ce qu'ils faisaient.

    Et ça donne des choses géniales avec les copier-coller, comme par exemple :

    Ou, beaucoup plus vicieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // permet de gérer le cas "machin"
    IF fonction1(variable) THEN
    // Enorme pavé de code
    END IF.
    Sauf que fonction1() renvoie fonction2(), qui elle renvoie fonction3a() ou fonction3b(), et que cette dernière renvoie fonction4().

    Et que dans ce bazar (pour rester poli) :
    - fonction3a() renvoie toujours FAUX,
    - fonction4() renvoie une opération booléenne de 15 lignes qui après vérification est équivalente à ... FAUX.

    Ca donne des choses géniales dans l'open-space après
    "Ca vous paraît normal si je vous dit qu'en fait le cas "machin" ne peut pas être géré, parce qu'on ne peut jamais y accéder ?
    - Ah. C'est possible. Le client ne s'est jamais plaint, alors on ne s'est jamais posés la question..."



    --

    Ca c'était ce que j'ai vu dans le taff, mais j'allais oublier le meilleur du meilleur, le fin du fin, un type croisé sur le Site.

    Vue générale : on a un débutant total en PHP/MySQL, qui n'a même pas lu le début du premier tutoriel PHP pour commencer à apprendre, qui veut que les membres lui crachent un script qui fonctionne direct et qui prétend faire des efforts et lire ce qu'on lui écrit.

    Cas 1 : Gestion d'un tournoi, structure de la base de données (oui, toute la base est une seule table) :
    Code sql : 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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    CREATE TABLE `classement` (
      `id` tinyint(10) NOT NULL auto_increment,
      `nom` text collate utf8_bin NOT NULL,
      `j` decimal(10,0) NOT NULL,
      `v` decimal(10,0) NOT NULL,
      `n` decimal(10,0) NOT NULL,
      `d` decimal(10,0) NOT NULL,
      `bp` decimal(10,0) NOT NULL,
      `bc` decimal(10,0) NOT NULL,
      `diff` decimal(10,0) NOT NULL,
      `ma_1` decimal(10,0) NOT NULL,
      `ma_2` decimal(10,0) NOT NULL,
      `ma_3` decimal(10,0) NOT NULL,
      `ma_4` decimal(10,0) NOT NULL,
      `ma_5` decimal(10,0) NOT NULL,
      `ma_6` decimal(10,0) NOT NULL,
      `ma_7` decimal(10,0) NOT NULL,
      `ma_8` decimal(10,0) NOT NULL,
      `ma_9` decimal(10,0) NOT NULL,
      `ma_10` decimal(10,0) NOT NULL,
      `ma_11` decimal(10,0) NOT NULL,
      `ma_12` decimal(10,0) NOT NULL,
      `ma_13` decimal(10,0) NOT NULL,
      `ma_14` decimal(10,0) NOT NULL,
      `ma_15` decimal(10,0) NOT NULL,
      `ma_16` decimal(10,0) NOT NULL,
      `ma_17` decimal(10,0) NOT NULL,
      `ma_18` decimal(10,0) NOT NULL,
      `ma_19` decimal(10,0) NOT NULL,
      `mr_1` decimal(10,0) NOT NULL,
      `mr_2` decimal(10,0) NOT NULL,
      `mr_3` decimal(10,0) NOT NULL,
      `mr_4` decimal(10,0) NOT NULL,
      `mr_5` decimal(10,0) NOT NULL,
      `mr_6` decimal(10,0) NOT NULL,
      `mr_7` decimal(10,0) NOT NULL,
      `mr_8` decimal(10,0) NOT NULL,
      `mr_9` decimal(10,0) NOT NULL,
      `mr_10` decimal(10,0) NOT NULL,
      `mr_11` decimal(10,0) NOT NULL,
      `mr_12` decimal(10,0) NOT NULL,
      `mr_13` decimal(10,0) NOT NULL,
      `mr_14` decimal(10,0) NOT NULL,
      `mr_15` decimal(10,0) NOT NULL,
      `mr_16` decimal(10,0) NOT NULL,
      `mr_17` decimal(10,0) NOT NULL,
      `mr_18` decimal(10,0) NOT NULL,
      `mr_19` decimal(10,0) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=5 ;
    Début du fichier PHP de la page principale :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    mysql_connect("localhost", "l", "");
    mysql_select_db("");
     
    include 'config.php';
    $reponse = mysql_query("SELECT * FROM classement ")

    Mais il y a mieux !

    Cas 2 : Monsieur veut faire un système de pagination. Les gens essaient de comprendre ce qu'il veut, et à la page 5 du topic (5 pages !) voici ce qu'il poste :
    Voilà je code que j'ai fait vis à vis des instructions de Zazou, mais je pense qu'il y a des choses à modifier :
    Code php : 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
    32
    <?php
    mysql_connect("localhost", "", ""); //connexion à la BDD
    mysql_select_db(""); //On sélectionne la base de données.
    if (empty($news)) ?>
        <div class="titre">
        <h2>
            <?php echo $donnees['titre']; ?><!--On affiche le titre-->
        </h2>
    </div>
     
    <div class="date">
        <h3>
            <em>
                Posté le <?php echo date('d/m/Y à H\hi', $donnees['timestamp']); ?><!-- On affiche la date de création grâce à la fonction date et au timestamp-->
            </em>
        </h3>
    </div>
     
    <div class="contenu">
        <p>	
            <?php echo nl2br(stripslashes($donnees['contenu'])); ?><!--On affiche le contenu en rajoutant des balises "<br />" où il faut et en enlevant tous les "/" -->
        </p>
    </div>
     
    <?php else
     
        $id = intval($_GET['id']);//On récupère la variable "id" contenue dans l'URL en sécurisant avec intval().
    	$requete_news_seule = mysql_query("SELECT * FROM news WHERE news_id = $id");//On récupère la seule news qui a comme id le chiffre contenu dans l'URL.
    	$donnees = mysql_fetch_assoc($requete_news_seule);//On met toutes les infos que la requête a récupéré dans un tableau dont les cases ont le même nom que les champs de la table.
        echo ($donnees['news']);
     
    	?>

  15. #315
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    J'ai vu un code pas mal cette semaine (en SQL), c'était quelque chose du genre (le code était encore bien plus horrible à lire) :

    Entrée : @annee (int), @nb_jours (int)

    Code SQL : 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
     
    -- @annee : ...
    -- @nb_jours : nombre de jours écoulés dans l'année @annee
     
    declare @annee_bissextile char(1), @mois int, @jour int
    SELECT @annee_bissextile = 'N'
     
    SELECT @annee_bissextile = 'O'
    WHERE (@annee % 4 = 0) OR (@annee % 100 = 0 AND @annee % 400 = 0)
     
    IF @annee_bissextile = 'O'
    BEGIN
    	IF @nb_jours <= 31
    		SELECT @mois = 1, @jour = @nb_jours
    	ELSE IF @nb_jours <= 60 -- 31 + 29
    		SELECT @mois = 2, @jour = @nb_jours - 31
    	ELSE IF @nb_jours <= 91
    		SELECT @mois = 3, @jour = @nb_jours - 60
    	-- Et ainsi de suite pour les 12 mois de l'année
    END
    ELSE
    BEGIN
    	IF @nb_jours <= 31
    		SELECT @mois = 1, @jour = @nb_jours
    	ELSE IF @nb_jours <= 59 -- 31 + 28
    		SELECT @mois = 2, @jour = @nb_jours - 31
    	ELSE IF @nb_jours <= 90
    		SELECT @mois = 3, @jour = @nb_jours - 59
    	-- Et ainsi de suite pour les 12 mois de l'année
    END

    Plus de 200 lignes de code en tout, et tout ça pour écrire ça :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE @dat datetime -- Et oui, les formats date existent en SQL
     
    SELECT @dat = CONVERT(datetime, @annee + "0101") -- Format de la date : 01/01/@annee
    SELECT @dat = DATEADD(dd, @nb_jours - 1, @dat) -- On rajoute le nombre de jours ecoules (-1, les dates commencent un ... 1er)
    SELECT @mois = DATEPART(mm, @dat) -- Extraction du mois
    SELECT @jour = DATEPART(dd, @dat) -- Extraction du jour

    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  16. #316
    Membre actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 263
    Points
    263
    Par défaut
    Dans une classe java, j'ai vu une fonction de 14 000 lignes.
    all your base are belong to us.

  17. #317
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 519
    Points : 1 104
    Points
    1 104
    Par défaut
    Automatiquement générées ?

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for((i=0;i<24000;i++))
    do
      echo 'myObject.add(5);' >> youpi.java
    done

  18. #318
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 28
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par TheDrev Voir le message
    Dans une classe java, j'ai vu une fonction de 14 000 lignes.
    Ah, pas mal en effet... Après, tout dépend de la longueur des lignes aussi. Parce que si on va par là, ça peut facilement se transformer en une fonction d'une seule ligne

    Moi j'ai déjà connu quelqu'un qui a réussi à dépasser les limites de taille pour une fonction Java, et de beaucoup, avec du code généré à partir d'un fichier Excel. Il ne savait pas programmer une lecture de fichier (ne serait-ce qu'après conversion en CSV...), donc il a tout simplement fait des tonnes de CONCAT dans Excel pour que Excel lui génère des déclarations de tableaux Java comme il faut à partir de son tableau de données, et copier-coller dans un fichier java... Et comme ça ne compilait pas parce que la méthode était trop grosse, il l'a saucissonné en plusieurs méthodes chaînées les unes aux autres.

    Au final, ça donne un code source pour la classe java qui frôlait 1Mo tout de même.

  19. #319
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 259
    Points : 607
    Points
    607
    Par défaut
    Ah oui pas mal, moi j'en ai une de 366ko mais c'est un parseur généré avec JavaCC qui n'est pas avare en ligne de code superflues

  20. #320
    Membre averti Avatar de argonath
    Homme Profil pro
    Ingénieur d'Etudes
    Inscrit en
    Juillet 2009
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'Etudes
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 248
    Points : 381
    Points
    381
    Par défaut
    Aujourd'hui, je dois intégrer quelques classes java d'un collègue dans le projet global.

    au milieu je trouve cette perle "OuiNon.java"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public enum OuiNon
    {
    	Oui, Non
    }
    booléens... première leçon de tout cours d'info non ?

Discussions similaires

  1. Quel est le pire bout de code que vous ayez jamais écrit ?
    Par Gordon Fowler dans le forum Débats sur le développement - Le Best Of
    Réponses: 61
    Dernier message: 31/10/2011, 13h18
  2. Quelle est la plus grosse erreur de programmation que vous ayez jamais commise ?
    Par Katleen Erna dans le forum Débats sur le développement - Le Best Of
    Réponses: 138
    Dernier message: 04/08/2011, 00h38
  3. Petit bout de code que je ne saisis pas trop
    Par MeTaLCaM dans le forum C#
    Réponses: 5
    Dernier message: 03/12/2009, 01h07
  4. [Vos débuts] Quel est le premier langage que vous ayez appris ?
    Par Commodore dans le forum La taverne du Club : Humour et divers
    Réponses: 171
    Dernier message: 02/02/2007, 15h43

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