# Le club des professionnels en informatique > La taverne du Club : Humour et divers >  [Tutoriel] L'art de programmer salement

## 10_GOTO_10

On voit souvent, sur ce site comme sur d'autres, des articles sur  comment coder proprement ,  les bonnes habitudes de programmation , etc, etc... En revanche, j'ai vu trs peu d'articles expliquant comment coder salement. Je tiens  rparer cet oubli dans ce tutoriel qui, je l'espre, vous servira et vous permettra de le mettre en pratique sans dlai.

Et effet, ma longue exprience dans des entreprises diverses et varies m'a convaincu que, si programmer proprement vous vaut les flicitations de votre suprieur (et encore), les raisons de programmer salement sont gnralement bien plus nombreuses : besoin d'affirmer son autorit, de se rendre indispensable, ncessit de crer aujourd'hui les bugs de demain, vengeance personnelle, bizutage des nouveaux, principe de Dilbert, tout vous pousse  programmer comme un gros porc. D'ailleurs, tant donn tout le code dgueulasse que j'ai vu dans ma carrire, je suis persuad que la majorit d'entre vous en tes dj convaincus.

Mais j'en vois dj qui vont me dire  pour programmer salement, il suffit de ne pas programmer proprement . Pourquoi faire un article l-dessus ? Alors l je m'inscris en faux et je m'insurge : Si ne pas programmer proprement est  la porte de n'importe quel dbutant, programmer salement est un art qui demande des comptences, une parfaite connaissance des langages de programmation, de l'inventivit, de la subtilit et de la crativit.

A part quelques gnies qui font a de manire inne (je ne citerais pas de noms mais j'en connais), c'est un domaine qui s'apprend, qui se travaille, et qui ncessite un effort quotidien. Je tiens  cette occasion  remercier mon ancien chef qui m'a tout appris dans ce domaine, et sans qui je ne serais qu'un  expert en dveloppement  comme on en voit des milliers.

*1) Le nommage des variables*

La technique de base pour programmer salement, quel que soit le langage, rside dans le nommage des variables. Mais bien entendu il ne faut pas faire a n'importe comment : appeler une variable  sslkhskldghlfd  sera vu comme un acte de sabotage vident. Par contre, appeler une variable  Toponime ,  DatteInsrciption  avec des petites fautes d'orthographes (mais totalement conforme  la charte de programmation si vous en avez une) passera presque inaperu. Le temps que quelqu'un s'en aperoive, le code concern aura t copi-coll un peu partout, utilis dans les classes drives, et il sera trs vite plus coteux de le remplacer partout que de le laisser tel quel.
Si vous avez la chance d'utiliser un langage qui accepte les accents (VB, ACCESS), ne vous en privez surtout pas : code non portable, problmes d'affichage pour certains diteurs, cration automatique de BOM ou transformation en Unicode pour d'autres, gestionnaire de sources configur en ANSI, le pouvoir de nuisance des accents est redoutable. Vous pouvez aussi tirer un large parti des mots franais et anglais qui se ressemblent, comme  connexion  et  connection ,  langage  et  language ,  fonction  et  function ,  en mlangeant habilement franais et anglais :  OpenConnexion  ou  OuvreConnection  sont d'excellents noms de fonction, par exemple.

*2) L'indentation*

Veillez  respecter trs prcisment l'indentation de votre code. Plus vous avez une indentation rigoureuse, plus vous pourrez y glisser quelques imperfections d'autant plus vicieuses que tout le reste est parfait, comme dans le code suivant :



```

```

*3) Ne jamais mettre de parenthses, sauf lorsque c'est inutile*

Pour appliquer cette rgle, il vous faudra connatre sur le bout des doigts la priorit des oprateurs, priorits d'autant plus amusantes  apprendre qu'elles sont diffrentes selon les langages. Vous pourrez ensuite allgrement mlanger les  and  et les  or , les  =  et les  == , les  &  et les  &&  pour faire des conditions dont le rsultat sera pratiquement imprvisible sans passer dessus avec le debugger. N'oubliez pas les oprateurs peu connus : par exemple en C++ l'oprateur virgule, l'oprateur bool ou l'oprateur vide. Vous pouvez mme les redfinir, et c'est encore plus intressant : l'oprateur  -  peut tre redfini pour que  a - b  renvoie la valeur de a + b.

*4) Jamais les bons commentaires*

C'est la partie qui fera le plus appel  votre crativit : ne pas mettre de commentaires dans vos programmes serait une faute professionnelle. Mettre des commentaires pertinents serait improductif. Ici, tout le talent consiste  mettre des commentaires, mais suffisamment inutiles ou imprcis pour qu'ils ne servent  rien. Mettez-y le maximum de fautes d'orthographe afin que, mme s'ils contiennent encore quelques informations intressantes, ils soient tellement dsagrables  lire que personne ne le fera.

*5) Les lignes n'ont pas que 80 caractres*

N'hsitez pas  mettre le maximum d'instructions sur la mme ligne. Les subtilits que vous mettrez dans vos programmes seront d'autant plus discrtes. Encore plus vache : mettez une centaine de blancs avant les instructions importantes. Le stagiaire, qui n'a qu'un cran 17 pouces, ne les verra jamais : elles sont  droite de la partie visible et il faut scroller pour les voir. Bien sr il n'y comprendra donc rien et vous pourrez le traiter de nul. Soyez odieux avec les stagiaires, c'est bon pour votre avancement.

*6) Variables prprocesseur*

Je vous conseille d'utiliser les petites astuces suivantes avec parcimonie, leur efficacit tant amoindrie par une utilisation trop intensive. Trop de sale tue le sale. Nanmoins, il est bon de les connatre et de les utiliser de temps en temps :

Par exemple, si a la ligne 1352 de votre programme C++, dans une fonction effroyablement complexe, vous avez l'instruction suivante :



```
Variable = 0;
```

Vous pouvez avantageusement la remplacez-la par ceci :



```
Variable = __LINE__ - 1352;
```

Rsultat : le simple fait de copier-coller cette fonction  un autre endroit la fera trs certainement planter. Mme l'insertion d'une ligne vide avant la ligne 1352 changera le comportement de la fonction. Une bonne occasion pour engueuler l' imbcile qui a fait une connerie  (le stagiaire qui a ajout un commentaire, par exemple). Il faut que les stagiaires comprennent bien qu'ils n'ont pas  toucher au code. Leur boulot c'est de faire le caf.

De la mme faon, en PHP, on peut utiliser le mot-cl prprocesseur  __FILE__  qui donne le nom complet du fichier. Vous voyez l'astuce ? Vous testez cette variable, et le seul fait de dplacer le fichier fait planter le programme. Si on vous fait une remarque, vous pourrez dire innocemment  Ah bon ? Chez moi a marche ! .

Pour plus d'efficacit, vous pouvez bien sr combiner les points 5 et 6 et mettre ces instructions  la fin des lignes trs longues et totalement imbitables.

*7) C'est devenu un classique, mais vous pouvez toujours l'utiliser, a ne coute rien :*



```

```

*8) Et pour finir* dans la mme veine, je vous rappelle ce petit chef-d'oeuvre qui a failli tre intgr au noyau Linux en 2003. C'est un modle du genre sur lequel vous pouvez prendre exemple :



```

```

En vous souhaitant  tous des programmes bien crados, je vous invite  complter ce tutoriel si vous avez vous-mme des techniques de sale programmation que j'aurais oubli.

----------


## el_slapper

Mon pre a un jour crois du code avec des noms de variables et des commentaires en Slovaque. En France dans une boite Allemande(et  l'poque sans aucun site dans ce qui tait encore la Tchcoslovaquie).  ::aie::

----------


## illight

Vous allez rire, mais je suis en train de reprendre du code (Access) o :
- les noms de requtes sont Requte1, requte2 jusqu' 10 ou 11, mais qui s'appelle entre elles, sans aucun critre complmentaire
- des noms de variables, genre toto, tata, maman  ::aie:: 
- aucun commentaire sur rien

Bref, un rgal de truc sale  ::mrgreen::

----------


## Bovino

> 1) Le nommage des variables


Une technique assez vicieuse est aussi de donner aux variables ou aux fonctions des noms qui ne correspondent pas  leur contenu.

----------


## el_slapper

Variante du 5, particulirement efficace en COBOL(car en COBOL, le point ferme tous les IF ouverts) :


```

```

(pour info, le PERFORM appelle une procdure)
imaginez que BLA_BLA, BLI_BLI et BLU_BLU peuvent tre vraies toutes les trois... Il y en avait sur 800 lignes. J'ai du tout imprimer, stabiloter, reformater, refactorer, a m'a pris plus d'une semaine...pour juste trouver un petit truc et faire une micro modif. Je n'ai rien compris au reste du programme.  ::aie::

----------


## shadowmoon

> du code (Access) o  ... les noms de requtes sont Requte1, requte2 jusqu' 10 ou 11, mais qui s'appelle entre elles, sans aucun critre complmentaire


Une fois, j'ai vu un truc plus sale, dans un code C# : Des fonctions nommes fonc1, fonc2 ... jusqu' fonc16, qui s'appellent entres-elles et avec, en plus, de la rcursivit. Le tout dans des if en  cascade, parfois conditionns par les fonctions.

 donnait un truc dans le genre



```

```

----------


## Robin56

Franchement j'adore 10_GOTO_10,  quand le tutoriel officiel ?  ::mouarf::

----------


## ManusDei

