Une très grosse entreprise, connus par tous. (Ce qui est sans doute le plus désolant)
http://alaindefrance.wordpress.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
SDE at BitTitan
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é !!
Je profite de ce post pour faire une petite parenthèse :
quand dans un fichier .cpp .php .java .js je voit ca :
Certains développeurs m'expliquent que ca permet d'activer / desactiver du code rapidement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 if(true){ ... code à executer ou pas }
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 ajoutant ou en enlevant un slash sur la première ligne on peut commenter / décommenter le bloc de code.
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 // */
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 :
NB: si vous incluez jquery dans une page html et ce bout de code vous devriez pouvoir le voir fonctionner
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="msg">Vous êtes sur le point de supprimer définitivement ce commande, êtes vous sur de vouloir continuer ?</div><div class="msg-warning-show-command"><a href="detail.php?id=<?php echo $id ; ?>">Voir le détail de la commande</a></div><div class="button" id="msg-warning-button-no" >NON revenir à la liste</div><div class="button" id="msg-warning-button-yes">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="msg">Vous êtes sur le point de supprimer définitivement ce commande, êtes vous sur de vouloir continuer ?</div><div class="msg-warning-show-command"><a href="detail.php?id=28">Voir le détail de la commande</a></div><div class="button" id="msg-warning-button-no" >NON revenir à la liste</div><div class="button" id="msg-warning-button-yes">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>
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.
en C tu peux jouer avec des #ifdef, ensuite en fonctions des defines de compilation ton code est actif ou pas.Comme ils sont nouveaux, je leur donne l'astuce suivante qui marche en C++ (pas en C) en Java , en php, et en javascript.
Exemple bateau
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #ifdef DEBUG printf("ma trace de debug\n"); #endif
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
À noter que Kate colore un bloc « #if 0 ... #endif » comme un commentaire
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++
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):
Sans rien entre les redim
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)=.....
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.
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 :
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".
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) { ...
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...
Je sais pas jusqu'ou il serait alle, on l'a coupe a ce moment la!!!!
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);
On croirait que les débutants pensent que certaines choses comme « return i; » sont interdites
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 ASSIGN a = a.
Sauf que fonction1() renvoie fonction2(), qui elle renvoie fonction3a() ou fonction3b(), et que cette dernière renvoie fonction4().
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.
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) :
Début du fichier PHP de la page principale :
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 ;
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']); ?>
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
Dans une classe java, j'ai vu une fonction de 14 000 lignes.
all your base are belong to us.
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
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.
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
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"
booléens... première leçon de tout cours d'info non ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public enum OuiNon { Oui, Non }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager