{"id":468,"date":"2012-11-14T16:58:01","date_gmt":"2012-11-14T15:58:01","guid":{"rendered":"http:\/\/www.degraphiks.com\/blog\/?p=468"},"modified":"2013-06-09T13:18:53","modified_gmt":"2013-06-09T12:18:53","slug":"les-20-erreurs-les-plus-courantes-en-programmation","status":"publish","type":"post","link":"http:\/\/degraphiks.com\/blog\/les-20-erreurs-les-plus-courantes-en-programmation\/","title":{"rendered":"Les 20 erreurs les plus courantes \u00e0 \u00e9viter en programmation"},"content":{"rendered":"<p>Cet article est libre\u00adment ins\u00adpi\u00adr\u00e9 et tra\u00adduit d\u2019un article de <a title=\"l'article original\" href=\"http:\/\/net.tutsplus.com\/tutorials\/tools-and-tips\/20-all-too-common-coding-pitfalls-for-beginners\/\" target=\"_blank\">net.tutsplus.com<\/a>.<\/p>\n<p>Quel que soit notre niveau de ma\u00ee\u00adtrise, nous avons tous \u00e9t\u00e9 d\u00e9bu\u00adtants. Com\u00admet\u00adtant des erreurs de d\u00e9bu\u00adtants. Cet article ne fera pas de vous un expert infaillible (si cela existe quelque part). Il fait juste un petit tour d\u2019ho\u00adri\u00adzon des erreurs \u00e0 \u00e9vi\u00adter ou des mau\u00advaises habi\u00adtudes qu\u2019il est d\u00e9con\u00adseill\u00e9 de prendre lors\u00adqu\u2019on d\u00e9bute.<br>\n<!--more--><\/p>\n<h2>JAVASCRIPT<\/h2>\n<h3>1\/ manipulation inutile du&nbsp;DOM<\/h3>\n<p>Le DOM est lent. Il est donc conseill\u00e9 de limi\u00adter sa mani\u00adpu\u00adla\u00adtion pour limi\u00adter l\u2019im\u00adpact sur les per\u00adfor\u00admances. Un exemple de (mau\u00advais)&nbsp;code:<\/p>\n<pre class=\"brush:js\">for (var i = 0; i &lt; 100; i++){\n   var li = $(\"&lt;li&gt;\").html(\"Ceci est la liste num\u00e9ro #\" + (i+1));\n   $(\"#une_liste_UL\").append(li);\n}<\/pre>\n<p>Ce code modi\u00adfie 100 fois le DOM, et cr\u00e9er au pas\u00adsage 100 objets jQue\u00adry ! Voyons com\u00adment pro\u00adduire un code beau\u00adcoup plus \u00e9co\u00adnome. Une bonne m\u00e9thode consis\u00adte\u00adrait \u00e0 cr\u00e9er une cha\u00eene de carac\u00adt\u00e8res conte\u00adnant les 100 <span class=\"ccode\">&lt;li&gt;<\/span> et de les ajou\u00adter en une fois au HTML. Une fois au lieu de&nbsp;100\u2026<\/p>\n<pre class=\"brush:js\">var laliste = \"\";\nfor (var i = 100; i &gt; 0; i--){\n  laliste += \"&lt;li&gt;Ceci est la liste num\u00e9ro #\" + (99- i);\n}\ndocument.getElementById(\"une_liste_UL\").innerHTML(laliste);<\/pre>\n<p>Encore une fois, faire le bou\u00adlot en une fois au lieu de 100 est cer\u00adtai\u00adne\u00adment un gain de temps, d\u2019au\u00adtant plus, qu\u2019i\u00adci, nous fai\u00adsons appel \u00e0 la conca\u00adt\u00e9\u00adna\u00adtion de cha\u00eene sans pas\u00adser par des objets inter\u00adm\u00e9\u00addiaires. Une autre solu\u00adtion uti\u00adli\u00adsant les tableaux pour\u00adrait res\u00adsem\u00adbler \u00e0&nbsp;ceci&nbsp;:<\/p>\n<pre class=\"brush:js\">var laliste = \"&lt;li&gt;\"\nvar lis = [];\nfor (var i = 100; i &gt; 0; i--){\n   lis.push(\"Ceci est la liste num\u00e9ro #\" + (99- i));\n}\nlaliste += lis.join(\"&lt;\/li&gt;&lt;li&gt;\") + \"&lt;\/li&gt;\";\ndocument.getElementById(\"une_liste_UL\").innerHTML(laliste);<\/pre>\n<p>Dans le cas de conca\u00adt\u00e9\u00adna\u00adtion de grande cha\u00eene de carac\u00adt\u00e8re, d\u00e9cou\u00adper celle-ci en tableau per\u00admet d\u2019en opti\u00admi\u00adser un peu plus l\u2019as\u00adsem\u00adblage. Ceci est la m\u00e9thode la plus rapide pour construire une struc\u00adture r\u00e9p\u00e9\u00adti\u00adtive en JavaS\u00adcript sans uti\u00adli\u00adser une librai\u00adrie de tem\u00adplate ou un framework.<\/p>\n<h3>2\/ inconsistance des noms de variables et de fonction en JavaScript<\/h3>\n<p>Ce qui suit ne r\u00e8gle pas un pro\u00adbl\u00e8me de per\u00adfor\u00admance ; mais est extr\u00ea\u00adme\u00adment impor\u00adtant quand vous tra\u00advaillez avec d\u2019autres per\u00adsonnes sur le m\u00eame code (et m\u00eame pour soit !) : gar\u00addez la coh\u00e9\u00adrence des iden\u00adti\u00adfiants (variables, noms de fonc\u00adtions). Un exemple&nbsp;:<\/p>\n<pre class=\"brush:js\">var foo = \"bar\";\nvar plante = \"verte\";\nvar voiture = \"rouge\";<\/pre>\n<p>Ajou\u00adter une variable qui s\u2019ap\u00adpel\u00adle\u00adrait \u00ab&nbsp;Quel\u00adque\u00adchose&nbsp;\u00bb serait intro\u00adduire une cer\u00adtaine confu\u00adsion sur plu\u00adsieurs plans : outre le fait qu\u2019elle ne d\u00e9signe pas grand-chose mais elle uti\u00adlise aus\u00adsi une lettre majus\u00adcule alors que les autres variables n\u2019en n\u2019u\u00adti\u00adlisent pas. Ce qui est cou\u00adrant par contre, et ce, dans de nom\u00adbreux lan\u00adgages, c\u2019est de nom\u00admer les constantes en majus\u00adcule pour bien les dis\u00adtin\u00adguer des \u00ab&nbsp;variables&nbsp;\u00bb.<br>\nOn peut aller un peu plus loin dans ce sens en uti\u00adli\u00adsant des noms de fonc\u00adtion dont la lon\u00adgueur est proche et dont la syn\u00adtaxe est constante&nbsp;:<\/p>\n<pre class=\"brush:js\">function soustraitCinq(nombre){\n   return nombre - 5;\n}<\/pre>\n<p>Et<\/p>\n<pre class=\"brush:js\">function ajouteCinq(nombre){\n  return nombre + 5;\n}<\/pre>\n<p>Les deux fonc\u00adtions uti\u00adlisent la m\u00eame syn\u00adtaxe (nom de l\u2019ac\u00adtion en toutes lettres, et non pas sous\u00adtrait\u00adCinq et plus\u00adCinq) ; par ailleurs, le nom de la fonc\u00adtion peut aus\u00adsi indi\u00adquer ce qu\u2019elle retourne, par exemple, la fonc\u00adtion <span class=\"ccode\">getT\u00adwee\u00adtHTML<\/span> retour\u00adne\u00adra le r\u00e9sul\u00adtat de ses inves\u00adti\u00adga\u00adtions sous forme de code HTML. Vous pou\u00advez aus\u00adsi pr\u00e9\u00adfixer le nom de la fonc\u00adtion par \u00ab&nbsp;fait&nbsp;\u00bb ou \u00ab&nbsp;do&nbsp;\u00bb si la fonc\u00adtion se contente de faire quelque chose sans rien retourner.<\/p>\n<p>La r\u00e8gle g\u00e9n\u00e9\u00adrale est de nom\u00admer en tenant compte d\u2019une syn\u00adtaxe forte et des\u00adcrip\u00adtive (autant que faire se&nbsp;peut).<\/p>\n<h3>3\/ Utiliser <span class=\"ccode\">hasOwnProperty()<\/span> dans les boucles <span class=\"ccode\">for\u2026in<\/span><\/h3>\n<p>Les tableaux en JavaS\u00adcript ne sont pas asso\u00adcia\u00adtifs, ten\u00adter de les uti\u00adli\u00adser comme tel serait donc une erreur. Par contre, les objets eux peuvent \u00eatre trai\u00adt\u00e9s comme des tables de hachage, et on peut en par\u00adcou\u00adrir les pro\u00adpri\u00e9\u00adt\u00e9s \u00e0 l\u2019aide d\u2019une boucle <span class=\"ccode\">for\u2026in<\/span> comme&nbsp;ici&nbsp;:<\/p>\n<pre class=\"brush:js\">for (var prop in unObjet) {\n  alert(unObjet[prop]);\n}<\/pre>\n<p>Le pro\u00adbl\u00e8me c\u2019est que le par\u00adcourt en ques\u00adtion se fait sur tous les objets m\u00eame si par\u00admi eux cer\u00adtains ne pos\u00ads\u00e8dent pas la pro\u00adpri\u00e9\u00adt\u00e9 atten\u00addue. Mais heu\u00adreu\u00adse\u00adment, ceci se comble faci\u00adle\u00adment avec la m\u00e9thode <span class=\"ccode\">hasOwn\u00adPro\u00adper\u00adty()<\/span> :<\/p>\n<pre class=\"brush:js\">for (var prop in unObjet) {\n  if (unObjet.hasOwnProperty(prop)) {\n    alert(unObjet[prop]);\n  }\n}<\/pre>\n<h3>4\/ Comparer les valeurs bool\u00e9ennes<\/h3>\n<p>Com\u00adpa\u00adrer les valeurs boo\u00adl\u00e9ennes dans une condi\u00adtion est une perte de temps, comme dans l\u2019exemple ci-dessous&nbsp;:<\/p>\n<pre class=\"brush:js\">if (foo == true) {\n  \/\/ fait ceci si vrai\n} else {\n  \/\/ fait cela si faux\n}<\/pre>\n<p>Il est inutile de deman\u00adder \u00e0 foo s\u2019il est vrai ou faux dans la mesure o\u00f9 cette variable est une valeur boo\u00adl\u00e9enne (vraie ou fausse), la ques\u00adtion se pose alors de mani\u00e8re plus \u00e9l\u00e9gante&nbsp;:<\/p>\n<pre class=\"brush:js\">if (foo) {\n  \/\/ fait ceci si vrai\n} else {\n  \/\/ fait cela si faux\n}<\/pre>\n<p>Si on veu tes\u00adter l\u2019\u00e9\u00adtat faux, il suf\u00adfit d\u2019u\u00adti\u00adli\u00adser l\u2019o\u00adp\u00e9\u00adra\u00adteur <span class=\"ccode\">NOT<\/span> comme&nbsp;ici&nbsp;:<\/p>\n<pre class=\"brush:js\">if (!foo) {\n  \/\/ fait ceci si vrai\n} else {\n \/\/ fait cela si faux\n}<\/pre>\n<h3>5\/ Bien affecter les \u00e9v\u00e9nements<\/h3>\n<p>Les \u00e9v\u00e9\u00adne\u00adments sont un sujet \u00e9pi\u00adneux en JavaS\u00adcript. Ils sont loin les jours o\u00f9 on pla\u00ad\u00e7ait les \u00e9v\u00e9\u00adne\u00adments direc\u00adte\u00adment dans le code HTML (les onclick et consorts).En lieu et place, uti\u00adli\u00adsez la pro\u00adpa\u00adga\u00adtion et la d\u00e9l\u00e9gation.<br>\nIma\u00adgi\u00adnons que vous ayez une grille d\u2019i\u00admages qui s\u2019af\u00adfichent dans une light\u00adbox modale.<br>\nLe code&nbsp;HTML<\/p>\n<pre class=\"brush:php\">&lt;div id=\"lagrille\"&gt;\n  &lt;a href=\"image.jpg\"&gt;&lt;img src=\"image_vignette.jpg\"&gt;&lt;\/a&gt;\n  &lt;a href=\"image.jpg\"&gt;&lt;img src=\"image_vignette.jpg\"&gt;&lt;\/a&gt;\n  &lt;a href=\"image.jpg\"&gt;&lt;img src=\"image_vignette.jpg\"&gt;&lt;\/a&gt;\n  ...\n&lt;\/div&gt;<\/pre>\n<p>Le (mau\u00advais) JavaScript&nbsp;:<\/p>\n<pre class=\"brush:js\">$('a').on('click', function() {\n  lightBox(this);\n});<\/pre>\n<p>Ce code se contente de pas\u00adser \u00e0 la light\u00adBox l\u2019a\u00addresse de l\u2019i\u00admage haute r\u00e9so\u00adlu\u00adtion, au lieu de lier effec\u00adti\u00adve\u00adment les liens conte\u00adnus dans la grille, il est donc pr\u00e9\u00adf\u00e9\u00adrable de faire comme&nbsp;suit&nbsp;:<\/p>\n<pre class=\"brush:js\">$(\"#lagrille\").on(\"click\", \"a\", function(event) {\n  lightBox(event.target);\n});<\/pre>\n<p>De la sorte,<span class=\"ccode\">this<\/span>&nbsp; et <span class=\"ccode\">event.target<\/span> font r\u00e9f\u00e9\u00adrence \u00e0 l\u2019ancre. Vous pou\u00advez uti\u00adli\u00adser cette tech\u00adnique pour n\u2019im\u00adporte quel \u00e9l\u00e9\u00adments parent, il faut juste s\u2019as\u00adsu\u00adrer que bien lier le bon \u00e9v\u00e9\u00adne\u00adment \u00e0 la bonne&nbsp;cible.<\/p>\n<h3>6\/ \u00c9viter la redondance de l\u2019op\u00e9rateur ternaire<\/h3>\n<p>Que cela soit en JavaS\u00adcript ou en PHP, l\u2019o\u00adp\u00e9\u00adra\u00adteur ter\u00adnaire est par\u00adfois uti\u00adli\u00ads\u00e9 de mani\u00e8re redondante.<\/p>\n<pre class=\"brush:php\">\/\/ javascript\nreturn foo.toString() !== \"\" ? true : false;\n\n\/\/ php\nreturn (laFonction()) ? true : false;<\/pre>\n<p>Une condi\u00adtion ren\u00advoyant tou\u00adjours un boo\u00adl\u00e9en, il n\u2019est pas n\u00e9ces\u00adsaire d\u2019a\u00adjou\u00adter true\/false, il suf\u00adfit juste de retour\u00adner la condition&nbsp;!<\/p>\n<pre class=\"brush:php\">\/\/ javascript\nreturn foo.toString() !== \"\";\n\n\/\/ php\nreturn laFonction();<\/pre>\n<h2>PHP<\/h2>\n<h3>7\/ Utilisez l\u2019op\u00e9rateur ternaire quand c\u2019est n\u00e9cessaire<\/h3>\n<p>Le test <span class=\"ccode\">if\u2026else<\/span> est cen\u00adtral dans la plu\u00adpart des langages.<br>\nDans le cas ou la condi\u00adtion sta\u00adtue sur le rem\u00adplis\u00adsage d\u2019une variable, l\u2019o\u00adp\u00e9\u00adra\u00adteur ter\u00adnaire peut \u00eatre une solu\u00adtion \u00e9l\u00e9gante&nbsp;:<\/p>\n<pre class=\"brush:php\">if ($formule)\n{\n  $post-&gt;message = 'Bonjour';\n}\nelse\n{\n  $post-&gt;message = 'Au revoir';\n}<\/pre>\n<p>Ce code peut \u00eatre \u00e9l\u00e9\u00adgam\u00adment rem\u00adpla\u00adc\u00e9 par une seule&nbsp;ligne&nbsp;:<\/p>\n<pre class=\"brush:php\">$post-&gt;message = $formule ? 'Bonjour' : 'Au revoir';<\/pre>\n<p>Cepen\u00addant, aus\u00adsi clair qu\u2019il soit, le plus impor\u00adtant de ne pas le sur-utiliser. Gar\u00addez en t\u00eate que la clar\u00adt\u00e9 ne repose pas tou\u00adjours sur la concision.<\/p>\n<h3>8\/ Rejetez d\u00e8s le d\u00e9but les exceptions dans le cas de test en cascade<\/h3>\n<p>Construire et sur\u00adtout main\u00adte\u00adnir un code avec de nom\u00adbreux tests imbri\u00adqu\u00e9s n\u2019est pas une sin\u00e9\u00adcure. Voi\u00adci un exemple (loin d\u2019\u00eatre anecdotique)&nbsp;:<\/p>\n<pre class=\"brush:php\">$message-derreur = null;\nif ($this-&gt;form_validation-&gt;run())\n{\n  if ($this-&gt;upload-&gt;do_upload())\n  {\n    $image = $this-&gt;upload-&gt;get_info();\n    if ( ! $this-&gt;image-&gt;create_thumbnail($image['nom_fichier'], 300, 150))\n    {\n      $message-derreur = 'Erreur \u00e0 la cr\u00e9ation de la vignette.';\n    }\n  }\n  else\n  {\n     $message-derreur = 'Erreur durant l\\'upload de l\\'image.';\n  }\n}\nelse\n{\n  $message-derreur = $this-&gt;form_validation-&gt;error_string();\n}\n\/\/ Show error messages\nif ($message-derreur !== null)\n{\n  $this-&gt;load-&gt;view('form', array(\n    'error' =&gt; $message-derreur,\n  ));\n}\n\/\/ Sauvegarde de la page\nelse\n{\n  $qq-donnees['image'] = $image['nom_fichier'];\n  $this-&gt;mon_model-&gt;sauve($qq-donnees);\n}<\/pre>\n<p>Vous aus\u00adsi vous avez mal au cr\u00e2ne, c\u2019est nor\u00admal. Heu\u00adreu\u00adse\u00adment, il y a une mani\u00e8re de faire plus simple comme&nbsp;ici&nbsp;:<\/p>\n<pre class=\"brush:php\">try\n{\n  if ( ! $this-&gt;form_validation-&gt;run())\n  {\n   throw new Exception($this-&gt;form_validation-&gt;error_string());\n  }\n  if ( ! $this-&gt;upload-&gt;do_upload())\n  {\n    throw new Exception('Erreur durant l\\'upload de l\\'image.');\n  }\n  $image = $this-&gt;upload-&gt;get_info();\n  if ( ! $this-&gt;image-&gt;create_thumbnail($image['nom_fichier'], 300, 150))\n  {\n    throw new Exception('Erreur \u00e0 la cr\u00e9ation de la vignette.');\n  }\n}\n\/\/ affiche les messages d'erreur\ncatch (Exception $e)\n{\n  $this-&gt;load-&gt;view('form', array(\n    'error' =&gt; $e-&gt;getMessage(),\n  ));\n  \/\/ utiliser une m\u00e9thode de sortie ou exit\n  return;\n}\n\/\/ si vous \u00eates arriv\u00e9s ici, c'est que tout c'est bien d\u00e9roul\u00e9.\n$qq-donnees['image'] = $image['nom_fichier'];\n$this-&gt;mon_model-&gt;sauve($qq-donnees);<\/pre>\n<p>Cela peut conduire \u00e0 un m\u00eame nombre de lignes ; mais la logique est beau\u00adcoup plus claire et le code plus prompte \u00e0 l\u2019en\u00adtre\u00adtien. Sans comp\u00adter que le d\u00e9bo\u00adgage est plus simple, on l\u2019on sait tout de suite o\u00f9 pla\u00adcer les <span class=\"ccode\">if<\/span> qui vont bien pour prendre en compte la nou\u00advelle situation.<\/p>\n<h3>9\/ La m\u00e9thode faux-heureux<\/h3>\n<p>Les d\u00e9ve\u00adlop\u00adpeurs Ruby et Python sont connus pour tra\u00adquer la plus petite excep\u00adtion. Bien que fas\u00adti\u00addieuse, cette m\u00e9tho\u00addo\u00adlo\u00adgie est une bonne chose, car si quelque chose tourne mal, une excep\u00adtion est aus\u00adsi\u00adt\u00f4t lan\u00adc\u00e9e et per\u00admet de loca\u00adli\u00adser rapi\u00adde\u00adment d\u2019o\u00f9 vient le probl\u00e8me.<br>\nEn PHP, et plus par\u00adti\u00adcu\u00adli\u00e8\u00adre\u00adment avec les fra\u00adme\u00adworks \u00ab&nbsp;anciens&nbsp;\u00bb comme Cake\u00adPHP ou CodeI\u00adgni\u00adter pra\u00adtiquent ce que l\u2019on peut appe\u00adl\u00e9 du code \u00ab&nbsp;faussement-content&nbsp;\u00bb. Au lieu de lan\u00adcer une excep\u00adtion, ils pr\u00e9\u00adf\u00e8rent ren\u00advoyer un false et assi\u00adgner un mes\u00adsage d\u2019er\u00adreur dans une pro\u00adpri\u00e9\u00adt\u00e9, ce qui force le pro\u00adgram\u00admeur \u00e0 aller p\u00eacher l\u2019er\u00adreur \u00e0 l\u2019aide de la m\u00e9thode <span class=\"ccode\">get_error()<\/span>.<br>\nUti\u00adli\u00adser la m\u00e9thode de \u00ab&nbsp;l\u2019heu\u00adreuse excep\u00adtion&nbsp;\u00bb est bien plus pro\u00adduc\u00adtif. Si le fra\u00adme\u00adwork que vous uti\u00adli\u00adsez pos\u00ads\u00e8de une classe de ges\u00adtion des excep\u00adtions, il est bien plus simple de l\u2019\u00e9\u00adtendre avec vos propres excep\u00adtions et ain\u00adsi sim\u00adpli\u00adfier consi\u00add\u00e9\u00adra\u00adble\u00adment le d\u00e9bogage.<\/p>\n<pre class=\"brush:php\">class MonException extends Exception {}<\/pre>\n<h3>10\/ Utiliser les bonnes clauses<\/h3>\n<p>Il est d\u2019u\u00adsage d\u2019u\u00adti\u00adli\u00adser les ins\u00adtruc\u00adtions condi\u00adtion\u00adnelles pour faire modi\u00adfier le flux d\u2019ex\u00e9\u00adcu\u00adtion. Il est ten\u00adtant de tes\u00adter une condi\u00adtion puis d\u2019ex\u00e9\u00adcu\u00adter beau\u00adcoup de codes si la condi\u00adtion est vraie et de repor\u00adter dans le else tout ce qui ne rem\u00adplit pas la condition.<\/p>\n<p>Ce type de solu\u00adtion, pr\u00e9\u00adsente un risque de \u00ab&nbsp;spa\u00adghet\u00adti\u00adsa\u00adtion&nbsp;\u00bb du code. On peut rendre ce code beau\u00adcoup plus lisible si nous ren\u00adver\u00adsons la condi\u00adtion comme&nbsp;suit&nbsp;:<\/p>\n<pre class=\"brush:php\">function uneFonction($param) {\n  if ($param != 'OK') return false;\n  $this-&gt;faitUntruc();\n  return true;\n}<\/pre>\n<p>Cette tech\u00adnique com\u00adbi\u00adn\u00e9e aux deux autres vues pr\u00e9\u00adc\u00e9\u00addem\u00adment per\u00admet d\u2019a\u00advoir un code \u00e0 la fois beau\u00adcoup plus \u00e9l\u00e9\u00adgant mais aus\u00adsi bien plus facile \u00e0 entretenir.<\/p>\n<h3 id=\"utilisezwhilepourlesitrationssimples\">11\/ Utilisez While pour les it\u00e9rations simples<\/h3>\n<p>La boucle for est uti\u00adli\u00ads\u00e9e cou\u00adram\u00adment quand vous avez besoin d\u2019un comp\u00adteur comme&nbsp;ici&nbsp;:<\/p>\n<pre class=\"brush:php\">for (var i = 0; i &lt; x; i++) { ... }<\/pre>\n<p>Il y a de tr\u00e8s bonnes rai\u00adsons d\u2019utiliser la boucle&nbsp;<code>for<\/code>&nbsp;; mais pour des cas aus\u00adsi simples, la boucle&nbsp;<code>while<\/code>&nbsp;est bien plus efficace&nbsp;:<\/p>\n<pre class=\"brush:php\">var i = x; while (i--) { ... }<\/pre>\n<p>Et tra\u00addi\u00adtion\u00adnel\u00adle\u00adment la boucle&nbsp;<code>while<\/code>&nbsp;est un peu plus rapide que la boucle&nbsp;<code>for<\/code>, il est donc pr\u00e9\u00adf\u00e9\u00adrable de l\u2019utiliser d\u00e8s que c\u2019est possible.<\/p>\n<h3 id=\"facilitez-vouslentretiendevosmthodes\">12\/ Facilitez-vous l\u2019entretien de vos m\u00e9thodes<\/h3>\n<p>Une m\u00e9thode rem\u00adplit en g\u00e9n\u00e9\u00adral une fonc\u00adtion simple et limi\u00adter \u00e0 une taille rai\u00adson\u00adnable les m\u00e9thodes est un gage de bon fonc\u00adtion\u00adne\u00adment et acces\u00adsoi\u00adre\u00adment d\u2019\u00e9volutivit\u00e9. Voi\u00adci par exemple un petit monstre&nbsp;:<\/p>\n<pre class=\"brush:php\">class SomeClass {\n   function monsterMethod() {\n      if($weArePilots) {\n         $this-&gt;goAndDressUp();\n         $this-&gt;washYourTeeth();\n         $this-&gt;cleanYourWeapon();\n         $this-&gt;takeYourHelmet();\n         if($this-&gt;helmetDoesNotFit())\n            $this-&gt;takeAHat();\n         else\n            $this-&gt;installHelmet();\n         $this-&gt;chekcYourKnife();\n         if($this-&gt;myAirplain() == \"F22\")\n            $this-&gt;goToArmyAirport();\n         else\n            $this-&gt;goToCivilianAirport();\n         $this-&gt;aim();\n         $this-&gt;prepare();\n         $this-&gt;fire();\n      }\n   }\n}<\/pre>\n<p>En d\u00e9cou\u00adpant ce monstre en uni\u00adt\u00e9s fonc\u00adtion\u00adnelles plus petites, on s\u2019assure un entre\u00adtien plus facile (et une plus grande uni\u00adver\u00adsa\u00adli\u00adt\u00e9 du code). C\u2019est une des erreurs les plus com\u00admunes mises en \u0153uvre par les d\u00e9butants.<\/p>\n<pre class=\"brush:php\">class SomeClass {\n   function monsterMethod() {\n      if($weArePilots) {\n         $this-&gt;prepareYourself();\n         $this-&gt;tryHelmet();\n         $this-&gt;findYourAirport();\n         $this-&gt;fightEnemy();\n      }\n   }\n   private function prepareYourself() {\n      $this-&gt;goAndDressUp();\n      $this-&gt;washYourTeeth();\n      $this-&gt;cleanYourWeapon();\n      $this-&gt;chekcYourKnife();\n   }\n   private function tryHelmet() {\n      $this-&gt;takeYourHelmet();\n      if($this-&gt;helmetDoesNotFit())\n         $this-&gt;takeAHat();\n      else\n         $this-&gt;installHelmet();\n   }\n   private function findYourAirport() {\n      if($this-&gt;myAirplain() == \"F22\")\n         $this-&gt;goToArmyAirport();\n      else\n         $this-&gt;goToCivilianAirport();\n   }\n   private function fightEnemy() {\n      $this-&gt;aim();\n      $this-&gt;prepare();\n      $this-&gt;fire();\n   }\n}<\/pre>\n<h3 id=\"vitezunetropgrandeimbrication\">13\/ \u00c9vitez une trop grande imbrication<\/h3>\n<p>Un trop grand nombre d\u2019imbrications dans le code le rendent dif\u00adfi\u00adcile \u00e0 entre\u00adte\u00adnir, exemple&nbsp;:<\/p>\n<pre class=\"brush:php\">function doSomething() {\n    if ($someCondition) {\n        if ($someOtherCondition) {\n            if ($yetSomeOtherCondition) {\n                doSomethingSpecial();\n            }\n            doSomethingElse();\n        }\n    }\n}<\/pre>\n<p>En uti\u00adli\u00adsant le conseil #10 on obtient quelque chose de plus convivial&nbsp;:<\/p>\n<pre class=\"brush:php\">function doSomething() {\n    if (!$someCondition) {\n        return false;\n    }\n    if (!$someOtherCondition) {\n        return false;\n    }\n    if ($yetSomeOtherCondition) {\n        doSomethingSpecial();\n    }\n    doSomethingElse();\n}<\/pre>\n<p>Si vous \u00eates confron\u00adt\u00e9 \u00e0 ce type d\u2019imbrication, il y a de fortes chances que votre code puisse \u00eatre d\u00e9com\u00adpo\u00ads\u00e9 en uni\u00adt\u00e9 fonc\u00adtion\u00adnelle plus simple&nbsp;:<\/p>\n<pre class=\"brush:php\">function someFunc() {\n   if($oneThing) {\n      $this-&gt;doSomething();\n      if($anotherThing)\n         $this-&gt;doSomethingElse();\n   }\n}<\/pre>\n<p>Cette m\u00e9thode est d\u00e9com\u00adpo\u00adsable en deux sous-m\u00e9thode plus claires&nbsp;:<\/p>\n<pre class=\"brush:php\">function someFunc() {\n   if($oneThing) {\n      $this-&gt;doSomething();\n      $this-&gt;doAnotherThing($anotherThing);\n   }\n}\nprivate doAnotherThing($anotherThing) {\n   if($anotherThing)\n      $this-&gt;doSomethingElse();\n}<\/pre>\n<p>Lorsque vous \u00eates confron\u00adt\u00e9 vous-m\u00eame \u00e0 une trop grande imbri\u00adca\u00adtion des <span class=\"ccode\">if<\/span>, exa\u00admi\u00adnez votre code, il se pour\u00adrait que votre m\u00e9thode veuille faire trop de choses, et vous aurez tout int\u00e9\u00adr\u00eat \u00e0 seg\u00admen\u00adter ses actions et donc \u00e0 cr\u00e9er d\u2019autres m\u00e9thodes. Un exemple&nbsp;:<\/p>\n<pre class=\"brush:php\">function someFunct() {\n   $this-&gt;order-&gt;set(23);\n   $this-&gt;order-&gt;addProduct('superComputer');\n   $this-&gt;shoppingList-&gt;add('superComputer');\n}<\/pre>\n<p>Dans ce cas, il faut extraire la m\u00e9thode imbri\u00adqu\u00e9e et pour lui don\u00adner une exis\u00adtence propre.<\/p>\n<pre class=\"brush:php\">function someFunct() {\n   $orderId = 23;\n   $selectedProductName = 'superComputer';\n   $this-&gt;order-&gt;set($orderId);\n   $this-&gt;order-&gt;addProduct($selectedProductName);\n   $this-&gt;shoppingList-&gt;add($selectedProductName);\n}<\/pre>\n<h3 id=\"vitezlutilisationdeschiffresetchanesdecaractresmagiques\">14\/ \u00c9vitez l\u2019utilisation des chiffres et cha\u00eenes de caract\u00e8res \u201cmagiques\u201d<\/h3>\n<p>Chiffres et cha\u00eenes magiques sont sou\u00advent uti\u00adli\u00ads\u00e9s comme para\u00adm\u00e8tres lors d\u2019un appel de fonc\u00adtion ou de m\u00e9thode sans autre forme d\u2019explication et qui rendent si dif\u00adfi\u00adcile la com\u00adpr\u00e9\u00adhen\u00adsion du schmil\u00adblick pas seule\u00adment pour les autres, mais aus\u00adsi pour vous pas\u00ads\u00e9 quelque temps. Au lieu de&nbsp;ceci&nbsp;:<\/p>\n<pre class=\"brush:php\">function someFunct() {\n   $this-&gt;order-&gt;set(23);\n   $this-&gt;order-&gt;addProduct('superComputer');\n   $this-&gt;shoppingList-&gt;add('superComputer');\n}<\/pre>\n<p>Sp\u00e9\u00adci\u00adfiez ce que ces chiffres et cha\u00eene veulent dire, pour ce faire, il suf\u00adfit de les assi\u00adgn\u00e9s \u00e0 une variable au nom explicite&nbsp;!<\/p>\n<pre class=\"brush:php\">function someFunct() {\n   $orderId = 23;\n   $selectedProductName = 'superComputer';\n   $this-&gt;order-&gt;set($orderId);\n   $this-&gt;order-&gt;addProduct($selectedProductName);\n   $this-&gt;shoppingList-&gt;add($selectedProductName);\n}<\/pre>\n<blockquote><p>Cer\u00adtains sacri\u00adfient la cr\u00e9a\u00adtion de variables sur l\u2019h\u00f4tel de la per\u00adfor\u00admance&nbsp;; cepen\u00addant, rete\u00adnez qu\u2019il faut tou\u00adjours don\u00adner la prio\u00adri\u00adt\u00e9 \u00e0 la lisi\u00adbi\u00adli\u00adt\u00e9. L\u2019optimisation devient n\u00e9ces\u00adsaire quand vous pou\u00advez dire pour\u00adquoi elle est&nbsp;<em>n\u00e9ces\u00adsaire<\/em>.<\/p><\/blockquote>\n<h3 id=\"utilisezlesfonctionsintgrespourlestableaux\">15\/ Utilisez les fonctions int\u00e9gr\u00e9es pour les tableaux<\/h3>\n<p>Plu\u00adt\u00f4t que d\u2019utiliser des&nbsp;<span class=\"ccode\">foreach()<\/span>&nbsp;\u00e0 r\u00e9p\u00e9\u00adti\u00adtion pour faire des choses \u00e9l\u00e9\u00admen\u00adtaires comme&nbsp;:<\/p>\n<pre class=\"brush:php\">foreach (&amp;$myArray as $key =&gt;$element) {\n   if ($element &gt; 5) unset ($myArray[$key]);\n}<\/pre>\n<p>Il est pr\u00e9\u00adf\u00e9\u00adrable de faire comme&nbsp;ceci&nbsp;:<\/p>\n<pre class=\"brush:php\">$myArray = array_filter($myArray, function ($element) { return $element &lt;= 5;});<\/pre>\n<p>PHP offre une large vari\u00e9\u00adt\u00e9 de m\u00e9thodes d\u00e9di\u00e9es aux tableaux. Certes, pas tou\u00adjours simple de prime abord, mais pre\u00adnez le temps de les apprendre, vous y gagne\u00adrez \u00e0 la longue.<\/p>\n<h3 id=\"vitezdesur-utilisezlesvariables\">16\/ \u00c9vitez de sur-utilisez les variables<\/h3>\n<p>Mal\u00adgr\u00e9 ce qui a \u00e9t\u00e9 dit au point n\u00b014, il faut cepen\u00addant faire atten\u00adtion de ne pas g\u00e9n\u00e9\u00adrer des variables inutiles. Regar\u00addez ce&nbsp;code&nbsp;:<\/p>\n<pre class=\"brush:php\">public function get_posts() {\n   $query = $this-&gt;db-&gt;get('posts');\n   $result = $query-&gt;result();\n   return $result;\n}<\/pre>\n<p>La variable&nbsp;<span class=\"ccode\">$result<\/span>&nbsp;est ici tota\u00adle\u00adment inutile, le code sui\u00advant est tout aus\u00adsi effi\u00adcace et&nbsp;clair&nbsp;:<\/p>\n<pre class=\"brush:php\">public function get_posts() {\n   $query = $this-&gt;db-&gt;get('posts');\n   return $query-&gt;result();\n}<\/pre>\n<h2 id=\"conseilsgnraux\">Conseils g\u00e9n\u00e9raux<\/h2>\n<h3 id=\"reposez-voussurlemoteurdebasededonnes\">17\/ Reposez-vous sur le moteur de base de donn\u00e9es<\/h3>\n<p>Une base de don\u00adn\u00e9es est con\u00e7ue pour mani\u00adpu\u00adler des infor\u00adma\u00adtions, uti\u00adli\u00adsez les outils qu\u2019elle met \u00e0 votre dis\u00adpo\u00adsi\u00adtion pour conce\u00advoir des appli\u00adca\u00adtions plus effi\u00adcaces. Par exemple, vous pou\u00advez r\u00e9duire le nombre de requ\u00eates redon\u00addantes dans pas mal de cir\u00adcons\u00adtances. La plu\u00adpart des scripts de ges\u00adtion uti\u00adli\u00adsa\u00adteur font au moins deux requ\u00eates pour un enre\u00adgis\u00adtre\u00adment, une pour v\u00e9ri\u00adfier si l\u2019email ou le nom d\u2019utilisateur n\u2019existe pas puis une autre requ\u00eate pour l\u2019enregistrement lui-m\u00eame. Il serait pr\u00e9\u00adf\u00e9\u00adrable de faire en sorte que le champ soit UNIQUE et alors uti\u00adli\u00adser les fonc\u00adtions natives de MyS\u00adQL pour la v\u00e9ri\u00adfi\u00adca\u00adtion puis l\u2019insertion (ou&nbsp;pas).<\/p>\n<blockquote><p>Moins on code mieux on&nbsp;code.<\/p><\/blockquote>\n<h3 id=\"nommezcorrectementvosvariables\">18\/ Nommez correctement vos variables<\/h3>\n<p>Le temps o\u00f9 l\u2019on nom\u00admait les variables&nbsp;<code class=\"ccode\">x<\/code>,&nbsp;<code class=\"ccode\">y<\/code>&nbsp;ou&nbsp;<code class=\"ccode\">z<\/code>&nbsp;est r\u00e9vo\u00adlu (\u00e0 moins que cela ne soit des coor\u00addon\u00adn\u00e9es spa\u00adtiales ). Les variables repr\u00e9\u00adsentent une part impor\u00adtante de la logique de votre d\u00e9ve\u00adlop\u00adpe\u00adment. Si vous ne vou\u00adlez pas taper des noms longs pour vos variables, chan\u00adgez de cr\u00e9\u00adme\u00adrie. Heu, chan\u00adgez d\u2019IDE&nbsp;! Les plus modernes d\u2019entre eux pro\u00adposent une com\u00adpl\u00e9\u00adtion qui r\u00e9agit au quart de tour m\u00eame pour les variables.<\/p>\n<blockquote><p>Codez tou\u00adjours comme si vous le fai\u00adsiez dans l\u2019optique de reve\u00adnir sur le code six mois plus tard. \u00cates-vous cer\u00adtain que la variable&nbsp;<code class=\"ccode\">$truc<\/code>&nbsp;aura encore une signi\u00adfi\u00adca\u00adtion pour vous dans un an&nbsp;? Cer\u00adtai\u00adne\u00adment pas, donc, soyez descriptif.<\/p><\/blockquote>\n<h3 id=\"lesmthodessontdesactions\">19\/ Les m\u00e9thodes sont des actions<\/h3>\n<p>Nom\u00admez vos m\u00e9thodes avec des verbes repr\u00e9\u00adsen\u00adtant l\u2019action cl\u00e9. Le concept est exac\u00adte\u00adment l\u2019inverse que pour les variables. Uti\u00adli\u00adsez une forme courte, mais des\u00adcrip\u00adtive. Pri\u00advi\u00adl\u00e9\u00adgiez les m\u00e9thodes au nom court pour les m\u00e9thodes publiques et des noms plus long (et donc plus des\u00adcrip\u00adtifs) pour les m\u00e9thodes pri\u00adv\u00e9es. Ceci devrait aider \u00e0 lire votre code comme une belle prose. \u00c9vi\u00adtez d\u2019utiliser une autre langue que l\u2019anglais pour le code. Pour\u00adquoi&nbsp;? Si vous d\u00e9ve\u00adlop\u00adpez des plug-in pour Word\u00adPress ou jQue\u00adry, une quasi-majorit\u00e9 de vos uti\u00adli\u00adsa\u00adteurs seront anglo\u00adphones, chouchoutez-l\u00e8s. L\u2019anglais est clair et concis, c\u2019est la langue inter\u00adna\u00adtio\u00adnale de la pro\u00adgram\u00adma\u00adtion, c\u2019est un fait, tenez-en compte&nbsp;; apr\u00e8s si vous vou\u00adlez jouer l\u2019exception cultu\u00adrelle, c\u2019est votre&nbsp;choix.<\/p>\n<h3 id=\"recommandationdestructure\">20\/ Recommandation de structure<\/h3>\n<p>Fina\u00adle\u00adment, la struc\u00adture du code est une chose aus\u00adsi impor\u00adtante que la lisi\u00adbi\u00adli\u00adt\u00e9 et que toutes les choses que nous venons de voir. Voi\u00adci donc deux recommandations&nbsp;:<\/p>\n<ul>\n<li>inden\u00adtez avec quatre ou deux espaces, plus serait d\u00e9rai\u00adson\u00adnable et nui\u00adrait cer\u00adtai\u00adne\u00adment \u00e0 la clar\u00adt\u00e9 de l\u2019ensemble.<\/li>\n<li>Le para\u00adgraphe ori\u00adgi\u00adnal par\u00adlait de la lar\u00adgeur de la ligne qu\u2019il est pr\u00e9\u00adf\u00e9\u00adrable de l\u2019imiter \u00e0 120 carac\u00adt\u00e8res de n\u2019avoir pas \u00e0 scrol\u00adler pour visua\u00adli\u00adser tout le code. Je suis per\u00adson\u00adnel\u00adle\u00adment en accord avec cette recom\u00adman\u00adda\u00adtion&nbsp;; mais il se trouve que tous les \u00e9di\u00adteurs de code modernes pos\u00ads\u00e8dent une fonc\u00adtion de world-wrap qui for\u00admate le code \u00e0 la lar\u00adgeur de la fen\u00eatre de tra\u00advail ce qui rend ce conseil moins per\u00adti\u00adnent&nbsp;; cepen\u00addant, il n\u2019en demeure pas moins que pour bien coder, il faut avoir aus\u00adsi un bon outil. Cet article n\u2019est pas l\u00e0 pour vous aider \u00e0 choi\u00adsir un bon \u00e9di\u00adteur de code&nbsp;; mais, quel que soit votre choix, appre\u00adnez \u00e0 vous en servir.<\/li>\n<\/ul>\n<h2 id=\"conclusion\">Conclusion<\/h2>\n<blockquote><p><span class=\"dquo\">\u201c<\/span><em>Je n\u2019ai jamais com\u00admis d\u2019erreur stu\u00adpide<\/em>\u201d Per\u00adsonne. Jamais.<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Cet article est libre\u00adment ins\u00adpi\u00adr\u00e9 et tra\u00adduit d\u2019un article de net.tutsplus.com. Quel que soit notre niveau de ma\u00ee\u00adtrise, nous avons tous \u00e9t\u00e9 d\u00e9bu\u00adtants. Com\u00admet\u00adtant des erreurs de d\u00e9bu\u00adtants. Cet article ne fera pas de vous un expert infaillible (si cela existe quelque part). Il fait juste un petit tour d\u2019ho\u00adri\u00adzon des erreurs \u00e0 \u00e9vi\u00adter&nbsp;ou&nbsp;[\u2026]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"wp_typography_post_enhancements_disabled":false,"jetpack_post_was_ever_published":false,"footnotes":""},"categories":[118,2,7],"tags":[106,107,105,49,108,109,26],"class_list":["post-468","post","type-post","status-publish","format-standard","hentry","category-developpement","category-informatique","category-web","tag-20-conseils","tag-bonnes-pratiques","tag-conseils-en-programmation","tag-javascript","tag-manipulation-du-dom","tag-operateur-ternaire","tag-programmation"],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p2W6XU-7y","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/degraphiks.com\/blog\/wp-json\/wp\/v2\/posts\/468","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/degraphiks.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/degraphiks.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/degraphiks.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/degraphiks.com\/blog\/wp-json\/wp\/v2\/comments?post=468"}],"version-history":[{"count":22,"href":"http:\/\/degraphiks.com\/blog\/wp-json\/wp\/v2\/posts\/468\/revisions"}],"predecessor-version":[{"id":477,"href":"http:\/\/degraphiks.com\/blog\/wp-json\/wp\/v2\/posts\/468\/revisions\/477"}],"wp:attachment":[{"href":"http:\/\/degraphiks.com\/blog\/wp-json\/wp\/v2\/media?parent=468"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/degraphiks.com\/blog\/wp-json\/wp\/v2\/categories?post=468"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/degraphiks.com\/blog\/wp-json\/wp\/v2\/tags?post=468"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}