Ca me fait penser  autre chose de trs sale, jouer sur les options de compilation pour que a compile uniquement avec telle ou telle version des libs, ou (plus simple pour soi) uniquement quand on utilise une ou plusieurs options obscures du compilateur (sans l'avoir document).

Rajouter une surcouche au prprocesseur, qui ne fait pas grand chose, mais empche toute compilation future. Par exemple la redfinition de + en - peut se faire l aussi, au bout de combien de temps le dev ira voir la chane de compilation pour comprendre pourquoi sa nouvelle fonction qui fait des additions renvoie des rsultats anormaux ?

----------


## rawsrc

Dans la mme srie, pas plus tard que rcemment, j'ai eu  modifier un programme de facturation pour l'aligner sur le nouveau taux de TVA  20%.
Je parcours les tables et tombe sur une bien nomme *TauxTVA*. Je me dis chouette, a devrait le faire. En plus dedans une seule et unique ligne avec une TVA  19,6%.
Bon, je fais la modification et teste une facturation bidon histoire de voir si cela a bien t pris en compte...

Oh la surprise, TVA toujours  19,6% !!!

Aprs investigations, le pingouin n'a rien trouv de mieux que de coder le taux de TVA en dur dans chaque formulaire : 


```
if (date <= ...) { TVA = 0.186; } elseif (date <= ...) { TVA = 0.196; } else ...
```

Au final et aprs dpiautage, *aucune partie du programme ne faisait appel  ce fichu taux de TVA prsent dans la table TauxTVA*.

Fail ^^

----------


## Auteur

J'ai pu voir  plusieurs endroits du forum qu'une mthode dite "larache" tait parfois applique lors de l'laboration de certains logiciels. Voir les liens ci-dessous pour plus de dtails :

http://www.developpez.net/forums/d10...e/#post6059124
http://www.developpez.net/forums/d12...e/#post6882207
http://www.developpez.net/forums/d10...n/#post5703097

----------


## Katyucha

> J'ai pu voir  plusieurs endroits du forum qu'une mthode dite "larache" tait parfois applique lors de l'laboration de certains logiciels. Voir les liens ci-dessous pour plus de dtails :
> 
> http://www.developpez.net/forums/d10...e/#post6059124
> http://www.developpez.net/forums/d12...e/#post6882207
> http://www.developpez.net/forums/d10...n/#post5703097


Mais l, ce n'est pas de larrache, ici, on le fait exprs pour emmerder le monde  ::):

----------


## Jabbal'H

Un ami a vu il y a peu sur un programme en Delphi une option de compil sympa, cela autorise les dpassements d'index de tableau :d
Le soft Delphi tait migr en c#, il s'est arrach les cheveux  comprendre pourquoi  plantait sur le code migr (c#) et pas sur le Delphi ! :d

----------


## Aurlien LEQUOY

> Variante du 5, particulirement efficace en COBOL(car en COBOL, le point ferme tous les IF ouverts) :
> 
> 
> ```
> 
> ```
> 
> (pour info, le PERFORM appelle une procdure)
> imaginez que BLA_BLA, BLI_BLI et BLU_BLU peuvent tre vraies toutes les trois... Il y en avait sur 800 lignes. J'ai du tout imprimer, stabiloter, reformater, refactorer, a m'a pris plus d'une semaine...pour juste trouver un petit truc et faire une micro modif. Je n'ai rien compris au reste du programme.


ca me rapelle des souvenir la BNP

21 pages de transact SQL pour dire je suis pas en france mais je suis en europe donc je suis en espagne !

----------


## el_slapper

> ca me rapelle des souvenir la BNP
> 
> 21 pages de transact SQL pour dire je suis pas en france mais je suis en europe donc je suis en espagne !


J'ai boss  la BNP, mais a, c'tait ailleurs.

Enfin, dans tous les langages il y a probablement moyen de mettre ce genre de trompe-l'oeil...  ::aie::

----------


## Darkzinus

> Variante du 5, particulirement efficace en COBOL(car en COBOL, le point ferme tous les IF ouverts) :
> 
> 
> ```
> 
> ```
> 
> (pour info, le PERFORM appelle une procdure)
> imaginez que BLA_BLA, BLI_BLI et BLU_BLU peuvent tre vraies toutes les trois... Il y en avait sur 800 lignes. J'ai du tout imprimer, stabiloter, reformater, refactorer, a m'a pris plus d'une semaine...pour juste trouver un petit truc et faire une micro modif. Je n'ai rien compris au reste du programme.


Diabolique ce code  ::D:

----------


## sosolal

si vous voulez avoir du vrai code crade, regardez le code de la bibliothque standard

----------


## Etanne

Un petit lien qui m'a fait penser  cette discussion : How To Write Unmaintainable Code 

Une belle bible !  ::aie::

----------


## Mr_Exal

> Une technique assez vicieuse est aussi de donner aux variables ou aux fonctions des noms qui ne correspondent pas  leur contenu.


Ou sinon il y a la technique d'appeler ses variables de telle faon :

_
__
___
____
_____
______

C'est simple, efficace et on peut mme se perdre soit mme dans ce ddale d'underscore.

----------


## Invit

> Ou sinon il y a la technique d'appeler ses variables de telle faon :
> 
> _
> __
> ___
> ____
> _____
> ______
> 
> C'est simple, efficace et on peut mme se perdre soit mme dans ce ddale d'underscore.


Ouah ! Pas mal !!! Sinon, des noms de variable comme mon pseudo, a peut aussi pousser au meurtre !

----------


## Katyucha

> Ouah ! Pas mal !!! Sinon, des noms de variable comme mon pseudo, a peut aussi pousser au meurtre !


Il existe des programmes qui le font dj. Ca parse ton code et remplace les variables par des chaines alatoires assez longues. Je vous avoue : Relecture Treeeees fastidieuse

----------


## Mr_Exal

> Il existe des programmes qui le font dj. Ca parse ton code et remplace les variables par des chaines alatoires assez longues. Je vous avoue : Relecture Treeeees fastidieuse


Une sorte d'obfusquation de code ? En gnral tu travailles pas sur du code obfusqu sinon gare aux noeufs de cerveau (OUI Y A UNE FAUTE C'EST FAIT EXPRES !)

----------


## Iradrille

Personne n' parl de l'oprateur "down to" ?

```

```


Aussi, pour plus de clart toujours donner des conditions compltes

```

```

----------


## Sodium

En lisant un bouquin sur le Javascript avanc, je suis tomb sur l'instruction "with".
Je n'avais jamais entendu parler de ce truc, et pour cause, l'auteur dconseille de l'utiliser pour cause de lisibilit.
Ca peut tre trs utile pour coder salement par contre.



```

```

----------


## Mishulyna

> *5) Les lignes n'ont pas que 80 caractres*
> 
> N'hsitez pas  mettre le maximum d'instructions sur la mme ligne.


Vous voulez dire que


```
m.getFkolfactiveFinesseEtComplexite().setIdolfactiveFinesseEtComplexite(millesimeController.getOlfactiveFinesseEtComplexiteController().getEjbFacade().findByName(millesimeController.getOlfactiveFinesseEtComplexiteController().getCurrent().getNom()).getIdolfactiveFinesseEtComplexite());
```

vous semble trop longue comme ligne de code? J'ai galement un cran de 17", vous exagrez l... ::mrgreen::  (Par contre, j'aurais bien aim tordre le cou de celui qui a nomm les attributs de la classe lors de l'analyse).

----------


## zecreator

Bon, on est tous d'accord pour dire que le type mme du sale code est celui :
- non comment
- aux noms de variables et fonctions improbables
- sans indentation

mais il ne faut pas oublier galement :
- les includes appels et non utiliss
- les fonctions qui ne servent  rien


```

```

mais le pire du pire du pire pour moi, c'est l'invention de l'ofuscation de code. Non seulement a ne sert plus  rien depuis des annes. On a trouv le truc pour voir votre code les gars, inutile de le planquer.

----------


## Mr_Exal

> Bon, on est tous d'accord pour dire que le type mme du sale code est celui :
> - non comment
> - aux noms de variables et fonctions improbables
> - sans indentation
> 
> mais il ne faut pas oublier galement :
> - les includes appels et non utiliss
> - les fonctions qui ne servent  rien
> 
> ...


Et bien non je ne suis pas d'accord. A partir du moment o ton code est propre et o les variables ont des noms cohrents la plupart des commentaires (95%) est inutile.

Quant  loffuscation il y a encore pire, les langages maison (hop le dveloppeur est enferm chez nous il capitalisera aucune exprience  part chez nous hhh).

----------


## Bovino

> A partir du moment o ton code est propre et o les variables ont des noms cohrents la plupart des commentaires (95%) est inutile.


Certes, mais en mme temps, si tu veux coder salement (ce qui est le but de la discussion) et que ton code est propre, bien indent, avec une logique cohrente et des noms de variables judicieux, c'est que tu codes salement comme un porc !  ::mouarf::

----------


## Mr_Exal

> Certes, mais en mme temps, si tu veux coder salement (ce qui est le but de la discussion) et que ton code est propre, bien indent, avec une logique cohrente et des noms de variables judicieux, c'est que tu codes salement comme un porc !


D'o le fait que mettre tout un tas de commentaires inutiles qui nuisent  la lisibilit du code est du code sale contrairement  ce que dit @zecreator  ::mrgreen::

----------


## Sodium

Pour le moment je bosse avec "un dveloppeur" qui me pond rgulirement des exemples assez fantastiques :



```

```


Bien-sr encore l a va, il suffit d'intenter, arer et retirer quelques lments inutiles, mais il faut imaginer a quelques fois sur des centaines de ligne, jamais encapsul en fonctions, avec une redondance du code olympique. Je me souviens d'un cas o j'ai du rcrire compltement 600 lignes compresses en une fonction de 150 pour viter d'avoir  corriger 10 fois une erreur de variable non dclare dans un bout de code copi-coll.

----------


## eulbobo

On peut aussi rajouter dans son code des trucs totalement idiots, totalement inutiles, mais qui marchent...



```

```


(je viens de tomber dessus dans un bout de code sur lequel je bosse, et j'ai bloqu pendant 5 minutes sur mon cran... A essayer de comprendre comment ils ont pu en arriver l.. J'ai toujours pas compris...)

----------


## zecreator

> Pour le moment je bosse avec "un dveloppeur" qui me pond rgulirement des exemples assez fantastiques :
> 
> 
> 
> ```
> 
> ```
> 
> 
> Bien-sr encore l a va, il suffit d'intenter, arer et retirer quelques lments inutiles, mais il faut imaginer a quelques fois sur des centaines de ligne, jamais encapsul en fonctions, avec une redondance du code olympique. Je me souviens d'un cas o j'ai du rcrire compltement 600 lignes compresses en une fonction de 150 pour viter d'avoir  corriger 10 fois une erreur de variable non dclare dans un bout de code copi-coll.


L y a un problme d'ducation du dveloppeur et un manque de respect de sa part vis--vis de son quipe. Genre : "Je code comme je veux et aprs tu te dmardes, j'ai fais mon taf.". Le genre de dveloppeur que je fuis  toutes jambes.

