Une toute fraîchement trouvée (hier). Ce n'est pas ne bourde énorme, mais ça m'a tellement énervé que je vous la poste:
using namespace std dans un header (qui en plus va être inclus partout dans l'appli), cela signifie que tous les fichiers sources vont se farcir le namespace std. Ce qui signifie que nulle part je n'aurai le droit de déclarer une variable qui existe déjà dans la lib standard. Et le problème c'est qu'il y a quand-même pas mal de variables déclarée dans cette lib standard. On n'a donc pas le droit non plus d'utiliser des libs qui utilisent des variables déclarée dans la lib standard.
Code cplusplus : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 // AppTypes.h: LE fichier inclus absolument partout dans l'application #include <vector> // autres includes using namespace std; // code
Et comme il s'agit d'un projet déjà bien avancé et assez imposant, la suppression de ce using namespace std va impliquer pas mal de modifs et de tests (une modif n'est jamais anodine)... et dans l'histoire, tout ce que j'ai gagné c'est la haine de mes collègues programmeurs
En java,
Je vois couramment des cast en classe fille pour appeler une méthode de la classe mère :
à l'appel :
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 class A { void callme() {} } class A1 extends A { void callme() { // traitement 1 } } class A2 extends A { void callme() { // traitement 2 } }
Polymor-quoi???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 A a; if (a instanceof A1) { ((A1) a).callme(); } else if (a instanceof A2) { ((A2) a).callme(); } else { a.callme(); }
Moins grave mais lourd, des classes qui se ressemblent, toutes portent une méthode update().
à l'appel :
Interface tu connais?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 void updateAll() { instance1.update(); instance2.update(); instance3.update(); instance4.update(); // ... 25 fois }
Ecouteur/écouté ?
Une perle : le stockage de this casté en classe mère :
En fait, c'est une tentative d'appeler la méthode mère sans qu'elle soit surchargée dans la classe fille
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 class Mere { void callme() {} } class Fille extends Mere { Mere maman; MaClass() { maman = (Mere) this; } @Override void callme() { // ... } void other() { if(maman != null) { maman.callme(); } } }
Droit à la palme d'or(dure) ?
Le test si maman != null est énorme non?
Là quand même à ce stade , c'est triste de pas connaitre le compotement de son langage face à la polymorphie.
Oui bon alors ne soyons pas dur !!!
Je me souviens avoir réinventer le principe des sémaphores en C++ quand j'ai débuté normal je suis pas informaticien à la base donc je ne connaissais rien au multithreading ....
Le pire c'est que ça a marché !! sauf 2 ou 3 fois par mois lol véridique ! ils se sont arraché les cheveux avec mon "bug" ...
Donc je me tais et je fais profil bas lol
Ca a déjà été dit, ici et ailleurs, mais il est toujours bon de le rappeler:
Tout le monde fait des bourdes, c'est humain. L'important c'est de savoir s'en rendre compte - accepter les critiques, se remettre en question quand il y a des bugs, prendre le temps de lire sur le sujet (la doc, du bon code, les specs, developpez.com...), prendre le temps de discuter, bref, ne pas se jeter sur le code sans prendre un minimum de recul - et s'en souvenir pour ne plus reproduire ces erreurs.
Il y a quelqu'un qui a ça dans sa signature, à peu de chose près: "un homme fort n'est pas quelqu'un qui ne tombe jamais, mais quelqu'un qui sait se relever"
Perso j'ai souvent vu des nouveaux projets qu'on confiait aux stagiaires pour pas détourner des ressources.
Au fil du temps le projet, s'il marche pas trop mal, finit par être couramment utilisé, mais le mal est fait: c'est quand même un stagiaire qui l'a fait, sans que personne ne fasse de relecture de code.
Va expliquer le besoin de repasser sur du code qui marchouille dans une grosse boite (je travaille dans une banque dont le logo devrait plus être un mammouth qu'un écureuil je précise)
Donc on se retrouve avec une montagne de code bizarre qui marche mais qui est incompréhensible et inmaintenable.
Allez un petit exemple pour la route une tite web-application, de la part de quelqu'un qui trouve que le javascript, c'est vachement mieux que l'HTML:
Avec le détail de la fonction javascript:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <body onLoad="showDF(year, month, day);"> ... <div id='td-search-date'></div> ...
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 function showDF(year,month,day,debut,fin) { document.getElementById("td-search-date").innerHTML=getDayhtml(year,month,day,debut,fin); } function getDayhtml(year,month,day,debut,fin) { dayHTML = "<span id='divDay' class='PortletNavigate_p1_smenu_dominante2' style='visibility:visible;position:relative'>"+ "<table width='100%' height=''>"+ "<tr>"+ "<td valign='top'>"+ "<table width='200' border='0'>"+ "<tr>"+ "<td width='200' height='9' class='menu_haut'><img src='/comptage/web/charte-rte/images/spacer.gif' width='200' height='9'></td>"+ "</tr>"+ "<tr>"+ "<td valign='top' class='menu_milieu'>"+ "<table width='200' height='20' cellpadding='0' cellspacing='0' border='0'>"+ "<tr>"+ "<td width='4'><img src='/comptage/web/charte-rte/images/spacer.gif' width='4' height='15'>"+ "</td>"+ "<td class='dataOther' width='100' colspan=2>"+debut+ "</td>"+ "</tr>"+ "<tr>"+ "<td width='4'><img src='/comptage/web/charte-rte/images/spacer.gif' width='4' height='15'>"+ "</td>"+ "<td class='titremenu_gauche' colspan=2 nowrap=nowrap>"+ "<INPUT type=TEXT NAME=jourObjetDate1 class='corps_de_texte_petit_gris' size=2 maxlength=2 value='"+day+"'>/"+ "<INPUT type=TEXT NAME=moisObjetDate1 class='corps_de_texte_petit_gris' size=2 maxlength=2 value='"+month+"'>/"+ "<INPUT type=TEXT NAME=anneeObjetDate1 class='corps_de_texte_petit_gris' size=4 maxlength=4 value='"+year+"'> "+ "<INPUT type=TEXT NAME=heureObjetDate1 class='corps_de_texte_petit_gris' size=2 maxlength=2 value='0'>:"+ "<INPUT type=TEXT NAME=minuteObjetDate1 class='corps_de_texte_petit_gris' size=2 maxlength=2 value='0'>:"+ "<INPUT type=TEXT NAME=secondeObjetDate1 class='corps_de_texte_petit_gris' size=2 maxlength=2 value='0'>"+ "</td>"+ "</tr>"+ "</table>"+ "<table width='200' height='20' cellpadding='0' cellspacing='0' border='0'>"+ "<tr>"+ "<td width='4'><img src='/comptage/web/charte-rte/images/spacer.gif' width='4' height='15'></td>"+ "<td class='dataOther' width='100' colspan=2>"+fin+ "</td>"+ "</tr>"+ "<tr>"+ "<td width='4'><img src='/comptage/web/charte-rte/images/spacer.gif' width='4' height='15'></td>"+ "<td class='titremenu_gauche' colspan=2 nowrap=nowrap>"+ "<INPUT type=TEXT NAME=jourObjetDate2 class='corps_de_texte_petit_gris' size=2 maxlength=2 value='"+day+"'>/"+ "<INPUT type=TEXT NAME=moisObjetDate2 class='corps_de_texte_petit_gris' size=2 maxlength=2 value='"+month+"'>/"+ "<INPUT type=TEXT NAME=anneeObjetDate2 class='corps_de_texte_petit_gris' size=4 maxlength=4 value='"+year+"'> "+ "<INPUT type=TEXT NAME=heureObjetDate2 class='corps_de_texte_petit_gris' size=2 maxlength=2 value='23'>:"+ "<INPUT type=TEXT NAME=minuteObjetDate2 class='corps_de_texte_petit_gris' size=2 maxlength=2 value='59'>:"+ "<INPUT type=TEXT NAME=secondeObjetDate2 class='corps_de_texte_petit_gris' size=2 maxlength=2 value='59'>"+ "</td>"+ "</tr>"+ "</table>"+ "</td>"+ "</tr>"+ "<tr>"+ "<td width='200' height='9' class='menu_bas'><img src='/comptage/web/charte-rte/images/spacer.gif' width='200' height='9'></td>"+ "</tr>"+ "</table>"+ "</td>"+ "</tr>"+ "</table>"+ "</span>"+ "</td>"+ "</tr>"+ "</table>"+ "<input type='hidden' name='dateType' value='parjour'>"; return dayHTML; }
dans le même style que ça.....
*Vu chez un éditeur de logiciel, qui vend un pseudo-langage : la compilation a été faite par un stagiaire. Alors, l'utilisateur peut définir un type de données, une donnée, une "règle"(une ligne de code), des contenants divers......mais quand on compile, à chaque compilation d'élément, on revérifie tout en bloc. Donc si 500 données utilisent le même type, le type en question est vérifié 500 fois. Et si chaque donnée est utilisée dans 9 règles, le type de donnée est vérifié 5000 fois. A chaque compil. (mais il me semble qu'ils ont corrige à un moment ou à un autre).
*Vu dans une banque qui sponsorise le rugby : on demande au stagiaire de faire les statistiques de la nouvelle application(qui marche bien par ailleurs). 7 colonnes(dont une de total), une vingtaine de lignes(totaux, moyennes, variations mensuelles, etc.....). Il fait le tout en une requête SQL. Évidemment illisible, et qui de plus ralentit considérablement au fur et à mesure que le temps passe et que la base s'étoffe. Au bout de 13 mois, le gestionnaire(moi) ne peut plus consulter les statistiques, la requête dépasse les 30 secondes qui déclenchent un time-out..... Je suis parti à ce moment là, en souhaitant bien du plaisir à mon successeur.
Travaillant en temps que developpeur dans le domaine de la télévision sur IP, nous avons recemment reçu d'un associé une API a tester.
En commencant à tester ça (du php, javascript,...) on se rend compte que pas grand chose ne marche.
On commence un peu a éplucher le contenu des fichiers qui nous ont été fournis, et on tombe la dessus
faut admettre qu'avec 3 's' ça ne fonctionne pas plus rapidement. Et moi qui pensait que des grosses boites qui codaient des APIs faisaient a bien, et bien la j'ai envie de dire "ou pas"...
Code : Sélectionner tout - Visualiser dans une fenêtre à part $_SESSSION
Je me souviens d'une appli web ASP (l'ancien, pas .Net) que nous avions étudiée pour en reprendre les principes dans une appli aux normes du jour.
Les requêtes SQL étaient générées en javascript à la volée dans la page et faisaient une taille certaine...
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