----------


## pcaboche

Le tutoriel sur l'art de programmer salement est trs intrssant, cependant il manque tout le chapitre concernant la programmation oriente objet.

En effet, c'est dingue tous les trucs crades qu'on peut faire avec de la POO...


Le but ici, c'est d'parpiller le code absolument partout. Par exemple :
- on peut commencer par avoir une norme hirarchie de classes avec au moins 4 ou 5 niveaux d'hritage
- au lieu d'utiliser un Dcorateur ou un Composite, dfinissez autant de sous-classes qu'il existe de combinaisons possibles (dj vu sur un projet rel)

Maintenant qu'on a des classes dans tous les sens, place  l'implmentation des mthodes...

- trs important pour la "lisibilit" : utilisez des mthodes courtes, qui appellent d'autres mthodes. Appliquez ce conseil  la lettre, sauf que les diffrentes mthodes en question seront implmentes  des niveaux diffrents de la hirarchie...  ::mrgreen:: 

- grce  la magie du polymorphisme, il devient extrmement difficile de savoir laquelle des classes parentes implmente la mthode en question

- pour encore plus de confusion, usez (et abusez) du pattern Template Method (dans lequel la structure d'un algorithme est dfini dans la classe parente, mais le comportement est implment dans l'une des classes filles)


Mais mon pattern prfr, cela reste "Dependency Injection", ou "comment transformer toutes les erreurs de compilation en erreurs d'execution"  ::mrgreen:: . Combinez "Dependency Injection" avec tout ce qui a t dit ci-dessus, c'est juste magique !  ::mrgreen::   ::mrgreen::   ::mrgreen:: 


Aprs, on peut faire des trucs rigolos en abusant des exceptions ou en introduisant des comportements non-dterministes (traduction : _"a bug, mais seulement de temps en temps, et c'est quasiment impossible  reproduire de manire consistante"_  ::mrgreen:: ) mais a, ce sera pour un autre chapitre...

----------


## Sodium

En parlant de POO, le mme type avait des trucs rigolo aussi : le constructeur et une bonne partie des mthodes d'une classe parent tait recopi dans ses descendants directs  ::mrgreen::

----------


## eulbobo

Vous le savez, l'utilisation de l'oprateur ! (not) est moche et pas trs lisible.
Bannissez donc le not de tous vos programmes et soyez imaginatifs pour vous en sortir

Plutt que d'crire


```

```

Utilisez la notation ci-dessous, bien plus vicieuse :


```

```

Abusez de l'oprateur ternaire de manire inverse !


```
if (myBoolean?false:true)
```

Ou soyez vicieux


```
if (myBoolean^true)
```

Trs vicieux


```
if (myBoolean^true?true:false)
```

----------


## foetus

> Vous le savez, l'utilisation de l'oprateur ! (not) est moche et pas trs lisible.
> Bannissez donc le not de tous vos programmes et soyez imaginatifs pour vous en sortir


Cela me fait penser  un truc: j'ai invers mes boolens pour viter de faire le non. Et c'est assez tordu  ::mrgreen:: 




```

```

----------


## eulbobo

ARRRGH

C'est quoi ce joli code lisible et comprhensible du premier coup ?
Fais le minimum, renomme la variable histoire qu'elle indique au moins l'inverse de ce qu'elle est cense faire ! (je recommande systmatiquement lors de l'utilisation de variables boolennes d'ailleurs)




```

```

----------


## ManusDei

> Utilisez la notation ci-dessous, bien plus vicieuse :
> 
> 
> ```
> 
> ```


Cette notation est thoriquement plus optimise question performances, donc historiquement a du sens.
Bon, vu que a doit faire des annes (des dcennies ?) que les compilateurs savent optimiser a tout seul...

----------


## lper

Manque pas un "else {}" devant votre "//plein de code"....

----------


## pcaboche

> Manque pas un "else {}" devant votre "//plein de code"....


Non, parce qu'il a mis un "continue" pour passer  boucle suivante (oui, c'est tratre...  ::mrgreen:: ).

----------


## lper

> Non, parce qu'il a mis un "continue" pour passer  boucle suivante (oui, c'est tratre... ).


Arf, fallait bien qu'un pquin comme moi se fasse avoir !  ::aie::

----------


## el_slapper

a dpend des langages, a, en COBOL, le CONTINUE ne fait juste rien...  ::aie::

----------


## Darkzinus

> a dpend des langages, a, en COBOL, le CONTINUE ne fait juste rien...


Ca c'est quand les gens aiment pas les "NOT =" souvent. Ils mettent un "continue" dans le IF et le ELSE contient le code excut. C'est de toute beaut  ::aie::

----------


## eulbobo

Et je viens de me rendre compte que je n'ai pas fait une rgle de base du code sale : j'ai utilis des parenthses !

Allez, combo avec les rgles des booleans incomprhensibles, de l'indentation naze et des noms de mthode qui veulent dire l'inverse de ce qu'elles font (parce qu'une mthode qui renvoie quelque chose qui s'appelle "set", c'est aussi assez terrible)



```

```

----------


## lper

> Et je viens de me rendre compte que je n'ai pas fait une rgle de base du code sale : j'ai utilis des parenthses !


 ::fessee:: 

Souvenirs d'un prof. d'info qui m'a trait de cochon plus d'une fois et qui me rappelle une des rgles cites, ne jamais documenter son code.

----------


## pcaboche

> a dpend des langages, a, en COBOL, le CONTINUE ne fait juste rien...


a me rappelle quand j'tais tudiant, la premire fois que j'ai fait du Delphi.

J'avais besoin de programmer l'quivalent d'une boucle (while) avec un "switch" dedans.

Dans pas mal de langages (C, C++, Java, javascript...) quand on a un switch-case, il faut mettre un "break", sinon le programme excute le "case" suivant (_=fallthrough_).
Pas en Delphi.

En Delphi, pas besoin de "break" dans un "case".
Le "break" sort de la boucle... (il m'a fallu un moment pour comprendre ce qu'il se passait...  ::aie:: )

Quand on y pense, c'est trs logique.
Le problme, c'est quand on a t expos  d'autres langages qui forcent l'usage du "break".

Exemple de syntaxe en Delphi :
http://www.delphibasics.co.uk/RTL.asp?Name=Case

Le C#, lui, a choisi une solution un peu btarde : comme en Delphi, on ne peut pas faire de _"fallthrough"_ car c'tait source d'erreurs, par contre il faut imprativement mettre un "break" sinon le compilateur n'est pas content...  ::lol::

----------


## eulbobo

On a parl du code sale en gnral, mais il faut savoir qu'on peut faire du SQL sale aussi...

Si vous utilisez MySQL, il y a trop de moyens de faire des trucs sales... Parce que le parseur est tellement laxiste que vous pouvez mettre  peu prs tout et n'importe quoi et a marche


```
delete * from mytable where
```

Oui, il n'y a rien derrire le where, mais il s'en fout, il considre que tout va bien.

Structure des donnes
Si vous le pouvez, nommez vos tables et vos colonnes avec des noms rservs... Quel plaisir de nommer une table "Table", ou "Drop"... Une colonne "delete", ou "select", Un ID nomm "Sequence"... 
Vous avez aussi le droit d'utiliser des accents (surtout les majuscules accentues si votre base de donnes vous le permet), et des espaces dans les noms !


Requtage
Si vous pouvez ne pas mettre d'espace pour sparer vos instructions, faites le ! La requte sera nettement moins lisible !


```
select *from myTable where column1=445and name<>'name'
```

Comme pour les rgles gnrales du mauvais code, n'oubliez pas de mettre des faux commentaires, une indentation pourrie... 

Ds que possible, utilisez de sous-select dans la clause where !
Plutt que d'crire


```
select * from matable where myDate > to_date('01-01-2015','dd-MM-yyyy' )
```

crivez 


```
select * from matable where myDate > (select to_date('01-01-2015','dd-MM-yyyy') from dual)
```

D'ailleurs, vu qu'on formate une date, faites le correctement... 


```
select * from matable where myDate > (select to_date('01201501','ddyyyyMM') from dual)
```

Abusez des conversion de type !


```
select * from matable where id = (select to_number(to_char(to_date('05201406','MMyyyyDD'), 'yy')) from dual)
```


Avec des commentaires foireux et une indentation pourrie, a pourrait donner un truc comme a


```

```


L'tape ultime, a serait de crer des procdures stockes qui ont  peu prs le mme nom que les fonctions existantes, mais qui ne font pas du tout ce qui est demand. Du genre un trime(valeur) qui rajoute un espace avant et aprs...
Si vous avez une fonction to_date(chaine, pattern), crez une fonction todate(chaine, pattern) avec les mmes paramtres qui permet de dterminer la taille de la chane passe dans le deuxime paramtre.

----------


## eulbobo

Bon, je viens de tomber  l'instant sur un requte SQL qui s'approche de beaucoup des conseils que je donne



```

```

Sachant que la colonne datdt_date est de type DATE, saurez-vous dire ce qu'est cens faire la requte?
(et je me rends compte que j'ai des matres en matire de code pourri)

----------


## foetus

Ds fois tu peux remplacer du code "comprhensif" "comprhensible" avec des listes, des boucles, etc. par 1 seule requte SQL  ::mrgreen::   ::mrgreen:: 

Exemple:


```

```

----------


## pcaboche

> On a parl du code sale en gnral, mais il faut savoir qu'on peut faire du SQL sale aussi...
> 
> Si vous utilisez MySQL, ...


Pas besoin d'aller plus loin. Rien que d'utiliser MySQL, c'est sale...  ::whistle::   ::aie:: 


C'est vrai qu'on peut faire des trucs moches en SQL (indenter de manire compltement alatoire, tout mettre sur une ligne, faire des jointures avec un cross-join et la condition dans le WHERE, utiliser des alias incomprhensibles, etc.) mais MySQL, c'est le fond du trou.

Il n'y a qu' demander  sqlpro ce qu'il en pense :
http://blog.developpez.com/sqlpro/p9...oudre_aux_yeux

Mais en plus, maintenant, MySQL s'amuse  nous troller de manire rgulire, lorsqu'on recherche de la documentation sur une fonctionalit d'Oracle et qu'on tombe sur... la doc de MySQL (parce qu'Oracle a hrit de MySQL en rachetant Sun).  ::mur::

----------


## pcaboche

> Ds fois tu peux remplacer du code "comprhensif" avec des listes, des boucles, etc. par 1 seule requte SQL


Moi aussi, des fois, j'aimerais tomber sur du code comprhensif; du code qui ralise  quel point on galre et qui viendrait nous aider, nous montrer la marche  suivre...

Mais non, a n'existe pas. Au mieux, on peut parfois tomber sur du code _comprhensible_, mais c'est rare (et ce n'est pas l'objet de ce tutoriel).

 ::aie::

----------


## tchize_

Je me suis auto troll aujourd'hui avec du code bien sale que je croyais propre. Soit une date java place sur le 15 du mois. On veux reculer a peu prs d un mois. Seul le mois nous intresse,  une erreur de quelques heures est sans consquence.


```
 date = new Date (date.getTime () - 1000 * 60 *60 * 24 *30);
```

 je vous spoile pas essayez de deviner le rsultat  partir du 15 juin... 

Sinon en java: 
4 5 annotations imbriques en dbut de classe suivies de 4 5 dclarations de constante histoire qu'il faille 10 minutes pour trouver les interfaces implmentes...

Ne pas hsiter a crer des effets de bords dans des aspects

Accder par introspection  un champ priv d'une classe de la jre et en modifier la valeur. 

Et une surprise pour demain si j'arrive  la finaliser.

----------


## pcaboche

> Seul le mois nous intresse, une erreur de quelques heures est sans consquence.


Ben quoi ? Il est o le problme ? Il est bien spcifi qu'on peut se permettre une erreur de "quelques" heures.
Si on dit que "quelques" = 24, alors on est bon, non ?  ::aie:: 




> je vous spoile pas essayez de deviner le rsultat  partir du 15 juin...


Non, l o a devient vraiment intressant, c'est plutt autour du 1 ou 2 Mars...  ::mrgreen:: 


Sinon, pour rendre ton code vraiment crade, on peut faire plusieurs choses.

Par exemple on peut embrouiller les gens en dclarant une constante "MONTH" qui aura (faussement) la valeur d'un mois.


```

```

 ::mrgreen:: 

Le problme avec cette approche, c'est qu'il devient trop facile de rechercher la constante "MONTH" pour savoir o on utilise la formule fautive.

Pour coder salement, il ne faut pas utiliser de constantes (ou le moins possible, et uniquement comme leurre...  ::mrgreen:: ).
 la place, il faut dissminer les mmes formules (ex : 1000 * 60 *60 * 24 *30) un peu partout dans le code, et si possible en les rcrivant de manire lggrement diffrente  chaque fois, afin de compliquer la recherche textuelle.  ::mrgreen:: 

Mais surtout, pour coder salement, il faut bien choisir son langage.
En effet, la mme chose en C# c'est beaucoup trop simple :


```
date.AddMonths( -1 );
```

 ::aie:: 





> Ne pas hsiter a crer des effets de bords dans des aspects


Je suis d'accord, les effets de bords, c'est l'enfance de l'art !

----------


## eulbobo

Le vrai problme, c'est que 1000 * 60 * 60 * 24 * 30, a tient pas dans un int :p 
Du coup, a fait un nombre ngatif. Du coup une date - un nombre ngatif -> POUF on va dans le futur ! 

Tout le temps...

Tu voulais pas "reculer" d'un mois ? :p

Je te conseille la correction illisible suivante
date = new Date (date.getTime () - 1800*1440l*1000);

----------


## Iradrille

> Vous le savez, l'utilisation de l'oprateur ! (not) est moche et pas trs lisible.


Le not est trs pratique pour remplacer un cast int -> bool, a peut servir  rendre son code plus court (et donc plus lisible  ::aie:: )

```

```




> Le vrai problme, c'est que 1000 * 60 * 60 * 24 * 30, a tient pas dans un int :p


Et a compile quand mme ?

Vu comme Java est chiant avec le respect des types (genre while(1) qui compile pas), c'est tonnant oO.

----------


## eulbobo

> Et a compile quand mme ?


Oui, parce que de base, tu essayes de faire des oprations sur des valeurs qui ont le bon type. Le compilateur ne vrifie pas si l'opration en question ne va pas provoquer un dbordement (parce qu'il y a des fois o il ne peut pas savoir, du genre si les valeurs sont des variables...).
Si tu essayes directement de lui affecter un nombre qui ne tiendra pas dans la variable, il te le dira  : int i = 2592000000; par exemple, il te dira que tu es moche

D'o l'importance dans un code moche d'abuser de ce genre de choses histoire de bien masquer des problmes potentiels !

----------


## pcaboche

> Le vrai problme, c'est que 1000 * 60 * 60 * 24 * 30, a tient pas dans un int :p


Comme "date.getTime()" retourne un long, a fait une soustraction sur des long (avec les _cast_ qui vont bien).

Mais c'est vrai que si on dclare une constante MONTH de type int, a fera un dpassement de capacit.





> D'o l'importance dans un code moche d'abuser de ce genre de choses histoire de bien masquer des problmes potentiels !


Exactement !

----------


## tchize_

> Comme "date.getTime()" retourne un long, a fait une soustraction sur des long (avec les _cast_ qui vont bien).
> 
> Mais c'est vrai que si on dclare une constante MONTH de type int, a fera un dpassement de capacit.


Nope, dans mon cas, pas de constante, c'tait directement dans le calcul et a foirait, pas de long cast en amont, juste sur le rsultat final ngatif ::):

----------


## tchize_

> Non, l o a devient vraiment intressant, c'est plutt autour du 1 ou 2 Mars...


"Soit une date java place sur le 15 du mois" No mais ho, c'est une chose de faire crade, a veux pas dire qu'il faut ignorer la condition de dpart, c'est pour a qu'on se tappe d'une ou deux jours de dcalage, a reste dans le mme mois  ::mouarf:: 


Et comme promis, une ppite de code sadique qui fait exactement son travail correctement mais va laisser le dev pantois 



et son alternative qui compile pas tu sais pas pourquoi?

----------


## Iradrille

> Oui, parce que de base, tu essayes de faire des oprations sur des valeurs qui ont le bon type. Le compilateur ne vrifie pas si l'opration en question ne va pas provoquer un dbordement (parce qu'il y a des fois o il ne peut pas savoir, du genre si les valeurs sont des variables...).
> Si tu essayes directement de lui affecter un nombre qui ne tiendra pas dans la variable, il te le dira  : int i = 2592000000; par exemple, il te dira que tu es moche


Mais il n'y a aucune diffrence entre

```

```


"60 * 60 * 24 * 30 * 1000" est une constante de compilation, le calcul est fait durant la compilation et non durant lexcution.

Enfin a marche comme a en C++, c'est diffrent en Java ?

```

```

----------


## eulbobo

Essayez le code suivant pour vous en persuader !


```

```

Rsultat aujourd'hui : Tue Jul 07 07:41:30 CEST 2015
On est bien dans le futur !

Parce que l'opration de multiplication est faite en premier sur des ints (priorit de la multiplication sur la soustraction), dpassement de capacit du int --> int ngatif, puis soustraction avec un long --> on est dans le futur !

Et non, en Java, les calculs, mme s'ils peuvent tre fait par le compilateur sont toujours fait  l'excution. Effectivement, ils pourraient proposer une optimisation l-dessus en prcompilant le rsultat, mais a irait  l'encontre du principe de rtrocompatiblit ascendante (ce qui est vit si possible dans les diffrentes volutions) : du vieux code ne compilerait plus... Empchant le vieux code crade de compiler... Ou pire, provoquant des erreurs parce que dans un programme prcis, on VOULAIT un dpassement de capacit de l'integer...


@tchize_  donne mon ton outil, je dois le mettre en place dans les applications autour de moi, en urgence :p

----------


## pcaboche

> et son alternative qui compile pas tu sais pas pourquoi?


 *?*

----------


## eulbobo

Mais... Mais c'est tout simplement gnial et diabolique !  ::mrgreen::

----------


## pcaboche

> "Soit une date java place sur le 15 du mois" No mais ho, c'est une chose de faire crade, a veux pas dire qu'il faut ignorer la condition de dpart,


Ah ok. Dand les spcifications c'est marqu qu'il faut que a marche "si le programme est excut par un nain unijambiste dansant  la pleine lune au milieu de douze statuettes enroules dans du jambon", donc c'est exactement ce qui a t cod (ni plus, ni moins).

Pour tous les autres cas, on facture un nouveau dveloppement...

----------


## Zirak

> Pour tous les autres cas


Il y a Eurocard / Mastercard ! 


Je ne dirais qu'une chose : Chaussette !

----------


## pcaboche

> Je ne dirais qu'une chose : Chaussette !


*ding dong* Zirak gagne un niveau...

----------


## Kropernic

U + 202e ???

----------


## pcaboche

> U + 202e ???


http://www.explainxkcd.com/wiki/index.php/1137

----------


## Kropernic

Mouahah !

Et on peut utiliser a pour "convertir" une machine cible ?  Juste histoire de faire chier son monde (surtout les collgues du helpdesk  ::aie:: )

----------


## eulbobo

> U + 202e ???



http://www.fileformat.info/info/unic...202e/index.htm
http://www.explainxkcd.com/wiki/index.php/1137:_RTL

Caractre qui provoque un right-to-left override (criture de droite  gauche plutt que de gauche  droite)


(tiens, j'avais pas rafraichi mon navigateur, rponse donne donc :p)

----------


## tchize_

> Ah ok. Dand les spcifications c'est marqu qu'il faut que a marche "si le programme est excut par un nain unijambiste dansant  la pleine lune au milieu de douze statuettes enroules dans du jambon", donc c'est exactement ce qui a t cod (ni plus, ni moins).


Non, cet objet date est utilis comme actual date dans un calendrier qui affiche mois par mois, donc logiquement, on place cette date au milieu du mois.

----------


## tchize_

> U + 202e ???


Oui, ce qui est gnial en java, c'est que le caractre RTL est une caractre valide pour un identifiant. Et c'est amusant de voir au passage comment a fou aussi en l'air les suggestions d'autocompletion d'eclipse  ::mrgreen::

----------


## 10_GOTO_10

> Mais... Mais c'est tout simplement gnial et diabolique !


Je ne connaissais pas mais c'est absolument diabolique. eroda'j cnoD‪.
Par exemple, on peut crer un fichier qui semble s'appeler "annexe.doc" mais qui s'appelle en ralit "ann[u+202e]cod.exe" :

http://galogetlatorre.blogspot.fr/20...02e-trick.html

Et puis a donne des ides de blagues stupides, a. Par exemple vous glissez dans une spec la phrase suivante:



> Il faut aller voir les [u+202e] setup


 Puis vous laissez des mains innocentes copier-coller votre texte dans un mail ou un fichier texte...

----------


## eulbobo

> Et puis a donne des ides de blagues stupides, a. Par exemple vous glissez dans une spec la phrase suivante:
> 
>  Puis vous laissez des mains innocentes copier-coller votre texte dans un mail ou un fichier texte...

----------


## A.Herobic

> Bon, je viens de tomber  l'instant sur un requte SQL qui s'approche de beaucoup des conseils que je donne
> 
> 
> 
> ```
> 
> ```
> 
> Sachant que la colonne datdt_date est de type DATE, saurez-vous dire ce qu'est cens faire la requte?
> (et je me rends compte que j'ai des matres en matire de code pourri)


Mettre 1 dans le champ si la date correspond  la semaine dernire?

Genre on aurait pu l'crire comme a ? 



```
update DCODAT set DATST_SEMAINE_DERNIERE = 1 where trunc(datdt_date,'IW') = trunc(sysdate - 7,'IW')
```

----------


## eulbobo

> ```
> update DCODAT set DATST_SEMAINE_DERNIERE = 1 where trunc(datdt_date,'IW') = trunc(sysdate - 7,'IW')
> ```


toutaf !
*Ding dong* ! A.Herobic gagne un niveau !

----------


## prgasp77

Je dterre un peu le sujet pour vous faire part d'une de mes dcouvertes rcentes que certains connaitront de longue date. UnderHanded C (en) : un concourt de code propre mais qui ne fait pas _exactement_ ce qu'on attend de lui.

Le sujet 2014 tait d'actualit : 


> The PiuPiu oversharing site allows users to create PiuPiu accounts and post 140-character messages. The federal government wants PiuPiu to surveil user activity on the site, by archiving any posts that match certain patterns outlined in a national security letter. Subject to the nondisclosure constraints of the letter, PiuPiu may not inform anyone of the surveillance request.





> The programmer's job is to write code to scan incoming Pius before they are posted, to see if they match any patterns requested in a national security letter. The current system has a function called int preprocess( piu * entry ), to determine if a Piu is suitable for display, or to alter it if necessary; before it returns, it will call a function the programmer will write called void surveil( piu * entry ).





> The underhanded goal is this: write surveil() in such a way that the act of surveillance is subtly leaked to the user or to the outside world. PiuPiu can not reveal the act of surveillance, but your function is technically able to edit the Piu or user structure during scanning. Find a way to alter that data (this alone is a bit of a challenge, since you are not supposed to alter the data, just scan it) in such a way that an informed outsider can tell if someone is being archived. The leakage should be subtle enough that it is not easily noticed.


Il y a plusieurs code de haut niveau, mais celui du vainqueur est une perle.

----------


## Sodium

Je vous conseille galement de jeter un oeil au code de Wordpress qui est une mine d'or  ce sujet.



```

```

----------


## Invit

> Veillez  respecter trs prcisment l'indentation de votre code.


Ayant appris la programmation en Python (pendant 6 mois uniquement en fac), je sais ce que c'est l'indentation  ::P: 

Sinon, dans un projet en VB.NET qui a t fait par un collgue, je devais y apporter des corrections, ya un truc que je trouve assez amusant, l'auteur construit ses requtes sql INSERT en faisant:
sql="INSERT INTO maTable VALUES (" & tRapport(0) & ", " & tRapport(1) & ....
o tRapport est un tableau de chaines. 
Avant de faire mes corrections, je passe un temps fou  dboguer et  essayer de voir dans quelle(s) position(s) du tableau je dois intervenir  ::aie::

----------


## Kropernic

> Sinon, dans un projet en VB.NET qui a t fait par un collgue, je devais y apporter des corrections, ya un truc que je trouve assez amusant, l'auteur construit ses requtes sql INSERT en faisant:
> sql="INSERT INTO maTable VALUES (" & tRapport(0) & ", " & tRapport(1) & ....
> o tRapport est un tableau de chaines. 
> Avant de faire mes corrections, je passe un temps fou  dboguer et  essayer de voir dans quelle(s) position(s) du tableau je dois intervenir


Dans le genre sale, c'est pas mal quand mme ^^.

Mais pire que a, c'est pas safe comme code.  Ce genre de truc est la porte ouverte aux injections  ::(: .

Programmer salement, je veux bien mais a doit rester safe !

----------


## Invit

> Mais pire que a, c'est pas safe comme code.  Ce genre de truc est la porte ouverte aux injections .


Le dev a t mis en place en 2012 et depuis, il n'y a jamais eu de retour  ce propos, et spcifiquement pour ce projet, nous devons faire soit des corrections, soit actualiser des calculs  effectuer et toujours dans un temps d'intervention trs restreint (10 jours max).
A plusieurs moments donns, il a t question de migrer ce dev qui a t fait sous visual studio 2010 en windev, mais on ne trouve jamais le temps pour faire cela, tout comme rendre le code plus lisible

----------


## Sodium

Je viens rveiller ce topic avec quelques bonnes pratiques conseilles imposes par le dveloppeur avec qui je travaille et qui est mon responsable, un expert auto-proclam du code propre et performant qui considre que ceux ne travaillant pas comme lui sont des idiots incomptents :

Un grand classique mais qui ne reste primordial : ne jamais commenter le contenu d'une fonction, mme et surtout si elle fait plus de 500 lignes avec 6 ou 8 niveau de boucles et de conditions imbriqusNe jamais instancier plusieurs fois un mme objet mais passer par un singleton. Si l'on a rellement besoin de plusieurs versions distinctes de la classe (pour instancier plusieurs formulaires par exemple), rajouter dans l'unique objet des tableaux de proprits pour chaque besoinNe pas utiliser de framework, de plugins JavaScript ou de version de PHP ayant moins de 5 ans car les versions rcentes sont "pleines de bugs"Rcrire environ 90% des fonctionnalits du-dit framework car ses dveloppeurs sont forcment incomptentsNe surtout pas utiliser quoi que ce soit se rapprochant d'un dbut d'IDE. Un vrai dveloppeur travaille uniquement avec une invite de commande et VIMNe surtout pas respecter le principe de single responsability. Mieux vaut une classe de 2000 lignes que 2-3 classes lgres car les objets c'est "lourd et il faut privilgier la performance"Effectuer toutes les validations de formulaire en JavaScript uniquement, de toute faon tout le monde a JavaScript aujourd'huiConstruire ses requtes SQL en 20 tapes avec 3 sous-requtes imbriques sur la mme ligne. Pour les noms de tables, utiliser uniquement des abrviations impcomprhensibles.Utiliser PDO mais sans les requtes prpares. Se soucier des injections SQL, c'est pour les faibles.Ne jamais utiliser de return false au dbut d'une fonction car avoir plus d'un return c'est "interdit". Tant pis si a oblige  imbriquer 5 ifs, au moins c'est propre.Passer les variables par rfrence car c'est plus performant (aprs vrification non, c'est mme l'inverse)Ne jamais dclarer une variable dont on n'est pas sr  100% d'avoir besoin. Si une mthode d'une classe n'a pas besoin d'une ou deux variables, interdit de les dclarer dans un constructeur, il faut les redclarer individuellement dans chaque fonction

----------


## foetus

> Ne jamais instancier plusieurs fois un mme objet mais passer par un singleton.


Je ne sais pas si le singleton est un problme, mais lorsque tu utilises un singleton tu peux le faire + ou - proprement  ::mrgreen:: 

Tu planques ton singleton et tu passes par une fonction/ procdure inline proxy





> Mieux vaut une classe de 2000 lignes que 2-3 classes lgres


Cela dpend du contexte  ::mrgreen:: .

Lorsque tu fais une application IHM, des fois c'est plus pratique d'avoir 1 grosse classe contrleur qui gre tous les vnements, callbacks, la vue (passive view), ...





> Pour les noms de tables, utiliser uniquement des abrviations impcomprhensibles.


Je me suis aperu qu'avec Access  ::mrgreen:: , le moteur considre par dfaut certains mots (par exemple "name" "id") comme des alias/ "_placeholders_".

Soit tu les chappes dans les requtes, soit tu dsactives cette "fonctionnalit" ... soit tu mets des abrviations





> Tant pis si a oblige  imbriquer 5 ifs, au moins c'est propre.


En C si tu veux grer toutes les erreurs avec 1 seul endroit pour nettoyer la mmoire, c'est une faon de faire  ::mrgreen:: 

Sinon tu peux utiliser un boolen bool_tmp.
 la fin de la premire tape il faut qu'il soit bien rempli en grant tous les cas de la premire tape (faux ou vrai en cas d'erreurs ou pas).
Et ensuite  chaque tape tu le testes (si bool_tmp est vrai + ventuellement d'autres tests) pour faire l'tape. Et en cas d'erreur tu passes bool_tmp  faux.

----------


## Iradrille

> Ne jamais dclarer une variable dont on n'est pas sr  100% d'avoir besoin. Si une mthode d'une classe n'a pas besoin d'une ou deux variables, interdit de les dclarer dans un constructeur, il faut les redclarer individuellement dans chaque fonction


J'aurais tendance  tre d'accord avec a, si tu peux remplacer un membre par une variable locale;  priori c'est que tu n'en a pas besoin.
Si tu commences  dclarer des variables globales pour sauvegarder ta variable locale entre 2 appels de fonctions, c'est que tu en avais besoin au final  ::aie::

----------


## Sodium

> Je ne sais pas si le singleton est un problme, mais lorsque tu utilises un singleton tu peux le faire + ou - proprement
> 
> Tu planques ton singleton et tu passes par une fonction/ procdure inline proxy


Si le singleton peut se dfendre pour une classe utilitaire qui ne fait que rpondre  une demande sans avoir de vie propre (et encore mieux vaut qu'elle soit instancie et accde via le framework), c'est dj nettement moins le cas lorsqu'il s'agit d'un formulaire avec ses propres champs, validations etc. Surtout que dans mon cas il s'agissait d'une classe abstraite hrite par d'autres classes.




> Sinon tu peux utiliser un boolen bool_tmp.
>  la fin de la premire tape il faut qu'il soit bien rempli en grant tous les cas de la premire tape (faux ou vrai en cas d'erreurs ou pas).
> Et ensuite  chaque tape tu le testes (si bool_tmp est vrai + ventuellement d'autres tests) pour faire l'tape. Et en cas d'erreur tu passes bool_tmp  faux.


Et donc rajouter des conditions qui alourdissent le code tout en obligeant un autre programmeur  lire l'ensemble de la fonction alors qu'avec un simple return false au dbut, la lecture est claire. Je ne dis pas qu'il faut faire des fonctions  40 returns, juste qu'il faut savoir tre pragmatique et ne pas riger certains principes en paroles sainte quitte  rendre son code incomprhensible.




> J'aurais tendance  tre d'accord avec a, si tu peux remplacer un membre par une variable locale;  priori c'est que tu n'en a pas besoin.
> Si tu commences  dclarer des variables globales pour sauvegarder ta variable locale entre 2 appels de fonctions, c'est que tu en avais besoin au final


Non non, l c'est plutt que le type instancie le mme modle et effectue les mme vrifications de droits d'accs dans chaque action du contrleur dans un pure soucis de performances.
Par contre, il charge l'ensemble des fichiers de traductions, configuration etc sur chaque page du site, quelques milliers de variable au total dont seule une fraction est utilise.

----------


## el_slapper

> Un grand classique mais qui ne reste primordial : ne jamais commenter le contenu d'une fonction, mme et surtout si elle fait plus de 500 lignes avec 6 ou 8 niveau de boucles et de conditions imbriqus


Sur celui-l, d'accord avec toi : "pas de commentaires", c'est du sexy coding, et a a des rgles,  commencer par des routines courtes et bien nommes.




> Ne jamais instancier plusieurs fois un mme objet mais passer par un singleton. Si l'on a rellement besoin de plusieurs versions distinctes de la classe (pour instancier plusieurs formulaires par exemple), rajouter dans l'unique objet des tableaux de proprits pour chaque besoin


Faut voir le cas prcis, mais effectivement, dans la plupart des cas, c'est "pourquoi faire simple quand on peut faire compliqu."




> Ne pas utiliser de framework, de plugins JavaScript ou de version de PHP ayant moins de 5 ans car les versions rcentes sont "pleines de bugs"


C'est parfois vrai. Donc, voir au cas-par-cas.




> Rcrire environ 90% des fonctionnalits du-dit framework car ses dveloppeurs sont forcment incomptents


L, par contre, c'est du masochisme pur et dur : soit on utilised un framework, soit on se fait le sien, mais un entre-deux de ce genre est un appeau  problmes.




> Ne surtout pas utiliser quoi que ce soit se rapprochant d'un dbut d'IDE. Un vrai dveloppeur travaille uniquement avec une invite de commande et VIM


VIM est surpuissant, mais bon, il y a aussi des outils rigolos dans les IDE modernes. Qu'il prfre VIM, c'est son problme. Qu'il l'impose est bien plus emmerdant.




> Ne surtout pas respecter le principe de single responsability. Mieux vaut une classe de 2000 lignes que 2-3 classes lgres car les objets c'est "lourd et il faut privilgier la performance"


L encore, la rponse standard de l'ingnieur standard : a dpend. Ca dpend des contraintes, a dpend du mtier. Quand tu commences  avoir des setters/getters bien pais, qui eux mme pointent sur des getters-setters bien pais, qui eux-mmes... tu peux avoir des problmes de performance. Il y a aussi des cas mtiers, rares mais rels, ou le code est un bte script trs long, et l'utilit de le couper en morceaux de 3 (ou mme 30) lignes est inexistante.

Ce qui me gne, c'est qu'il en fait un standard, alors que clairement, dans la majorit des cas, son dogme est inadapt.




> Construire ses requtes SQL en 20 tapes avec 3 sous-requtes imbriques sur la mme ligne. Pour les noms de tables, utiliser uniquement des abrviations incomprhensibles.


Ca, c'est mal. A la maintenance, la difficult de maintenir un code augmente linairement avec sa taille. La difficult de maintenir une requte SQL, elle, augmente exponentiellement avec sa taille, parceque c'est un bloc unique.




> Utiliser PDO mais sans les requtes prpares. Se soucier des injections SQL, c'est pour les faibles.


euh, c'est srieux, l???




> Ne jamais utiliser de return false au dbut d'une fonction car avoir plus d'un return c'est "interdit". Tant pis si a oblige  imbriquer 5 ifs, au moins c'est propre.


Ca, c'est un dbat qui dure depuis l'invention de la routine. Ca brise le flux naturel des donnes. Mais a allge le code. Ca augmente la complexit cyclomatique du code. Ca simplifie la lecture. Je n'ai pas d'avis l-dessus.




> Passer les variables par rfrence car c'est plus performant (aprs vrification non, c'est mme l'inverse)


a, si c'est vrifi et qu'il le nie, on a pas  faire  un scientifique. En cas de doute, mesurer. L, on a  faire  un croyant, une espce nuisible.




> Ne jamais dclarer une variable dont on n'est pas sr  100% d'avoir besoin. Si une mthode d'une classe n'a pas besoin d'une ou deux variables, interdit de les dclarer dans un constructeur, il faut les redclarer individuellement dans chaque fonction


D'autres ont rpondu l-dessus. Aprs, moi, j'ai beaucoup boss en COBOL(avec la couche objet dsactive), et on a gagn beaucoup de temps(dveloppement et maintenance) en crant des mga-structures standard en faible nombre - quitte  avoir pas mal de vide dedans - plutt que des micro-structures adaptes  chaque tape du traitement. Comme ce ne sont pas des objets, mais de simples dfinitions de donnes, et comme en plus les tapes intermdiaires sont des fichiers temporaires effacs assez rapidement, le cot en termes de performances tait ngligeable. Dans une structure objet, il faudrait mesurer. Le risque, je l'ai dj voqu plus haute, c'est de faire des mga contrles  chaque fois qu'on accde  la donne(ce qui n'est pas possible sans objet), et, effectivement, de faire ramer le proc.

A mesurer.

----------


## ManusDei

> VIM est surpuissant, mais bon, il y a aussi des outils rigolos dans les IDE modernes. Qu'il prfre VIM, c'est son problme. Qu'il l'impose est bien plus emmerdant.


Ca veut dire quoi "surpuissant" dans ce cas ? Je connais trs peu VIM, j'ai vu quelques collgues l'utiliser, pour le dbogage en particulier l'interface tait quasiment la mme que celle que j'ai sous Eclipse. Celle d'Eclipse tait plus jolie (a on s'en fout), mais il y avait les mmes "fentres" avec le code, la mmoire etc...
La grosse diffrence que j'ai vu c'est qu'il n'y avait gure de menu, les collgues utilisaient plein de raccourcis l o j'en utilise quelques uns seulement (pour le reste je cherche dans les menus).
Donc oui VIM prend beaucoup moins de mmoire (voire pas du tout compar  Eclipse  ::aie:: ), mais je n'ai pas l'impression qu'il y ait des fonctionnalits en plus.

PS : je ne cherche pas  lancer un troll, je me pose vraiment la question.

----------


## tchize_

> VIM est surpuissant, mais bon, il y a aussi des outils rigolos dans les IDE modernes. Qu'il prfre VIM, c'est son problme. Qu'il l'impose est bien plus emmerdant.


Ca me rappelle un prestataire. Une boite de geeks qui a dcid d'engager une secrtaire pour grer les clients / facturation. Ils lui ont donc configur un pc sous linux et une boite mail. Pour lire la boite mail, elle n'avait le droit d'utiliser que vim. Elle n'a pas tenu une semaine  ::mouarf::

----------


## el_slapper

> Ca me rappelle un prestataire. Une boite de geeks qui a dcid d'engager une secrtaire pour grer les clients / facturation. Ils lui ont donc configur un pc sous linux et une boite mail. Pour lire la boite mail, elle n'avait le droit d'utiliser que vim. Elle n'a pas tenu une semaine


Tu m'tonnes. C'est surpuissant, mais il faut un sacr investissement personnel - et une certaine tournure d'esprit - pour utiliser toute sa puissance. Je n'en suis pas l, d'ailleurs(mon usage est trs limit, je travaille sur des scripts d'une quinzaine de lignes, sous LINUX, et rarement.....)

----------


## zecreator

En fait, tant que le code fait le job demand, knen-a-nafoute. Si le ou les mecs qui reprennent le code ne sont pas des tanches, ils russiront  le r-exploiter. Sinon, faut changer de mtier.

Tiens, un fait divers :
http://www.20minutes.fr/insolite/174...parfois-visite

Le SDF il devait pas tre trs propre, pourtant il a fait le job. A mditer...

Zecreator.

----------


## foetus

> Le SDF il devait pas tre trs propre, pourtant il a fait le job. A mditer...


 ::mouarf::   ::mouarf::  Si c'est la mme histoire, mais je ne l'ai pas suivi, le boulanger a employ le SDF suite  son geste.

Mais le boulanger l'a vir au bout de 4 - 6 mois parce qu'il picolait ou trafficotait il me semble  ::mrgreen::

----------


## zecreator

Comme on dir : le gibier, c'est meilleur quand la viande a un peu pourrie... Les mecs qui mettent en avant qu'un bon code doit tre bien format, comment... sont souvent les premiers  crire du code  l'arrache bien grossi. En fait, ils fantasment les mecs  ::):

----------


## Cpt Anderson

Juste pour la rigolade, j'ai boss pour une socit dont je tairais le nom mais qui distribue du matriel informatique, dont le nom qui tient sur 4 lettres et qui est sponsor de l'ASVEL  ::mouarf:: 

Bref, nous avons eu droit  tout ce qu'il ne faut pas faire, bien sur, mais je me rappelle d'une fonction qui tait  peu prs comme celle la : 



```

```

 ::mouarf::  ::mouarf:: 

Voil le travail

Ah et aussi, je me rappelle d'une phrase d'un ancien responsable de dveloppement, mais c'tait dans une autre entreprise qui m'a dit, droit dans les yeux :




> Il va falloir t'habituer  faire du code sans bug


Avec lui, j'ai tenu moins de 3 mois...

----------


## Invit

J'avais eu  dbugger une fonction comme a qui devait dtecter un cas rare en suivant une analyse complexe et un cahier des charges bien sexy.

Aprs voir pass plusieurs heures  comprendre ce qui avait dj t fait,  de faon particulirement dgueulasse et sans commentaires pertinents, videmment, je suis arriv  la dernire ligne qui donnait RETURN TRUE...

J'ai tout jet, maudit le type qui avait fait a pour trois gnrations. Bon, je viens de voir qu'il tait devenu chef de projet... C'est dans la logique des choses.  ::mouarf::

----------


## escartefigue

> Aprs voir pass plusieurs heures  comprendre ce qui avait dj t fait,  de faon particulirement dgueulasse et sans commentaires pertinents, videmment, je suis arriv  la dernire ligne qui donnait RETURN TRUE...


Ca peut tre un fonctionnement normal transitoire, quand des composants ne sont pas prts, on fonctionne temporairement en mode bouchonn avec une rponse fige
Mais en ce cas, la moindre des choses est de le mentionner avec un *GROS COMMENTAIRE BIEN LISIBLE*, et en prcisant si possible, la date prvue de "_dbouchonnage_"

----------


## zecreator

> Ca peut tre un fonctionnement normal transitoire, quand des composants ne sont pas prts, on fonctionne temporairement en mode bouchonn avec une rponse fige
> Mais en ce cas, la moindre des choses est de le mentionner avec un *GROS COMMENTAIRE BIEN LISIBLE*, et en prcisant si possible, la date prvue de "_dbouchonnage_"


Lol, et pis quoi encore ? 10 balles et un Mars ? Tu veux pas que l'on te mette directement le planning de dev dans les commentaires lol ! En fait, pour coder proprement aujourd'hui il y a 2 solutions :

1 - On rinvente rien, on adapte du code dj super propre.
2 - On a un planning avec une date de livraison finale dans 4 ans, et l on peut peaufiner son code pour qu'il soit le plus lisible et le plus merveilleux et le plus optimis et le plus formidable et qui en plus me sort les poubelles

Si vraiment ces solutions ne fonctionnent pas, reste l'argument ultime : "Ben vous savez, le code est gnr en partie par le framework, on peut pas tout rcrire  la main.". Ce truc, je l'ai vu fonctionn bien des fois (la faute  l'outil incontrlable), et a passe.

Franchement, allez, dites-le, qui prend le temps de parcourir tout ses 300 scripts pour faire le la belle indentation, et commenter chaque variable, chaque fonction, chaque bidouille  la con ? Qui fait a ?

Zecreator.

----------


## foetus

> Qui fait a ?


Une certitude: celui qui ne le fait pas c'est la personne qui demande de commenter son code  ::mouarf::   ::mouarf::   ::mouarf::

----------


## zecreator

> Une certitude: celui qui ne le fait pas c'est la personne qui demande de commenter son code


Haaa oui, la mthode de faire faire par d'autre ce que l'on fait pas, en argumentant que ceux sont de bonnes habitudes. J'ai dej entendu, j'ai dj entendu...

----------


## Sodium

Je tombe sur des tas de trucs rigolos en parcourant le code de mon cher collgue :


```

```

Ah ben oui, if $not, c'est pourtant limpide...

La fonction fait  peu prs 300 lignes comme a, sans le moindre commentaire.

----------


## zecreator

> Je tombe sur des tas de trucs rigolos en parcourant le code de mon cher collgue :
> 
> 
> ```
> 
> ```
> 
> Ah ben oui, if $not, c'est pourtant limpide...
> 
> La fonction fait  peu prs 300 lignes comme a, sans le moindre commentaire.


C'est moche de balancer ses collgues ! Plus que ce code je pense...

----------


## ManusDei

> C'est moche de balancer ses collgues ! Plus que ce code je pense...


C'est ton code ?  ::lol::

----------


## zecreator

> C'est ton code ?


Ha a pourrait. dans ma jeunesse, j'ai d coder un truc comme a.

----------


## Sodium

> C'est moche de balancer ses collgues ! Plus que ce code je pense...


Vu que le mec se prend pour un expert du code, est hyper dsagrable et passe son temps  repasser sur chacun de mes fichiers pour les rcrire selon sa vision du code lisible et performant, je n'ai aucun scrupule.

Allez, un petit autre juste pour rire :



```

```

----------


## Invit

> Vu que le mec se prend pour un expert du code, est hyper dsagrable et passe son temps  repasser sur chacun de mes fichiers pour les rcrire selon sa vision du code lisible et performant, je n'ai aucun scrupule.


a, plus le type dit fort qu'il est bon, plus c'est suspect.
Le vrai bon, tu le repres rapidement en voyant toutes les personnes qui passent religieusement  son bureau et parce qu'il ne fait pas particulirement de bruit (Il est bien occup et il n'a pas besoin de plus de taf !)
Aussi, tu le repres quand tu passes sur du code dsarmant de simplicit (tu aurais fais a avec le double de lignes) et o tu y dcouvres deux-trois fonctionnalits dont tu ignorais l'existence.

----------


## zecreator

> Vu que le mec se prend pour un expert du code, est hyper dsagrable et passe son temps  repasser sur chacun de mes fichiers pour les rcrire selon sa vision du code lisible et performant, je n'ai aucun scrupule.


Voil on y est. C'est exactement le sujet de ce topic. Des mecs qui pensent faire mieux que les autres... Voire que si c'est pas eux qui on pondu le code, c'est forcment de la merde...

----------


## Sodium

> Voil on y est. C'est exactement le sujet de ce topic. Des mecs qui pensent faire mieux que les autres... Voire que si c'est pas eux qui on pondu le code, c'est forcment de la merde...


Pour sa dfense, je pense que le mec est atteint d'un Asperger assez prononc, et il est donc fort probable que lire 10 instructions imbriques sur une ligne lui paraisse parfaitement naturel. Le problme, c'est que les gens comme a, pour tre un atout pour l'quipe, ont besoin d'tre cadrs. Les avoir comme chef de projet est gnralement une trs mauvaise ide puisqu'en plus d'avoir une vision trs personnelle d'un certain nombre de rgles  appliquer et suivre religieusement, ils ne sont pas capable d'imaginer que d'autres personnes puissent penser autrement.

----------


## tchize_

> C'est moche de balancer ses collgues ! Plus que ce code je pense...


Faut tre honnte. Quand on bosse dans la programmation, il y a 99.9% de chances que les codes degueulasses que l'on croise viennent de collgues.  ::mouarf::

----------


## eulbobo

> Faut tre honnte. Quand on bosse dans la programmation, il y a 99.9% de chances que les codes degueulasses que l'on croise viennent de collgues.


Du coup, on peste, on gueule, on pourri la gueule de tout le monde, et on annonce qu'on va pter les genoux de celui qui a commis cette atrocit... Avant de tomber dans un silence de mort quand on se rend compte que c'est notre crature, notre chose, notre commit...  ::aie::

----------


## el_slapper

> Du coup, on peste, on gueule, on pourri la gueule de tout le monde, et on annonce qu'on va pter les genoux de celui qui a commis cette atrocit... Avant de tomber dans un silence de mort quand on se rend compte que c'est notre crature, notre chose, notre commit...


Tiens, je ne suis pas le seul  avoir vcu a.  ::aie::

----------


## tchize_

Tiens aujourd'hui
J'avais un cas edge case  reproduire en unit test.
Du coup je vais chercher le test de base pour le modifier avec le edge case.
pas moyen de trouver le test de base de la fonctionnalit.
Je remonte  la fonctionnalit dans l'historique des commits pour voir ce qui a t commit avec, histoire de trouver le test
pas de test relevant commit avec. 
Mais qui a nglig le test?
Ha ben c'est moi  ::(:

----------


## Sodium

Allez, un petit bout de code sur lequel je suis tomb pour relancer le topic :

----------


## el_slapper

> Allez, un petit bout de code sur lequel je suis tomb pour relancer le topic


C'est indent(semble-t-il correctement, mme si ce genre de langage, a n'est pas ma came, donc je ne suis pas sur), et les rares mots qu'on trouve sont dans une langue identifiable.

Aprs, c'est sur, pour avoir la moindre ide de ce que a fait, c'est plus compliqu. Sur comment, ben un prpare un tableau  renvoyer, on cherche quelquepart dans les donnes ce qui correspond  la clef data qu'on a entr, et on fait pas mal de recherches derrire. La tuyauterie est lisible. Mais  quoi elle sert???

Un bel exemple, parce-que je suis sur que l'auteur croit que son truc est lisible. J'ai sans doute commis des trucs de ce genre, moi-mme, parfois. On comprend en gros chacune des actions unitaires, et si on sait  quoi a sert, on peut mme sans doute le dbogguer. Et c'est l qu'est l'os : "_ quoi a sert???_"

----------


## Grogro

> Allez, un petit bout de code sur lequel je suis tomb pour relancer le topic :


Complexit cyclomatique : OVER NINE THOUSAAAAAAAAND !!!

----------


## badaze

Le pire programme que j'aie vu est un programme crit en Adlia 400 (pour ceux qui ne connatraient pas c'est un L4G avec des mots cls en Franais qui gnre du RPG pour AS400).

Le premier SI tait en ligne 10 et le FIN lui correspondant plus de 1.000 lignes plus loin !!! Bien entendu entre les 1.000 lignes il y avait d'autres conditions du mme genre.

----------


## Pyramidev

> Allez, un petit bout de code sur lequel je suis tomb pour relancer le topic :


Je viens de m'exercer  analyser ce code.

$data est un tableau associatif (disons, de type MapAMapBC) qui associe  chaque cl (disons, de type A) un tableau associatif (disons, de type MapBC) qui associe  chaque cl (disons, de type B) une valeur (disons, de type C).
$search est un tableau de valeurs de type C.

Premier morceau de code : un foreach :
Si $search est vide, on inverse les cls et les valeurs de tous les MapBC. Appelons MapCB le type du rsultat.
Si $search est non vide alors, pour chaque MapBC, on regarde les valeurs de type C  la fois prsentes dans MapBC et $search. On remplace alors le MapBC par un tableau associatif qui  chaque cl de type C associe un numro. Dans ce tableau associatif, les valeurs vont de 0 au nombre de cls moins 1.
Si on suppose que le type final des tableaux transforms ne dpend pas que $search soit vide ou non, alors le type B est un nombre. Du coup, MapBC tait en fait le type tableau de C. Donc $data tait au dpart un tableau associatif de type MapAC. Maintenant, il est de type MapAMapCB.

Deuxime bloc de code : un if si $data n'a qu'un seul lment (de type MapCB) :
Visiblement, le type A est un type caractre. Si 'a' est une cl de $data, on prend les valeurs C qu'il contient sous forme de tableau de C. Sinon, on retourne directement le MapCB sans rinverser les cls et les valeurs.

Troisime morceau de code : le else :
On cherche tous les C qui sont dans un seul des MapCB de $data. On retourne un tableau associatif qui associe,  chacun de ces C, la valeur 0.

En rsum :
$data associe  chaque caractre une valeur de type C.
$search est un filtre optionnel sous la forme d'un tableau avec des valeurs de type C.
On retourne les valeurs de type C auxquelles est associ un et un seul caractre de $data. Si $search est non vide, on enlve les valeurs de type C qui ne sont pas prsentes dans $search.
Si on n'entre pas dans le if du $data avec un seul lment, on retourne les valeurs de type C sous la forme d'un tableau associatif trange qui associe  chacune de ces valeurs de type C le nombre 0.
Si on entre dans le if du $data avec un seul lment, les valeurs de type C sont retournes sous une forme diffrente qui dpend si le caractre contenu dans $data est 'a'.

Bilan :
La conception semble inexistante, l'implmentation est absurde et il y a un problme de nommage des variables : on ne sait pas ce que chaque variable reprsente.

----------


## el_slapper

> Le premier SI tait en ligne 10 et le FIN lui correspondant plus de 1.000 lignes plus loin !!! Bien entendu entre les 1.000 lignes il y avait d'autres conditions du mme genre.


Si c'est du RPG  l'ancienne en positionnel - et donc avec indentation impossible - j'imagine le carnage.

Perso, j'ai eu un jour 533 lignes entre un IF et un END-IF en COBOL. Pas si impressionnant, sauf que lors d'une maintenance, mon prdcesseur s'est mlang sur les indentations. Et plus rien n'tait en face. J'ai du imprimer le code en petits caractres pour avoir les 533 lignes sons les yeux et tirer des traits jusqu' comprendre le souci.

----------


## Sodium

> Bilan :
> La conception semble inexistante, l'implmentation est absurde et il y a un problme de nommage des variables : on ne sait pas ce que chaque variable reprsente.


Bienvenue dans mon quotidien.
L'app sur laquelle je bosse est bourre de code comme a, pas toujours aussi obscur mais il faut  chaque analyser le truc en plusieurs tapes pour tester l'avant-aprs  cause de variables mal nommes ("final", "data", "temp" ...) et mme une qu'on a compris ce que le bout de code fait, il faut encore comprendre pourquoi. Au final je me rends compte que deux bons tiers du code servent  reproduire des fonctionnalits pour lesquelles PHP a des fonctions natives : comparer deux tableaux, parser une url ... avec une bonne quantit de rptitions.
L'auteur tant autiste, il est pratiquement impossible de discuter avec lui car a lui semble absurde que son code ne soit pas parfaitement lisible par d'autres personnes, d'aprs lui tous les pros travaillent comme lui.

----------


## badaze

@el_slapper.

Adelia est un langage algorithmique (en franais) qui gnre du RPG. En RPG j'aurai carrment pt les plombs.
Je me souviens que j'avais un listing de je ne sais plus combien de pages (imprim sur une grosse matricielle) et que je reproduisais les indentations sur des feuilles avec des carreaux de 5mm.

----------


## escartefigue

Les programmes crits dans les annes 60-70 en cobol, taient contraints par les  ::weird::  "_performances_" machine extrmement limites  ::aie:: . 
*Le code source devait tre le plus court possible*
Du coup, il n'y avait *jamais de commentaire* et les *noms des variables et des paragraphes taient les plus courts possibles*.
Pour la mme raison, le code pouvait s'altrer lui mme un peu comme en assembleur, grce  (ou plutt  cause de) l'instruction "ALTER TO PROCEED" dont le but taient de modifier les instructions de branchement !
Et enfin, il n'y avait pas de END-IF, seul le point terminait le IF. 

A cette poque, ce genre de code tait donc la norme, "_va comprendre Charles_" :



```

```

Bien videmment, il n'existait pas de debogeur et l'espace DATA (la working storage) n'tait pas balis, retrouver les valeurs des variables pour expliquer un plantage n'tait donc pas chose aise
Et, cerise sur le gteau, comme le temps machine tait trs couteux, *les dveloppeurs n'avaient droit qu' 1 compilation par jour* !

Une autre poque, heureusement rvolue   ::P:

----------


## fabzyr

Puis on est d'accord tout doit tre crit en franais pour tre comprhensible par tous.

----------


## Invit

> Puis on est d'accord tout doit tre crit en franais pour tre comprhensible par tous.


 ::ptdr:: 
Non, a dpend de ton environnement de travail et de la dispersion de tes collgues  travers le monde ou de la langue des clients viss.
Tant qu' moi, je prfre lire du franais  de l'anglais crit par des Franais, qui est souvent ubuesque - et j'ai un niveau de Franais  ::roll::  , mais qui vit en terre bilingue.

----------


## Pyramidev

Fix (dsol pour le up) :



> D'ailleurs, en relisant le code, je crois que je m'tais embrouill dans mon analyse d'il y a 3 ans.
> Je crois que $data associe  chaque caractre un tableau dont les lments sont de type C et non pas un seul lment de type C.
> Et dans le else final, je crois qu'on recherche les C qui apparaissent dans tous ces tableaux  la fois.
> Je n'ai pas essay d'excuter le code.

----------


## CVB51

Aujourd'hui, j'en rigole amre mais j'ai arrt l'informatique particulirement  cause de ces nes.

Reprendre un code: "Tu vas nous permettre de passer du franais  l'anglais par ce bouton dans l'interface graphique". Du J2EE. Simple, aller voir les .properties.
Non, le stagiaire est passer de l'anglais vers le franais en codant tout en dur (supprimant l'anglais, grand dfenseur de la langue de Molire). Je m'en suis sorti avec une perte de temps colossale et tlchargement du code source initial (qui contenais naturellement i18n).

Avoir un matre: Il pond des fonctions et d'autres trucs que tu dois rutiliser mais que tu sais pertinemment que  ne sera jamais utilis. Tu tests. INSOLENT!
Aprs avoir retourn 3 cas de crash ou de rponses totalement farfelues rapport au rsultat attendu, tu post. Rponse: "T'es pas l pour tester mon code mais pour l'utiliser". Srieux, je crois que je vais viter de produire d'autres bugs, mes prdcesseurs ont t gnreux sur ce point. 

Astuce de chef de projet: "Quoi, tu test toutes les variables qui entrent en argument de fonction? Perte de temps!"
Oui, le patient s'appelle Konrad Mc Leod, il est n en 1412. Pas de soucis.
Pour les autres, j'espre que le logiciel de retraite dispose de la mme fonctionnalit. J'enterre mm et continu d'encaisser.

Disperser les requtes  la base de donne partout dans le logiciel plutt que les centraliser. C'est nettement mieux. Chaque changement de table induit 3 jours de corrections diverses et varies.  Avantage, la mme demande va gnrer autant de rsultats qu'il y a de dveloppeur sur le projet. Second bonus, il y aura autant de connexion  la base de donne qu'il y a de modules. Si encore chacun ne lance qu'une connexion pour sa partie de projet...

Nouvelle version du logiciel: "Bon, envoys vos correctifs pour 11h. Je compile la version 3.11.04". Il est 9h30, tout le monde ignorait la sortie d'une nouvelle version ce jour.

----------


## Faits.divers

Vous ne vous en rendez pas compte parce que vous ..... mais vous etes pas croyables tout de mme.

Des pompeurs de codes sources manifestent sur developpez.com ???? Il vous faut le code source et les cours qui vont avec !!!!  ::ptdr::  ::ptdr::  ::ptdr::  ::ptdr::  ::ptdr::

----------


## Invit

> Vous ne vous en rendez pas compte parce que vous ..... mais vous etes pas croyables tout de mme.
> Des pompeurs de codes sources manifestent sur developpez.com ???? Il vous faut le code source et les cours qui vont avec !!!!


Merci pour ta participation. O as-tu fait tes tudes de troll ?

----------


## Faits.divers

> Merci pour ta participation. O as-tu fait tes tudes de troll ?


Dsol mais je ne vous insulte pas du tout et ne me suis pas du tout adress a vous. Je fais simplement une remarque qui n'a pas a faire l'objet d'insultes de votre part ... en parlant de troll ?

ce sera la seule rponse que je vous adresserai.

----------


## walfrat

J'ai en deux pas mal.

L'internationalisation avec GWT. Les traductions taient dupliqus et du mlange : 

Des annotations dans le code pour les valeurs par dfaut en anglais (mcanique spciale GWT)Un fichier <xxx>.properties qui parfois va contenir de l'anglais parfois du franaisles fichiers <xxx>_fr.properties et <xxx>_en.properties qui contiennent leur propre traduction correctes

J'ai rcemment intgr sur conseil du'n autre projet un tableau angular material dans du angular element pour l'intgr dans du GWT. Mais comme le tableau angular material est trop basique pour nos besoin, je l'ai remplacer par ag-grid. En outre je communique avec le GWT via les CustomEvents. Bon en soi le principe est quand mme un peu sale, mais je l'ai fait proprement  ::aie::

----------


## SEFCOM

De toute faon c'est alatoire dans certains cas.
Tu peux trouver des soft qui le font  ta place d'une manire automatise. Ils parcourent ton code et remplace les variables par des chaines.

----------

