<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Chroniques d&#039;un webliver</title>
	<atom:link href="http://jonathankowalski.fr/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://jonathankowalski.fr/blog</link>
	<description>(nous) developpons \1</description>
	<lastBuildDate>Wed, 06 Feb 2013 20:33:23 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.1</generator>
	<item>
		<title>Faut-il commenter votre code ?</title>
		<link>http://jonathankowalski.fr/blog/2013/02/faut-il-commenter-votre-code/</link>
		<comments>http://jonathankowalski.fr/blog/2013/02/faut-il-commenter-votre-code/#comments</comments>
		<pubDate>Wed, 06 Feb 2013 20:30:19 +0000</pubDate>
		<dc:creator><![CDATA[Jonathan Kowalski]]></dc:creator>
				<category><![CDATA[developpement]]></category>
		<category><![CDATA[bonnes pratiques]]></category>
		<category><![CDATA[commentaire]]></category>

		<guid isPermaLink="false">http://jonathankowalski.fr/blog/?p=640</guid>
		<description><![CDATA[Poser comme cela la réponse à cette question peut paraitre évidente. Ce cher Captain Obvious répondrait d&#8217;ailleurs lui-même avec l’aplomb qu&#8217;on lui connait : Oui évidemment. Et nous de répondre &#171;&#160;Merci Captain Obvious&#160;&#187;. Cependant et pas seulement pour remplir quelques &#8230; <a href="http://jonathankowalski.fr/blog/2013/02/faut-il-commenter-votre-code/">Lire la Suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Poser comme cela la réponse à cette question peut paraitre évidente. Ce cher <em>Captain Obvious </em>répondrait d&rsquo;ailleurs lui-même avec l’aplomb qu&rsquo;on lui connait :</p>
<blockquote><p>Oui évidemment.</p></blockquote>
<p>Et nous de répondre &laquo;&nbsp;Merci Captain Obvious&nbsp;&raquo;.</p>
<p>Cependant et pas seulement pour remplir quelques lignes de plus sur ce blog, il s&rsquo;avère que tant question comme réponse peuvent dans les faits se révéler un tantinet plus complexe.</p>
<p><span id="more-640"></span>Depuis que je pratique le code et après les quelques lignes écrites par mes nombreux confrères que j&rsquo;ai pu lire, certains profils se dégagent clairement dans la grande caste des commentateurs de fichiers sources que nous sommes.</p>
<h2>Le prolixe</h2>
<p>Sans surprise, le prolixe commente beaucoup, son style est souvent irréprochable et son art de trouver le &laquo;&nbsp;mot juste&nbsp;&raquo;, celui de Flaubert, frôle souvent la perfection.</p>
<script src="https://gist.github.com/4724813.js"></script><noscript><pre><code class="language-php php">&lt;?php

/**
 * Ce voyageur ail&eacute;, comme il est gauche et veule!
 * Lui, nagu&egrave;re si beau, qu'il est comique et laid!
 * L'un agace son bec avec un br&ucirc;le-gueule,
 * L'autre mime, en boitant, l'infirme qui volait!
 **/
$albatros = 0x2A;</code></pre></noscript>
<h2>Le pointilleux</h2>
<p>Le pointilleux commente tout et peut se targuer que dans toute sa carrière, pas un seul malheureux octet de fichier source n&rsquo;ait été couvert par l&rsquo;un des ses commentaires avisés.</p>
<script src="https://gist.github.com/4724842.js"></script><noscript><pre><code class="language-php php">&lt;?php
//balise de code php ouvrante

/**
 * Classe de commentaire
 */
class Commentaire {

  //Variables priv&eacute;es
  private $var;

  //Variables prot&eacute;g&eacute;es
  protected $pro;

  //constructeur
  public function __construct(){
    
    //accolade fermante
  }
}</code></pre></noscript>
<h2>L&rsquo;obscur</h2>
<p>Contrairement au pointilleux, l&rsquo;obscur ne commente rien ou presque, trouvant que ce qu&rsquo;il a fait s&rsquo;avère être très clair quoiqu&rsquo;un peu alambiqué. Oui l&rsquo;obscur est un être paradoxal.</p>
<script src="https://gist.github.com/4725233.js"></script><noscript><pre><code class="language-php php">&lt;?php
$j=$a=1;
echo '&lt;ul&gt;';
do{
  $a = $a &lt;&lt; 1;
  $i = ($a-$j)%2;
  $class = empty($i)?'e':'o';
  echo '&lt;li class=&quot;'.$class.'&quot;&gt;'.$j.'&lt;/li&gt;';
  $j++;
} while($j&lt;=10);
echo '&lt;/ul&gt;';</code></pre></noscript>
<p>Bon nous avons vu ce qu’il ne fallait pas faire, voyons maintenant a partir de quelques conseils simples comment améliorer nos commentaires.</p>
<p>&nbsp;</p>
<h2>1. Évitez d’avoir à commenter</h2>
<p>Dans un monde idéal on ne devrait pas avoir à commenter. Dans un monde idéal votre code devrait couler telle une tranquille rivière le long de son lit.</p>
<p>Alors certes nous ne sommes pas dans un monde idéal, mais cette vérité concerne plutôt le point 2, ici nous allons tout faire pour nous approcher de l’idéal.</p>
<p>Donnez à vos variables des noms significatifs. Evidemment ne sombrons pas dans la caricature avec des <code>$variableServantPourIncrementerMaBoucle</code> à la place d&rsquo;un <code>$i</code> adopté par tous, mais plutôt qu&rsquo;un énigmatique <code>$tab</code> ne vous privez pas d&rsquo;un <code>$listModelCar</code> immédiatement plus parlant.</p>
<h2>2. Commentez pour expliquer</h2>
<p>Malgré tout et comme dit plus haut, nous ne sommes pas dans un monde idéal <img src="http://jonathankowalski.fr/blog/wp-includes/images/smilies/icon_sad.gif" alt=":(" class="wp-smiley" /> Une fois ce terrible constat fait, il nous reste deux choses à faire en premier lieu, s&rsquo;engager dans une oeuvre humanitaire et commenter notre code.</p>
<p>Il peut arriver que vous écriviez votre code et qu&rsquo;en le relisant rapidement vous arriviez à la conclusion suivante : &laquo;&nbsp;On y comprend rien&nbsp;&raquo;</p>
<p>Alors après avoir suivi le premier conseil et essayé de simplifier et clarifier votre code, commentez pour expliquer. Commentez en indiquant pourquoi vous avez choisi cette solution, pourquoi cette voie vous a semblé meilleure à suivre. Prenez du recul et essayez d&rsquo;imaginer ce qui vous aurait fait gagné du temps en arrivant sur ce bout de code que vous venez d&rsquo;écrire.</p>
<h2>3. Commentez pour mettre en lumière</h2>
<p>Parfois, une partie de votre code peut paraître anodine mais est en réalité très importante. Dans ce cas n’hésitez pas à indiquer en commentaire l&rsquo;importance de ce petit bout de code. Défendez-le contre le risque d’altération si vous pensez cela nécessaire.</p>
<h4>Exemple</h4>
<script src="https://gist.github.com/4725032.js"></script><noscript><pre><code class="language-php php">&lt;?php


function getContentForPdf($htmlText){
  //le pdf ne reconnait que les tags p et page, plante sinon :(
  $pdfText = strip_tags($htmlText, '&lt;p&gt;');
  return '&lt;page&gt;'.$pdfText.'&lt;/page&gt;';
}</code></pre></noscript>
<h2>4. Ne commentez surtout pas comme ça</h2>
<p>Il y a une chose horrible, une chose qui provoque la mort d&rsquo;un chaton quelque part sur Terre à chaque fois que cela se produit.</p>
<p>Oui vous tuez un chaton à chaque fois que <strong>vous commentez du code </strong>! Vous ne pourrez plus dire que vous ne saviez pas. Le fait de commenter du code à cette particularité horrible de mettre le développeur qui passe derrière vous dans une situation très inconfortable. &laquo;&nbsp;Pourquoi ce code a-t-il été commenté ?&nbsp;&raquo;, &laquo;&nbsp;Faut-il le conserver ?&nbsp;&raquo;, &laquo;&nbsp;Peut-on l&rsquo;effacer ?&nbsp;&raquo;</p>
<p>Vous utilisez sans doute un gestionnaire de révisions, qu&rsquo;il s&rsquo;agisse de Git ou <a title="Qui utilise encore Subversion ?" href="http://jonathankowalski.fr/blog/2013/01/qui-utilise-encore-subversion/">Subversion</a> ou n&rsquo;importe lequel d&rsquo;autre, il est cent fois, mille fois plus adapté à garder trace de votre code que ces pauvres commentaires.</p>
<h2>Conclusion</h2>
<p>Nous avons vu tout cela un peu rapidement mais vous avez compris l&rsquo;idée, efforcez-vous d&rsquo;être clair, concis et évitez les redondances. Pour ne garder qu&rsquo;un conseil commentez comme vous codez. Ne commentez pas pour rien et apportez le plus grand soin aux commentaires que vous aurez à produire.</p>
]]></content:encoded>
			<wfw:commentRss>http://jonathankowalski.fr/blog/2013/02/faut-il-commenter-votre-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qui utilise encore Subversion ?</title>
		<link>http://jonathankowalski.fr/blog/2013/01/qui-utilise-encore-subversion/</link>
		<comments>http://jonathankowalski.fr/blog/2013/01/qui-utilise-encore-subversion/#comments</comments>
		<pubDate>Tue, 22 Jan 2013 13:33:25 +0000</pubDate>
		<dc:creator><![CDATA[Jonathan Kowalski]]></dc:creator>
				<category><![CDATA[logiciels]]></category>
		<category><![CDATA[astuces]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://jonathankowalski.fr/blog/?p=618</guid>
		<description><![CDATA[:troll spotted: C&#8217;est vrai Git est à la mode. Sans doute en partie grâce à son support n°1 Github mais aussi parce que pouvoir versionner seul dans son coin sans à avoir à se soucier d&#8217;un serveur n&#8217;a jamais été &#8230; <a href="http://jonathankowalski.fr/blog/2013/01/qui-utilise-encore-subversion/">Lire la Suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>:troll spotted:</p>
<p>C&rsquo;est vrai Git est à la mode. Sans doute en partie grâce à son support n°1 Github mais aussi parce que pouvoir versionner seul dans son coin sans à avoir à se soucier d&rsquo;un serveur n&rsquo;a jamais été aussi simple ou parce que sa gestion des branches est aussi succulente qu&rsquo;un petit chocolat fourré aux amandes.</p>
<p>Moi-même j&rsquo;utilise Git pour tous mes projets perso, que ce soit en développement ou pas d&rsquo;ailleurs.</p>
<p>On en vient à se poser la question &laquo;&nbsp;Qui peut donc encore utiliser Subversion aujourd&rsquo;hui ?&nbsp;&raquo; :troll respotted:</p>
<p>Alors loin de moi l&rsquo;idée de refaire ici la guéguerre<sup><a href="http://jonathankowalski.fr/blog/2013/01/qui-utilise-encore-subversion/#footnote_0_618" id="identifier_0_618" class="footnote-link footnote-identifier-link" title="il suffit de taper svn vs git dans votre moteur de recherche favori">1</a></sup> car que vous le vouliez ou non la réponse à la question posée est : <strong>Énormément de monde</strong>.</p>
<p>Subversion, SVN de son petit nom est encore très largement implanté car historique et très bien supporté par la plupart des systèmes et IDE existants. Il est donc bon de connaitre quelques petits trucs et astuces, le concernant au cas ou vous auriez à traiter avec la bête.</p>
<p>C&rsquo;est l&rsquo;objet de ce post ^^</p>
<p><span id="more-618"></span></p>
<h2> Bonnes pratiques</h2>
<p>Avant de commencer voici 3 bonnes pratiques qui pourraient s&rsquo;appliquer d&rsquo;ailleurs à bon nombre de gestionnaire de révisions et pas seulement SVN. Elles vous permettront de travailler intelligemment.</p>
<ul>
<li><strong>Commitez souvent</strong><br />
Il est important de commiter souvent. Bien sur vous prendrez le soin de ne pas casser le build, mais il faut garder aussi peu de valeur que possible dans votre répertoire de travail.</li>
<li><strong>Commitez &laquo;&nbsp;intelligent&nbsp;&raquo;</strong><br />
Essayez de grouper les modifications qui &laquo;&nbsp;s&rsquo;emboitent&nbsp;&raquo; logiquement. Ne mettez pas dans le même commit votre correction d&rsquo;indentation et l&rsquo;ajout d&rsquo;une fonctionnalité.</li>
<li><strong>Essayez d&rsquo;être le plus descriptif possible dans le commentaire de vos commits</strong><br />
Ce sera utile pour les autres développeurs (ou vous même 6 mois plus tard) pour identifier clairement un commit.</li>
</ul>
<h2>Astuces</h2>
<p>L&rsquo;utilisation de Subversion peut être encore faciliter par de menues modifications, il est aussi bon de rappeler comment revenir à êtat antérieur si vous avez par exemple provoqué un bug<sup><a href="http://jonathankowalski.fr/blog/2013/01/qui-utilise-encore-subversion/#footnote_1_618" id="identifier_1_618" class="footnote-link footnote-identifier-link" title="c&rsquo;est rare je sais">2</a></sup> ou si le client a changé d&rsquo;avis<sup><a href="http://jonathankowalski.fr/blog/2013/01/qui-utilise-encore-subversion/#footnote_2_618" id="identifier_2_618" class="footnote-link footnote-identifier-link" title="alors &ccedil;a &ccedil;a n&rsquo;arrive carr&eacute;ment jamais &hellip; -_-">3</a></sup></p>
<h3>Avoir un ignore global</h3>
<p>Dans svn vous pouvez éditer projet par projet les fichiers que vous souhaitez ignorer via la propriété <em>svn:ignore</em>.Cependant, il peut être utile de définir une fois pour toutes que les fichiers <em>.properties </em>et<em> .pyc</em> bordel on en veut pas !!!</p>
<p>Pour faire cela sans s’énerver, c&rsquo;est très simple. Il suffit d’éditer le fichier config. Balancez depuis votre répertoire personnel un petit</p>
<pre>vim .subversion/config</pre>
<p>Cherchez la ligne<em><strong> global-ignores</strong></em> et indiquez tous les patterns des fichiers que vous ne voudrez jamais versionner.</p>
<p>Si vous utilisez Windows et l&rsquo;excellent TortoiseSVN, il suffit de faire un clic-droit <em>TortoiseSVN &gt; Settings</em> et vous avez sur <em>General</em> (la 1ere page) le global ignore pattern que vous pouvez éditer.</p>
<h3>Utiliser Vim pour vos diffs</h3>
<p>Le diff par défaut de SVN est assez difficile à lire dans un terminal. En revanche l&rsquo;excellent Vim propose un outil très pratique <em>vimdiff</em></p>
<p>Creez où vous le souhaitez le fichier suivant (que vous pouvez trouver dans la doc SVN <a href="http://svnbook.red-bean.com/en/1.4/svn.advanced.externaldifftools.html#svn.advanced.externaldifftools.diff.ex-1" target="_blank">diffwrap.sh</a>)</p>
<pre>#!/bin/sh

# Vous pouvez ici configurer votre editeur favori
DIFF="/usr/bin/vimdiff"

# Subversion nous fourni les fichiers à comparer en 6e et 7e arguments
LEFT=${6}
RIGHT=${7}

#On envoie la commande
$DIFF $LEFT $RIGHT

# La commande doit renvoyer 0 si les fichiers sont identiques et 1 s'il sont différents</pre>
<p>Ensuite ouvrez à nouveau le fichier .subversion/config et éditez le section helpers comme suit :</p>
<pre><code>[helpers]
diff-cmd = /home/jk/bin/diffwrap.sh</code></pre>
<p>Il vous suffit dorénavant d&rsquo;un petit <em>svn diff</em> pour profiter de vimdiff <img src="http://jonathankowalski.fr/blog/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<h3>Faire un rollback</h3>
<p>De manière assez étonnante, le client à donc changé d&rsquo;avis et il vous faut revenir en arrière. Admettons que nous en somme à la revision 7 et que vous souhaitez éffacer les modifications faites depuis la revision 4 du fichier colours.css vous lancerez la commande suivante :</p>
<pre>svn merge -r HEAD:4 http://serveur.org/repo/css/colours.css .</pre>
<p>Cela permet de mettre le fichier dans votre copie de travail sans toutes les modifications effectuées entre les révisions 7 et 4. Il ne vous reste plus qu&rsquo;à vérifier et commiter.</p>
<h3>Bouger un dêpot</h3>
<p>Il peut arriver pour une raison ou une autre d&rsquo;avoir à bouger un dêpot (suite à un changement de serveur par exemple) pour se faire on va procéder en 2 étapes. D&rsquo;abord faire un dump du dêpot actuel<sup><a href="http://jonathankowalski.fr/blog/2013/01/qui-utilise-encore-subversion/#footnote_3_618" id="identifier_3_618" class="footnote-link footnote-identifier-link" title="oui comme pour une base de donn&eacute;es">4</a></sup> puis le charger sur le nouveau serveur.</p>
<div>
<pre><code>svnadmin dump </code><code>/chemin/actuel/du/depo</code><code>t &gt; depot.dump //voici pour le dump
svnadmin load /chemin/du/nouveau/depot &lt; depot.dump</code></pre>
</div>
<p>Et nous voila rendu <img src="http://jonathankowalski.fr/blog/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<h3>Savoir quels fichiers vont être mis à jour</h3>
<p>Il peut aussi être très utile de savoir avant un update quels sont les fichiers qui vont être effectivement mis à jour. Cela se fait très simplement via la commande :</p>
<pre>svn st -u</pre>
<h2>Conclusion</h2>
<p>Nous avons donc vu ici quelques bonnes pratiques et quelques petites astuces qui vous permettront de mieux utiliser ce très bon outil qu&rsquo;est subversion. C&rsquo;est toujours bon à prendre <img src="http://jonathankowalski.fr/blog/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<ol class="footnotes"><li id="footnote_0_618" class="footnote">il suffit de taper svn vs git dans votre moteur de recherche favori</li><li id="footnote_1_618" class="footnote">c&rsquo;est rare je sais</li><li id="footnote_2_618" class="footnote">alors ça ça n&rsquo;arrive carrément jamais &#8230; -_-</li><li id="footnote_3_618" class="footnote">oui comme pour une base de données</li></ol>]]></content:encoded>
			<wfw:commentRss>http://jonathankowalski.fr/blog/2013/01/qui-utilise-encore-subversion/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Qu&#8217;est-ce qu&#8217;une interface ?</title>
		<link>http://jonathankowalski.fr/blog/2013/01/quest-ce-quune-interface/</link>
		<comments>http://jonathankowalski.fr/blog/2013/01/quest-ce-quune-interface/#comments</comments>
		<pubDate>Sat, 12 Jan 2013 09:02:57 +0000</pubDate>
		<dc:creator><![CDATA[Jonathan Kowalski]]></dc:creator>
				<category><![CDATA[developpement]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://jonathankowalski.fr/blog/?p=579</guid>
		<description><![CDATA[C&#8217;est quoi une interface ? C&#8217;est dans ces termes (ou approchant) que l&#8217;on m&#8217;a interpellé récemment. Après avoir1 répondu, quelque chose m&#8217;a frappé. Non ce n&#8217;était pas l&#8217;interrogateur insatisfait2, mais bien l&#8217;idée que, peut être, d&#8217;autres personnes avaient besoin d&#8217;un &#8230; <a href="http://jonathankowalski.fr/blog/2013/01/quest-ce-quune-interface/">Lire la Suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>C&rsquo;est quoi une interface ? C&rsquo;est dans ces termes (ou approchant) que l&rsquo;on m&rsquo;a interpellé récemment.</p>
<p>Après avoir<sup><a href="http://jonathankowalski.fr/blog/2013/01/quest-ce-quune-interface/#footnote_0_579" id="identifier_0_579" class="footnote-link footnote-identifier-link" title="brillamment ^^">1</a></sup> répondu, quelque chose m&rsquo;a frappé. Non ce n&rsquo;était pas l&rsquo;interrogateur insatisfait<sup><a href="http://jonathankowalski.fr/blog/2013/01/quest-ce-quune-interface/#footnote_1_579" id="identifier_1_579" class="footnote-link footnote-identifier-link" title="puisque je vous dis que j&rsquo;ai &eacute;t&eacute; brillant :O">2</a></sup>, mais bien l&rsquo;idée que, peut être, d&rsquo;autres personnes avaient besoin d&rsquo;un petit rappel à propos de nos amies les interfaces.</p>
<p><span id="more-579"></span></p>
<h2>Définition</h2>
<p>Si l&rsquo;on prend notre <del datetime="2013-01-12T10:08:04+00:00">gros robert</del> le <strong>Larousse</strong>, il nous apprend ceci :</p>
<blockquote><p>Plan ou surface de discontinuité formant une frontière commune à deux domaines aux propriétés différentes et unis par des rapports d&rsquo;échanges et d&rsquo;interaction réciproques.</p></blockquote>
<p>Les concepts à retenir de cette définition somme toute générale sont <em>frontière commune </em>et <em>rapports d&rsquo;échanges</em>.</p>
<p>Si l&rsquo;on se rapproche un peu de l&rsquo;informatique et toujours dans le <strong>Larousse</strong></p>
<blockquote><p>Jonction entre deux matériels ou logiciels leur permettant d&rsquo;échanger des informations par l&rsquo;adoption de règles communes ; module matériel ou logiciel permettant la communication d&rsquo;un système avec l&rsquo;extérieur</p></blockquote>
<h2>En code</h2>
<p><em>Du code, du code, du code !</em></p>
<p>En réalité pas tout de suite <img src="http://jonathankowalski.fr/blog/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /> Ce qu&rsquo;il faut avant tout comprendre avec les interfaces, c&rsquo;est qu&rsquo;il s&rsquo;agit d&rsquo;un contrat (quasiment moral ^^) apporté par votre code. Vous pouvez être certain qu&rsquo;une classe qui implémente votre interface disposera des méthodes que cette dernière aura défini.</p>
<h3>Exemple en PHP</h3>
<p>Une interface se déclare comme une classe à l&rsquo;exception du fait que l&rsquo;on utilise le mot-clé <strong>interface</strong> plutot que <strong>class</strong>.<br />
Ensuite on déclare tout ce que l&rsquo;on souhaite pour définir notre interface, cela peut-être évidemment les <em>méthodes</em> mais on peut tout aussi bien déclarer des <em>constantes</em> de la même manière que si on les avait déclarées dans une classe.<br />
<script src="https://gist.github.com/377c7431af9089f5f6c7.js"></script><noscript><pre><code class="language-php php">&lt;?php

interface MonInterface {
    public function maMethodeInterface($arg);
}

class MaClasse implements MonInterface {
    public function maMethodeClasse(){
        echo 'ma Classe';
    }
  
    public function maMethodeInterface($arg){
        //implementation
    }
}</code></pre></noscript></p>
<p><em>Et que se passe-t-il si la classe n’implémente pas la méthode de l&rsquo;interface ?</em> &gt;&gt; Erreur fatale.</p>
<h2>Oui mais</h2>
<p><em>Qu&rsquo;est-ce qui m’empêche de créer ma classe avec la méthode qui m’intéresse directement sans passer par une interface ?</em></p>
<p>A vrai dire rien. Cependant l&rsquo;interface plus qu&rsquo;une perte de temps au moment de l&rsquo;écriture, garantit la cohérence et l’interopérabilité de votre code.</p>
<h4>Petite illustration</h4>
<p>Prenons le cas d&rsquo;un projet auquel j&rsquo;ai participé très récemment.<br />
Celui-ci avait vu plusieurs développeurs se succéder et les interfaces y avaient été peu mises à contribution.</p>
<p>Le principe est de suivre une course de bateaux, on avait sur une première carte des bateaux et sur une autre des balises GPS. Le problème portait justement sur ces positions GPS qui étaient récupérées différemment selon que l&rsquo;on traitait une balise ou un bateau.<br />
<script src="https://gist.github.com/8ffbaf944d1eb6a41158.js"></script><noscript><pre><code class="language-php php">&lt;?php

class Balise {
	
	/**
	 * @return array($lat, $lng)
	 */
	public function getLatLng(){
		//@implementation
	}
}

class Bateau {
	
	/**
	 * @return float latitude
	 */
	public function getLatitude(){
		//@implementation
	}
	
	/**
	 * @return float longitude
	 */
	public function getLongitude(){
		//@implementation
	}
}</code></pre></noscript><br />
Tant que bateaux et balises étaient utilisés séparément, pas de soucis mais pour les placer de manière commune sur une seule carte on se retrouve obligé de refactorer (avec le risque de générer des bugs) ou d&rsquo;utiliser un adaptateur qui ajoute de la complexité au code, une simple interface aurait rendu ce code plus modulable et évolutif.<br />
<script src="https://gist.github.com/c245b7679a2ac212f346.js"></script><noscript><pre><code class="language-php php">&lt;?php

interface GeoLocalized {
	/**
	 * @return array($lat, $lng)
	 */
	public function getLatLng();
}</code></pre></noscript></p>
<h2>Autres avantages</h2>
<p>Les interfaces permettent aussi de régler le problème d’héritage multiple. En effet en PHP comme en Java, il n&rsquo;est pas possible pour une classe d’hériter de plusieurs autres classes tandis qu&rsquo;une classe peut implémenter un nombre quelconque d&rsquo;interfaces.<br />
D&rsquo;autre part, un code basé sur des interfaces sera plus facilement testable puisque l&rsquo;on pourra aisément substituer les objets attendus par des <em>Mocks</em>.</p>
<h2>Pour conclure</h2>
<p>En développement comme dans bien d&rsquo;autres domaines, abstraire et prendre du recul est une chose primordiale pour faire mieux et limiter les risque d&rsquo;erreurs. Utiliser des interfaces vous aidera à prendre ce recul et à mieux <em>penser</em> votre code.<br />
Utiliser des interfaces vous permettra aussi de rendre votre code &laquo;&nbsp;futur-proof&nbsp;&raquo; en assurant une modularité certaine et en respectant le principe ouvert/fermé de SOLID dont on a déjà parlé.</p>
<ol class="footnotes"><li id="footnote_0_579" class="footnote">brillamment ^^</li><li id="footnote_1_579" class="footnote">puisque je vous dis que j&rsquo;ai été brillant :O</li></ol>]]></content:encoded>
			<wfw:commentRss>http://jonathankowalski.fr/blog/2013/01/quest-ce-quune-interface/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pear sous Windows avec WampServer</title>
		<link>http://jonathankowalski.fr/blog/2012/08/pear-sous-windows-avec-wampserver/</link>
		<comments>http://jonathankowalski.fr/blog/2012/08/pear-sous-windows-avec-wampserver/#comments</comments>
		<pubDate>Tue, 14 Aug 2012 20:21:49 +0000</pubDate>
		<dc:creator><![CDATA[Jonathan Kowalski]]></dc:creator>
				<category><![CDATA[developpement]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://jonathankowalski.fr/blog/?p=586</guid>
		<description><![CDATA[Rhaaaaa. Je viens de passer une bonne vingtaine de minutes à essayer d&#8217;installer PEAR. Histoire que ce soit un peu plus rapide pour vous voici la démarche Step Up 1 Avec WampServer 2, les sympathiques gens d&#8217;Alter Way nous ont &#8230; <a href="http://jonathankowalski.fr/blog/2012/08/pear-sous-windows-avec-wampserver/">Lire la Suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Rhaaaaa.</p>
<p>Je viens de passer une bonne vingtaine de minutes à essayer d&rsquo;installer PEAR. Histoire que ce soit un peu plus rapide pour vous voici la démarche <img src="http://jonathankowalski.fr/blog/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p><span id="more-586"></span></p>
<h2>Step Up 1</h2>
<p>Avec WampServer 2, les sympathiques gens d&rsquo;Alter Way nous ont sucré le go-pear qui permettait l&rsquo;installation de PEAR. Il y a sans doute une bonne raison à cela mais pour nous ça signifie la nécessité de le télécharger à la mano.</p>
<p>On se rend donc à l&rsquo;adresse  <a href="http://pear.php.net/go-pear" target="_blank">http://pear.php.net/go-pear</a> et on dépose le fichier go-pear.php obtenu dans votre dossier Wamp<sup><a href="http://jonathankowalski.fr/blog/2012/08/pear-sous-windows-avec-wampserver/#footnote_0_586" id="identifier_0_586" class="footnote-link footnote-identifier-link" title="d:\wamp chez moi">1</a></sup></p>
<h2>Step up 2</h2>
<p>Ouvrez maintenant un terminal et lancez la commande</p>
<pre>php go-pear.php</pre>
<p>Vérifiez que tout soit correct et appuyez sur Entrer.</p>
<h2>Step up 3</h2>
<p>Chez moi je tombais sur une erreur pas cool :</p>
<pre>SECURITY ERROR : Will not write to C:\\Users\\Loulou\\patati\\patata\\pear\\cache\\blablabla
Possible symlink attack
install failed</pre>
<p>En fait j&rsquo;avais<sup><a href="http://jonathankowalski.fr/blog/2012/08/pear-sous-windows-avec-wampserver/#footnote_1_586" id="identifier_1_586" class="footnote-link footnote-identifier-link" title="&eacute;videmment">2</a></sup> une précédente version mal néttoyée. Faites votre Léon et dégagez tous les fichiers C:\\Users\\Loulou\\patati\\patata\\pear\\cache\\*</p>
<h2>Step up 4</h2>
<p>Il n&rsquo;y en a pas vraiment, lancez un petit</p>
<pre>pear install PHP_VotreModule</pre>
<p>histoire d&rsquo;être bien sur que tout fonctionne et on devrait être ok.</p>
<p>C&rsquo;était pourtant pas si compliqué !!!</p>
<ol class="footnotes"><li id="footnote_0_586" class="footnote">d:\wamp chez moi</li><li id="footnote_1_586" class="footnote">évidemment</li></ol>]]></content:encoded>
			<wfw:commentRss>http://jonathankowalski.fr/blog/2012/08/pear-sous-windows-avec-wampserver/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Autoload &#8211; Le chargement automatique de classes en PHP</title>
		<link>http://jonathankowalski.fr/blog/2012/08/autoload-le-chargement-automatique-de-classes-en-php/</link>
		<comments>http://jonathankowalski.fr/blog/2012/08/autoload-le-chargement-automatique-de-classes-en-php/#comments</comments>
		<pubDate>Mon, 06 Aug 2012 18:21:17 +0000</pubDate>
		<dc:creator><![CDATA[Jonathan Kowalski]]></dc:creator>
				<category><![CDATA[developpement]]></category>
		<category><![CDATA[autoload]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://jonathankowalski.fr/blog/?p=558</guid>
		<description><![CDATA[Si vous avez déjà développé des projets en objet d&#8217;une taille raisonnable, vous connaissez l&#8217;importance d&#8217;un autoload. En effet sans, on se retrouve irrémédiablement avec des fichiers dont les X premières lignes sont remplies de &#171;&#160;require_once &#8216;../lib/MaClasse.php'&#160;&#187; qui ne s&#8217;avère &#8230; <a href="http://jonathankowalski.fr/blog/2012/08/autoload-le-chargement-automatique-de-classes-en-php/">Lire la Suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Si vous avez déjà développé des projets en objet d&rsquo;une taille raisonnable, vous connaissez l&rsquo;importance d&rsquo;un autoload.</p>
<p>En effet sans, on se retrouve irrémédiablement avec des fichiers dont les X premières lignes sont remplies de &laquo;&nbsp;require_once &lsquo;../lib/MaClasse.php'&nbsp;&raquo; qui ne s&rsquo;avère pas toujours facilement maintenable et surtout, surtout très embêtantes à écrire<sup><a href="http://jonathankowalski.fr/blog/2012/08/autoload-le-chargement-automatique-de-classes-en-php/#footnote_0_558" id="identifier_0_558" class="footnote-link footnote-identifier-link" title="et &ccedil;a on n&rsquo;aime pas :p">1</a></sup></p>
<p>Heureusement PHP langage très souple s&rsquo;il en est<sup><a href="http://jonathankowalski.fr/blog/2012/08/autoload-le-chargement-automatique-de-classes-en-php/#footnote_1_558" id="identifier_1_558" class="footnote-link footnote-identifier-link" title=":p comme le d&eacute;crit le d&eacute;nomm&eacute; Amaury ici">2</a></sup> propose une manière simple et relativement efficace de nous affranchir de toutes ces lignes si fatigantes à rédiger.</p>
<p>On utilisera donc une classe Autoloader que vous pouvez cloner via le repo git disponible à l&rsquo;adresse https://github.com/jonathankowalski/autoload.git</p>
<p><span id="more-558"></span></p>
<p>L&rsquo;autoload est souvent source de discordes, déjà il faut bien comprendre que quelque soit la méthode, un autoloading sera toujours couteux ou plutôt plus couteux<sup><a href="http://jonathankowalski.fr/blog/2012/08/autoload-le-chargement-automatique-de-classes-en-php/#footnote_2_558" id="identifier_2_558" class="footnote-link footnote-identifier-link" title="relativit&eacute; toussa toussa">3</a></sup> que pas d&rsquo;autoloading.</p>
<p>A partir de là, s&rsquo;oppose en général deux théories chez les Adam Smith et autres Karl Marx de l&rsquo;autoloading. D&rsquo;une part le chargement dit statique et d&rsquo;autre part un chargement plus dynamique.</p>
<h2>Chargement Statique</h2>
<p>Il se base sur des conventions fortes. Typiquement c&rsquo;est que propose le Zend Loader. On admettra que le nom d&rsquo;une classe indique son emplacement sur le disque.</p>
<p>Par exemple la classe &lsquo;Controllers_Index&rsquo; sera dans située dans le fichier Index.php du dossier Controllers.</p>
<p>C&rsquo;est la méthode que je privilégie car elle me parait plus &laquo;&nbsp;sure&nbsp;&raquo;. J&rsquo;entends par là qu&rsquo;elle force le bon sens histoire d&rsquo;avoir une arborescence qui soit un minimum compréhensible. Bien sûr rien ne vous empêchera d’appeler un dossier Service et d&rsquo;y fourrer des controllers mais dans ce cas je crains que personne ne puisse rien pour vous<sup><a href="http://jonathankowalski.fr/blog/2012/08/autoload-le-chargement-automatique-de-classes-en-php/#footnote_3_558" id="identifier_3_558" class="footnote-link footnote-identifier-link" title="et puis dans le fond l&rsquo;autoload marchera quand m&ecirc;me ^^">4</a></sup></p>
<p>Si cela fonctionne avec le nom de la classe, cela marche aussi avec les namespaces simplement à la place d&rsquo;une classe appelée Controllers_Index on aura une class Index dans le namespace Controllers (soit Controllers\\Index) mais le principe reste le même au niveau de l’arborescence.</p>
<h3>Limites</h3>
<p>Oui ce modèle a certaines limites. D&rsquo;abord cela nous force à l&rsquo;équation 1 fichier = 1 classe. Ce n&rsquo;est pas fondamentalement mauvais mais en fonction du nombre de classes et donc de fichiers ça peut devenir difficilement lisible et on peut imaginer un impact certain sur les performances (à <em>benchmarker</em> tout de même).</p>
<p>Ensuite et surtout du fait de la convention et de l&rsquo;équation sus-citée, il faut avoir penser à ce système dès le départ du projet. Dans le cas contraire il vous faudra un gros refacto pour remettre tous les fichiers aux normes et étant prouvé que les développeurs sont de gros fainéants autant dire que ce ne sera jamais fait ^^</p>
<h2>Chargement dynamique</h2>
<p>Pour répondre aux limites du chargement statique, on peut procéder par chargement dynamique. La méthode est simple, on va ici parser nos fichiers en quête de classes afin de déterminer le chemin des fichiers les hébergeant.</p>
<p>Vous comprendrez bien que pour le coup à moins d&rsquo;avoir un seul fichier contenant toutes vos classes (et encore) cette méthode s&rsquo;avère extrêmement coûteuse et il est impensable de l&rsquo;utiliser sans mise en cache. En revanche ici pas ou peu de problème de convention et vous pourrez mettre autant de classes que nécessaire dans vos fichiers.</p>
<h2>Du code !</h2>
<p>On parle, on parle mais pas une seule ligne de code, ça commence à angoisser. Voici donc la classe qui me sert d&rsquo;autoloader quand nécessaire <a title="Autoload Php" href="https://github.com/jonathankowalski/autoload/blob/master/autoloader.php" target="_blank">voir sur GitHub</a>.</p>
<p>Elle se charge toute seule de s’enregistrer via spl_autoload et vous n&rsquo;aurez pas à choisir entre chargement statique et dynamique<sup><a href="http://jonathankowalski.fr/blog/2012/08/autoload-le-chargement-automatique-de-classes-en-php/#footnote_4_558" id="identifier_4_558" class="footnote-link footnote-identifier-link" title="oui vous pouvez faire les deux :p">5</a></sup></p>
<script src="https://gist.github.com/c915a0f1c221310d219f.js"></script><noscript><pre><code class="language-php php">&lt;?php

include 'autoloader.php';

JK\Autoloader::getInstance(); //Si vous utilisez une arborescence standard, nul besoin de +

/**
 * Si vous avez utilis&eacute; d'autres conventions (voire pas de convention) vous pouvez ajoutez les dossiers contenant vos classes
 **/
JK\Autoloader::getInstance()
  -&gt;addDirectory('classes') //Ajoute toutes les classes contenues dans les fichiers du dossier classes (non-recursif)
  -&gt;addEntireDirectory('vendor'); //Pareil mais recursif</code></pre></noscript>
<p>Le principe est de d&rsquo;abord voir si vous utiliser le chargement statique.</p>
<script src="https://gist.github.com/3277114.js"></script><noscript><pre><code class="language-php php">&lt;?php
try{
	$path = $this-&gt;standardInclude( $classname );
	$this-&gt;cacheManager-&gt;addPath( $classname, $path );
} catch ( NotStandardInclude $e ){				
	if( $this-&gt;autoloadInDir( $classname ) ){
		return $this-&gt;autoload( $classname );
	}
}</code></pre></noscript>
<p>Dans le cas contraire on parcourt tous les dossiers que vous aurez pris soin d&rsquo;indiquer à la recherche de vos classes (grâce aux méthodes <em>addDirectory</em> ou <em>addEntireDirectory</em> qui est recursif).</p>
<script src="https://gist.github.com/da475ace98e9cc66b79d.js"></script><noscript><pre><code class="language-php php">&lt;?php
public function addDirectory( $dir ){	
  if( !in_array($dir, $this-&gt;listSearchDirectory) ){	
    $dir = rtrim( $dir, DIRECTORY_SEPARATOR );
    $this-&gt;listSearchDirectory [] = $dir;
  }	
  return $this;
}

public function addEntireDirectory( $dir ){
  $this-&gt;addDirectory( $dir );
  $fd = opendir( $dir );
  while( $file = readdir( $fd ) ){
    if( $file != self::CURRENT_DIR &amp;&amp; $file != self::PREVIOUS_DIR &amp;&amp; is_dir( $dir . DIRECTORY_SEPARATOR . $file ) ){
      $this-&gt;addEntireDirectory( $dir . DIRECTORY_SEPARATOR . $file );
    }
  }
  closedir( $fd );
  return $this;
}</code></pre></noscript>
<p>La mise en cache se fait ici via un fichier JSON, c&rsquo;est pas trop mal mais pas forcément le plus optimal, on peut tout à fait imaginer un gestionnaire qui utilise <strong><em>memcache</em></strong> qui sera encore plus rapide ou <strong><em>MySQL</em> </strong>juste pour rigoler. Quoiqu&rsquo;il en soit il vous suffira d’implémenter l&rsquo;interface <em>AutoloadCacheManager </em>et d&rsquo;injecter votre gestionnaire de cache dans l&rsquo;Autoloader via la méthode <em>setCacheManager.</em></p>
<h2>Fin</h2>
<p>Voilà n’hésitez pas à m&rsquo;indiquer les problèmes que vous pouvez rencontrer si vous aussi utilisez cette classe. Have fun !</p>
<ol class="footnotes"><li id="footnote_0_558" class="footnote">et ça on n&rsquo;aime pas :p</li><li id="footnote_1_558" class="footnote">:p comme le décrit le dénommé Amaury <a href="http://www.geek-directeur-technique.com/2012/08/01/php-le-langage-pour-les-geeks-et-les-directeurs-techniques/" target="_blank">ici</a></li><li id="footnote_2_558" class="footnote">relativité toussa toussa</li><li id="footnote_3_558" class="footnote">et puis dans le fond l&rsquo;autoload marchera quand même ^^</li><li id="footnote_4_558" class="footnote">oui vous pouvez faire les deux :p</li></ol>]]></content:encoded>
			<wfw:commentRss>http://jonathankowalski.fr/blog/2012/08/autoload-le-chargement-automatique-de-classes-en-php/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>JavaScript, sa propriété prototype et l&#8217;héritage simplement</title>
		<link>http://jonathankowalski.fr/blog/2012/06/javascript-sa-propriete-prototype-et-lheritage-simplement/</link>
		<comments>http://jonathankowalski.fr/blog/2012/06/javascript-sa-propriete-prototype-et-lheritage-simplement/#comments</comments>
		<pubDate>Wed, 20 Jun 2012 18:33:19 +0000</pubDate>
		<dc:creator><![CDATA[Jonathan Kowalski]]></dc:creator>
				<category><![CDATA[developpement]]></category>
		<category><![CDATA[heritage]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://jonathankowalski.fr/blog/?p=537</guid>
		<description><![CDATA[Depuis quelques semaines dans la société qui m&#8217;emploie sont organisés des TED. Mais qu&#8217;est-ce qu&#8217;un TED me direz-vous ? Il s&#8217;agit d&#8217;une petite conférence/présentation très courte (environ 15min) concernant à peu près tout et n&#8217;importe quoi du moment que vous &#8230; <a href="http://jonathankowalski.fr/blog/2012/06/javascript-sa-propriete-prototype-et-lheritage-simplement/">Lire la Suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Depuis quelques semaines dans la société qui m&rsquo;emploie sont organisés des <strong>TED</strong>.</p>
<p>Mais qu&rsquo;est-ce qu&rsquo;un <strong>TED</strong> me direz-vous ? Il s&rsquo;agit d&rsquo;une petite conférence/présentation très courte (environ 15min) concernant à peu près tout et n&rsquo;importe quoi du moment que vous avez envie d&rsquo;en parler.</p>
<p>Ça peut être très intéressant et je vous encourage à vous rendre sur le <a href="http://www.ted.com/" target="_blank">site officiel</a> du <strong>TED</strong> pour approfondir un peu plus le sujet.</p>
<p>Aujourd&rsquo;hui c&rsquo;est mon tour de présenter un petit sujet et j&rsquo;ai choisi, une fois n&rsquo;est pas coutume, <strong>Javascript</strong> et son drôle de modèle objet par <strong>prototype</strong>.</p>
<p><span id="more-537"></span></p>
<h2>Javascript le mal aimé</h2>
<p>Si j&rsquo;ai choisi de parler de <strong>javascript</strong> et de<strong> prototype</strong> c&rsquo;est que ce langage est encore trop souvent le vilain petit canard de l&rsquo;arsenal du développeur web.</p>
<p>Mal connu, souvent codé par dessus la jambe quand on y pense, le <strong>javascript</strong> bien que rempli de défaut a aussi de nombreux avantages (le fait d&rsquo;être accepté par de nombreux clients, l&rsquo;interactivité qu&rsquo;il permet&#8230;).</p>
<p>Il est aussi et surtout au centre du web actuel. Comment imaginer un site un tant soit peu important ou une application web sans ajax ? sans forme d&rsquo;interactivité ?</p>
<p><strong>Javascript</strong> est aussi au centre de technologies d&rsquo;avenir comme <strong>nodejs</strong>.</p>
<h2>Javascript est objectivement unique</h2>
<p><strong>Javascript</strong> est un langage tout <strong>objet</strong>, comme peut l&rsquo;être le Python. En revanche son modèle objet est assez déroutant pour un développeur Java ou PHP.</p>
<p>En effet ici pas de classes ! En <strong>javascript</strong> tout est porté par l&rsquo;objet tant son <em>état</em> que son <em>comportement</em>.</p>
<p>On retrouvera tout de même une ou deux similitudes avec ce que l&rsquo;on connait dans d&rsquo;autres langages notamment via l&rsquo;utilisation d&rsquo;un constructeur d&rsquo;objet et du mot clé <em>new</em></p>
<script src="https://gist.github.com/508899f026120fec0e8a.js"></script><noscript><pre><code class="language-javascript javascript">function Guitariste(guitare){
    this.guitare = guitare;
    this.play= function(){
        console.log('Jeux Interdits');
    }
}

var jimmy = new Guitariste('fender');
var django = new Guitariste('selmer');</code></pre></noscript>
<h2>Pourquoi Prototype ?</h2>
<p>C&rsquo;est vrai, après tout pourquoi nous embêter avec cette propriété prototype tandis que l&rsquo;on peut utiliser facilement notre constructeur d&rsquo;objet ?</p>
<p>La réponse tient en un mot : <strong>performances</strong>.</p>
<p>En effet comme dit plus avant, l&rsquo;état et le comportement est porté par l&rsquo;objet, pour chacun de vos guitaristes, toutes vos méthodes seront dupliquées.<br />
De quoi bien alourdir vos applications <img src="http://jonathankowalski.fr/blog/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p>Avec la propriété prototype au contraire les méthodes seront partagées par chacun de vos objets.</p>
<h2>Comment qu&rsquo;on fait pour ?</h2>
<p>Maintenant que nous sommes convaincu mettons en place.</p>
<script src="https://gist.github.com/a7e39a96183e081e4bfd.js"></script><noscript><pre><code class="language-javascript javascript">function Guitariste (guitare){
    this.guitare = guitare;
}

Guitariste.prototype = {
    play: function(){
        console.log(&quot;Jeux Interdits&quot;);
    }
}

var jimmy = new Guitariste('fender');
var django = new Guitariste('selmer');</code></pre></noscript>
<p>Rien de complexe, on garde notre constructeur d&rsquo;objet et on déplace tout ce qui est méthode dans sa propriété <strong>prototype</strong>.</p>
<h2>Héritage</h2>
<p>Puisque toutes nos méthodes sont dans le <strong>prototype</strong> de mon objet, afin d&rsquo;<em>hériter</em> je vais simplement affecter au prototype de mon objet fils un objet généré depuis le prototype de mon objet père.</p>
<p>Il me suffit ensuite de surcharger les méthodes que je souhaite spécialiser.</p>
<script src="https://gist.github.com/52bf56f5d336e0f8b6f6.js"></script><noscript><pre><code class="language-javascript javascript">function Guitariste(guitare, volumeAmpli){
   this.guitare = guitare;
   this.volumeAmpli = volumeAmpli;
   console.log(&quot;Je suis un guitariste&quot;);
}

Guitariste.prototype = {
    play: function(){
        console.log('Gare au gorille');
    },
    tune: function(){
        console.log(&quot;J'accorde ma &quot;+this.guitare);
    }
}

function Rockeur(guitare){
    this.guitare = guitare;    
    this.volumeAmpli = 100;
    console.log(&quot;Je suis un rockeur&quot;);
}

Rockeur.prototype = Object.create(Guitariste.prototype);
Rockeur.prototype.play = function(){
        console.log('Voodoo child');
    }


var georges = new Guitariste('favino', 5); //je suis un guitariste
georges.tune(); //j'accorde ma favino
georges.play(); //Gare au gorille
console.log(georges instanceof Guitariste); //true
console.log(georges instanceof Rockeur); //false

var jimmy= new Rockeur('fender'); //je suis un rockeur
jimmy.tune(); //j'accorde ma fender
jimmy.play(); //Voodoo Child
console.log(jimmy instanceof Guitariste); //true
console.log(jimmy instanceof Rockeur); //true</code></pre></noscript>
<p>Je parle d&rsquo;héritage mais c&rsquo;est ici un peu abus de langage, il s&rsquo;agit simplement de copier le prototype qui nous intéresse puis d&rsquo;écraser les méthodes que l&rsquo;on souhaite modifier. Cependant le résultat est bien celui que l&rsquo;on attend avec notamment dans notre exemple Jimmy qui est bien tant une instance de Guitariste que de Rockeur !</p>
<h2>Quelques précisions</h2>
<p>Pour conclure, j&rsquo;aimerais simplement préciser deux points. D&rsquo;abord la chaine de <strong>prototype</strong>. Il est important de comprendre que javascript, et cela de manière générale, effectue ses recherches en partant du contexte le plus précis possible pour finir au plus général possible. Ainsi dans notre exemple, il va d&rsquo;abord rechercher la méthode tune dans l&rsquo;objet lui-même et ne la trouvant pas va regarder dans le prototype de l&rsquo;objet.</p>
<p>D&rsquo;autre part, j&rsquo;aimerais revenir sur la méthode create d&rsquo;Object que j&rsquo;utilise pour initialiser le prototype de mon Rockeur. Cette méthode fait partie de javascript 1.9.3 elle n&rsquo;est donc malheureusement pas implémentée par tous les navigateurs (notamment ie8)<br />
Pas de panique <a href="http://www.crockford.com/" target="_blank">Douglas Crockford</a> en livre une version tout a fait utilisable</p>
<script src="https://gist.github.com/2959447.js"></script><noscript><pre><code class="language-javascript javascript">if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
}</code></pre></noscript>
<h2>Ended</h2>
<p>Voilà pour le sujet de mon petit TED, en plus de ceci, vous pourrez trouver mes &laquo;&nbsp;slides&nbsp;&raquo; <a href="http://prezi.com/zs51tjvkvf1d/javascript-prototype-pas-le-framework/" target="_blank">ici</a></p>
<p>Concernant le déroulé du TED en lui-même, le partage s&rsquo;avère toujours aussi agréable, je regrette simplement de n&rsquo;avoir le temps de proposer plus de sujets à discuter, mais la vie est histoire de choix&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://jonathankowalski.fr/blog/2012/06/javascript-sa-propriete-prototype-et-lheritage-simplement/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Se passer de l&#8217;instruction Switch en PHP</title>
		<link>http://jonathankowalski.fr/blog/2012/05/se-passer-de-linstruction-switch-en-php/</link>
		<comments>http://jonathankowalski.fr/blog/2012/05/se-passer-de-linstruction-switch-en-php/#comments</comments>
		<pubDate>Sat, 12 May 2012 07:19:56 +0000</pubDate>
		<dc:creator><![CDATA[Jonathan Kowalski]]></dc:creator>
				<category><![CDATA[developpement]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[reflection]]></category>
		<category><![CDATA[switch]]></category>

		<guid isPermaLink="false">http://jonathankowalski.fr/blog/?p=523</guid>
		<description><![CDATA[Le switch est une ignominie. Je ne nie pas qu&#8217;il puisse être utile mais il cumule tant de défaut qu&#8217;il vaut mieux presque toujours l’éviter. D&#8217;abord le switch est laid. Bien sur le développement n&#8217;est pas un concours de beauté &#8230; <a href="http://jonathankowalski.fr/blog/2012/05/se-passer-de-linstruction-switch-en-php/">Lire la Suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Le <em>switch</em> est une ignominie. Je ne nie pas qu&rsquo;il puisse être utile mais il cumule tant de défaut qu&rsquo;il vaut mieux presque toujours l’éviter.<br />
D&rsquo;abord le <em>switch</em> est laid. Bien sur le développement n&rsquo;est pas un concours de beauté mais je trouve qu&rsquo;il peut s&rsquo;avérer difficilement lisible et cela a clairement sa part d&rsquo;importance. D&rsquo;autre part et c&rsquo;est autrement plus grave, le <em>switch</em> va totalement à l&rsquo;encontre d&rsquo;un principe fondateur et fondamental de la <strong>conception objet</strong><sup><a href="http://jonathankowalski.fr/blog/2012/05/se-passer-de-linstruction-switch-en-php/#footnote_0_523" id="identifier_0_523" class="footnote-link footnote-identifier-link" title="POO">1</a></sup> à savoir le <strong>principe ouvert/fermé</strong>.</p>
<p>Fort heureusement <strong>PHP</strong> nous donne toutes les armes pour nous passer du vilain.</p>
<p><span id="more-523"></span></p>
<h2>Le principe ouvert/fermé</h2>
<p>Qu&rsquo;est-ce que cela signifie ? Il est le O de SOLID<sup><a href="http://jonathankowalski.fr/blog/2012/05/se-passer-de-linstruction-switch-en-php/#footnote_1_523" id="identifier_1_523" class="footnote-link footnote-identifier-link" title="que nous verrons plus en detail dans un article prochain">2</a></sup>. C&rsquo;est simple comme son nom l&rsquo;indique, vos classes se doivent d&rsquo;être à la fois ouvertes et fermées.<br />
Ouvertes dans le sens ou leurs fonctionnalités doivent pouvoir être étendues via l&rsquo;adjonction de nouvelles classes héritant de celle-ci<sup><a href="http://jonathankowalski.fr/blog/2012/05/se-passer-de-linstruction-switch-en-php/#footnote_2_523" id="identifier_2_523" class="footnote-link footnote-identifier-link" title="ou pas">3</a></sup>.</p>
<p>Fermées car le code source de vos classes devrait être figé, fermé à la modification.</p>
<p>Prenons une fabrique de voiture comme celle-ci :</p>
<script src="https://gist.github.com/ec4370e6dccfb5c147d5.js"></script><noscript><pre><code class="language-php php">&lt;?php

class FabriqueVoiture {
	/**
	 * @return InterfaceVoiture
	 */
	static public function createVoiture($modeleVoiture){
		switch($modeleVoiture){
			case 'citadine':
				return new VoitureCitadine;
				break;
			case 'berline':
				return new VoitureBerline;
				break;
			case '4x4':
				return new Voiture4x4;
				break;
			default:
				throw new ModeleInconnuException($modeleVoiture);
		}
	}
}</code></pre></noscript>
<p>Bon déjà nous avons éviter le piège d&rsquo;avoir une seule classe Voiture dans laquelle on aurait un switch comme celui-ci dans chaque méthode <em>getConsommation</em>, <em>getVitesseMax</em> etc.</p>
<p>Ah, une note en passant, j&rsquo;ai mis des <em>break</em> après mes <em>return</em> non pas pour rester dans l&rsquo;univers automobile mais sinon mon IDE gère mal l&rsquo;indentation<sup><a href="http://jonathankowalski.fr/blog/2012/05/se-passer-de-linstruction-switch-en-php/#footnote_3_523" id="identifier_3_523" class="footnote-link footnote-identifier-link" title="quand je vous disais que le switch est plein de d&eacute;faut">4</a></sup>.</p>
<p>Bref revenons à nos moutons, nous avons un seul <em>switch</em> dans notre fabrique ce qui est un moindre mal, cependant vous comprendrez aisément que cette classe n&rsquo;est pas fermé. Si demain, nous décidons de créer des monospaces, il faudra venir modifier notre fabrique afin de rajouter un case.</p>
<h2>Réflexion et Reflection</h2>
<p>Connaissez-vous <strong>Reflection</strong> ? Cette <em>API</em> venue avec <strong>PHP5</strong> nous permet d&rsquo;introspecter notre code. Elle va nous permettre de modifier notre fabrique.</p>
<script src="https://gist.github.com/22fb03ccc90eb3e7d083.js"></script><noscript><pre><code class="language-php php">&lt;?php

class FabriqueVoiture {
	/**
	 * @return InterfaceVoiture
	 */
	static public function createVoiture($modeleVoiture){
		$nomClasse = self::getNomClasseVoiture($modeleVoiture);
		try{
			$reflection = new ReflectionClass($nomClasse);
			return $reflection-&gt;newInstance();
		} catch (ReflectionException $e) {
			throw new ModeleInconuException($modeleVoiture);
		}
	}

	static protected function getNomClasseVoiture($modeleVoiture){
		return 'Voiture'.ucfirst($modeleVoiture);
	}
}</code></pre></noscript>
<p>Que faisons-nous ici ? D&rsquo;abord nous récupérons le nom de notre classe depuis le modèle passé en paramètre<sup><a href="http://jonathankowalski.fr/blog/2012/05/se-passer-de-linstruction-switch-en-php/#footnote_4_523" id="identifier_4_523" class="footnote-link footnote-identifier-link" title="Nous avons donc tout de m&ecirc;me une contrainte au niveau du nom de nos classes mais c&rsquo;est pas plus mal">5</a></sup>.</p>
<p>Ensuite nous allons instancier une <strong>ReflectionClass</strong> avec ce nom. Si <strong>PHP</strong> ne trouve pas la classe demandée il va lancer une <strong>ReflectionException</strong> que nous allons attraper pour lancer notre propre exception ModeleInconnuException.</p>
<h2>Conclusion</h2>
<p>Voilà notre fabrique désormais fermée. Si vous décidez demain d&rsquo;ajouter les modèles coupeSport et cabriolet, il suffira d&rsquo;ajouter les classes idoines et vous pourrez les fabriquer sans avoir à toucher à votre fabrique.</p>
<p>On pourrait encore un peu plus utiliser <strong>PHP</strong> et ses méthodes magiques pour créer une API automatique du type createCitadine ou create4x4 mais dans un premier temps c&rsquo;est déjà pas mal, on verra ça dans un autre article.</p>
<p>Nous avons vaincu le switch !</p>
<p>See you <img src="http://jonathankowalski.fr/blog/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<ol class="footnotes"><li id="footnote_0_523" class="footnote">POO</li><li id="footnote_1_523" class="footnote">que nous verrons plus en detail dans un article prochain</li><li id="footnote_2_523" class="footnote">ou pas</li><li id="footnote_3_523" class="footnote">quand je vous disais que le switch est plein de défaut</li><li id="footnote_4_523" class="footnote">Nous avons donc tout de même une contrainte au niveau du nom de nos classes mais c&rsquo;est pas plus mal</li></ol>]]></content:encoded>
			<wfw:commentRss>http://jonathankowalski.fr/blog/2012/05/se-passer-de-linstruction-switch-en-php/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Un plugin jQuery pour manipuler le storage HTML</title>
		<link>http://jonathankowalski.fr/blog/2012/05/un-plugin-jquery-pour-manipuler-le-storage-html/</link>
		<comments>http://jonathankowalski.fr/blog/2012/05/un-plugin-jquery-pour-manipuler-le-storage-html/#comments</comments>
		<pubDate>Sun, 06 May 2012 08:03:29 +0000</pubDate>
		<dc:creator><![CDATA[Jonathan Kowalski]]></dc:creator>
				<category><![CDATA[developpement]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://jonathankowalski.fr/blog/?p=495</guid>
		<description><![CDATA[HTML 5 est une révolution1 il drague avec lui de nombreuses améliorations/fonctionnalités qui vont te permettre à toi développeur web d&#8217;avoir une vie plus simple. Nous nous intéresserons ici à l&#8217;une des plus intéressantes à mon goût l&#8217;interface Storage et &#8230; <a href="http://jonathankowalski.fr/blog/2012/05/un-plugin-jquery-pour-manipuler-le-storage-html/">Lire la Suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>HTML 5 est une révolution<sup><a href="http://jonathankowalski.fr/blog/2012/05/un-plugin-jquery-pour-manipuler-le-storage-html/#footnote_0_495" id="identifier_0_495" class="footnote-link footnote-identifier-link" title="parait-il">1</a></sup> il drague avec lui de nombreuses améliorations/fonctionnalités qui vont te permettre à toi développeur web d&rsquo;avoir une vie plus simple.</p>
<p>Nous nous intéresserons ici à l&rsquo;une des plus intéressantes à mon goût l&rsquo;interface Storage et ses implémentations localStorage et sessionStorage. Pour cela on utilisera le plugin jquery storage écrit par votre serviteur.</p>
<p><span id="more-495"></span></p>
<p>Les implémentations de Storage vont vous permettre de pouvoir enregistrer des données directement sur la machine de l&rsquo;utilisateur de manière plus sécurisée et avec un volume plus important que ces bons vieux cookies<sup><a href="http://jonathankowalski.fr/blog/2012/05/un-plugin-jquery-pour-manipuler-le-storage-html/#footnote_1_495" id="identifier_1_495" class="footnote-link footnote-identifier-link" title="quelques ko pour les cookies contre plusieurs Mo pour localStorage">2</a></sup>.</p>
<p>Afin de manipuler tout ça on utilisera un petit plugin jquery que l&rsquo;on va essayer de découvrir ici.</p>
<h2>Pourquoi un plugin ?</h2>
<p>Un plugin va nous permettre de manipuler le storage avec une API unifiée, en masquant aussi certaines opérations un peu fastidieuses telles que la sérialisation de certaines données. On va aussi bénéficier d&rsquo;un fallback vers les cookies si le navigateur de votre utilisateur s&rsquo;avère obsolète<sup><a href="http://jonathankowalski.fr/blog/2012/05/un-plugin-jquery-pour-manipuler-le-storage-html/#footnote_2_495" id="identifier_2_495" class="footnote-link footnote-identifier-link" title="suivez mon regard">3</a></sup>.</p>
<p>Et puis surtout vous pourrez venir râler sur quelqu&rsquo;un si ça ne marche pas :p</p>
<h2>Installation</h2>
<p>Afin de récupérer le plugin jquery.storage clonez le repo git disponible à l&rsquo;adresse :<em></em></p>
<p><em>https://github.com/jonathankowalski/jquery.Storage.git</em></p>
<p>Si vous n&rsquo;avez pas Git vous pouvez aussi télécharger directement le zip <a href="https://github.com/jonathankowalski/jquery.Storage/zipball/master">jquery.storage</a> et le désarchiver où il vous semblera bon.</p>
<p>Ensuite c&rsquo;est de l&rsquo;installation de plugin jquery classique :<br />
<script src="https://gist.github.com/75bc37c4df2cef9cb266.js"></script><noscript><pre><code class="language-html html">&lt;script type=&quot;text/javascript&quot; src=&quot;jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;/dir/to/plugins/jquery.storage.min.js&quot;&gt;&lt;/script&gt;</code></pre></noscript></p>
<h2>l&rsquo;API</h2>
<p>On gardera les données sous la forme de paires clé/valeur. On pourra agir sur trois contextes que vous pourrez préciser par &laquo;&nbsp;local&nbsp;&raquo;, &laquo;&nbsp;session&nbsp;&raquo; et &laquo;&nbsp;cookie&nbsp;&raquo;. Assez classiquement l&rsquo;API expose tous les aspects du CRUD :</p>
<h3>Créer des données et les mettre à jour</h3>
<p>On utilisera pour cela les fonctions set :<br />
<script src="https://gist.github.com/bcf02edb64d2c097d076.js"></script><noscript><pre><code class="language-javascript javascript">$.storage.set(key, value, context);
$.storage.setLocal(key, value);
$.storage.setSession(key, value);
$.storage.setCookie(key, value);

//examples
$.storage.setLocal(&quot;drink&quot;,&quot;coffee&quot;);
$.storage.setLocal(&quot;json&quot;,{&quot;mode&quot;:&quot;complex&quot;}); //fonctionne aussi</code></pre></noscript></p>
<p>Comme vous vous en doutez les méthodes <em>setLocal</em>, <em>setSession</em>, <em>setCookie</em> ne sont que des raccourcis vers la méthode <em>set</em>. Si ces méthodes vous permettent de créer des entrées dans les différents <em>Storage</em> elles vous permettront aussi de mettre à jour ces données.</p>
<h3>Récupérer des données</h3>
<p>On utilisera pour cela les fonctions get :<br />
<script src="https://gist.github.com/0f06ceafc25d12e5f0c5.js"></script><noscript><pre><code class="language-javascript javascript">$.storage.get(key, default, context);
$.storage.getFromLocal(key, default);
$.storage.getFromSession(key, default);
$.storage.getFromCookie(key, default);

//examples
$.storage.getFromLocal('drink'); //Renverra la donn&eacute;e identifi&eacute;e par drink ou null si elle n'existe pas
$.storage.getFromLocal('drink', 'coffee'); //Renverra la donn&eacute;e identifi&eacute;e par drink ou coffee si elle n'existe pas</code></pre></noscript></p>
<p>Plusieurs choses sont à noter ici, d&rsquo;abord si vous fournissez une valeur par défaut et que la donnée n&rsquo;existe pas, elle sera créée.</p>
<p>D&rsquo;autre part, vous pouvez utiliser <em>get</em> sans <em>context</em>, dans ce cas, <strong>jquery.storage</strong> va explorer les différents <em>Storage</em><sup><a href="http://jonathankowalski.fr/blog/2012/05/un-plugin-jquery-pour-manipuler-le-storage-html/#footnote_3_495" id="identifier_3_495" class="footnote-link footnote-identifier-link" title="dans l&rsquo;ordre Session, Local et Cookie">4</a></sup> et vous renvoyer la première valeur qu&rsquo;il trouve.</p>
<script src="https://gist.github.com/49573e07aa632bc318ac.js"></script><noscript><pre><code class="language-javascript javascript">$.storage.get(&quot;drink&quot;); //va explorer successivement sessionStorage, localStorage et cookie pour trouver la valeur demand&eacute;e, renvoie null si inexistante</code></pre></noscript>
<h3>Supprimer des données</h3>
<p>On peut d&rsquo;une part effacer une donnée :</p>
<script src="https://gist.github.com/6f215423627248ed3846.js"></script><noscript><pre><code class="language-text text">$.storage.remove(key, context);
$.storage.removeFromLocal(key);
$.storage.removeFromSession(key);
$.storage.removeFromCookie(key);</code></pre></noscript>
<p>A noter que vous pouvez aussi appeler <em>remove</em> sans <em>context</em>, dans ce cas <strong>jquery.storage</strong> supprimera la donnée dans tous les <em>Storage</em>.</p>
<script src="https://gist.github.com/01c51f8f833a2ddb1515.js"></script><noscript><pre><code class="language-javascript javascript">$.storage.remove(&quot;tobacco&quot;); //va supprimer la donn&eacute;e partout</code></pre></noscript>
<p>Vous pouvez aussi flusher toutes les données d&rsquo;un <em>context</em> en particulier ou de tous les <em>contexts</em> à la fois.</p>
<script src="https://gist.github.com/f10c4222881440498b82.js"></script><noscript><pre><code class="language-javascript javascript">$.storage.flush(context);

$.storage.flush(&quot;local&quot;); //supprime les donn&eacute;es de tout localStorage
$.storage.flush(); //supprime les donn&eacute;es de tous les Storage</code></pre></noscript>
<h2>Plus encore</h2>
<p>Si vous avez des questions n&rsquo;hésitez pas, sachez aussi que vous pouvez très facilement ajouter des <em>&laquo;&nbsp;Storages&nbsp;&raquo;</em><sup><a href="http://jonathankowalski.fr/blog/2012/05/un-plugin-jquery-pour-manipuler-le-storage-html/#footnote_4_495" id="identifier_4_495" class="footnote-link footnote-identifier-link" title="pour du cache par exemple ou que sais-je encore">5</a></sup> il suffit que votre objet respecte l&rsquo;interface <em>Storage</em> et il faut ensuite l&rsquo;ajouter au contextDefines, comme je l&rsquo;ai fait pour les cookies.</p>
<p>Have fun !</p>
<ol class="footnotes"><li id="footnote_0_495" class="footnote">parait-il</li><li id="footnote_1_495" class="footnote">quelques ko pour les cookies contre plusieurs Mo pour localStorage</li><li id="footnote_2_495" class="footnote">suivez mon regard</li><li id="footnote_3_495" class="footnote">dans l&rsquo;ordre Session, Local et Cookie</li><li id="footnote_4_495" class="footnote">pour du cache par exemple ou que sais-je encore</li></ol>]]></content:encoded>
			<wfw:commentRss>http://jonathankowalski.fr/blog/2012/05/un-plugin-jquery-pour-manipuler-le-storage-html/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>3 applications web que j&#8217;utilise chaque jour (ou presque)</title>
		<link>http://jonathankowalski.fr/blog/2012/05/3-applications-web-que-jutilise-chaque-jour-ou-presque/</link>
		<comments>http://jonathankowalski.fr/blog/2012/05/3-applications-web-que-jutilise-chaque-jour-ou-presque/#comments</comments>
		<pubDate>Tue, 01 May 2012 18:22:06 +0000</pubDate>
		<dc:creator><![CDATA[Jonathan Kowalski]]></dc:creator>
				<category><![CDATA[humeur]]></category>
		<category><![CDATA[applications]]></category>
		<category><![CDATA[efficacité]]></category>
		<category><![CDATA[productivité]]></category>
		<category><![CDATA[weblife]]></category>

		<guid isPermaLink="false">http://jonathankowalski.fr/blog/?p=462</guid>
		<description><![CDATA[Le partage est une notion primordiale à mon sens. Il est clairement le moteur principal de ce blog1, le partage d&#8217;idées, de savoir mais aussi d&#8217;outils. J&#8217;ai décidé de vous présenter aujourd&#8217;hui 3 applications qui m&#8217;aident énormément2 dans mon quotidien &#8230; <a href="http://jonathankowalski.fr/blog/2012/05/3-applications-web-que-jutilise-chaque-jour-ou-presque/">Lire la Suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Le partage est une notion primordiale à mon sens. Il est clairement le moteur principal de ce blog<sup><a href="http://jonathankowalski.fr/blog/2012/05/3-applications-web-que-jutilise-chaque-jour-ou-presque/#footnote_0_462" id="identifier_0_462" class="footnote-link footnote-identifier-link" title="avec WordPress">1</a></sup>, le partage d&rsquo;idées, de savoir mais aussi d&rsquo;outils.<br />
J&rsquo;ai décidé de vous présenter aujourd&rsquo;hui 3 applications qui m&rsquo;aident énormément<sup><a href="http://jonathankowalski.fr/blog/2012/05/3-applications-web-que-jutilise-chaque-jour-ou-presque/#footnote_1_462" id="identifier_1_462" class="footnote-link footnote-identifier-link" title="et j&rsquo;exag&egrave;re &agrave; peine">2</a></sup> dans mon quotidien de développeur mais pas seulement. Peut-être les connaitrez-vous déjà, peut-être pas.</p>
<p>3 applications cela peut sembler peu. N&rsquo;y voyez pas là une marque criante de fainéantise, cependant je ne souhaitais pas virer dans la course à l&rsquo;armement et vous présenter les 69 web apps qui tuent que j&rsquo;aurais re-pompées sur tel ou tel autre bon gros site à destination des web-quelquechose. Non, il s&rsquo;agit là vraiment<sup><a href="http://jonathankowalski.fr/blog/2012/05/3-applications-web-que-jutilise-chaque-jour-ou-presque/#footnote_2_462" id="identifier_2_462" class="footnote-link footnote-identifier-link" title="et comme souvent">3</a></sup> de mon expérience personnelle.</p>
<p>Enfin trêve de blabla, trêve de blabla comme dirait Dany Boon<sup><a href="http://jonathankowalski.fr/blog/2012/05/3-applications-web-que-jutilise-chaque-jour-ou-presque/#footnote_3_462" id="identifier_3_462" class="footnote-link footnote-identifier-link" title="oui j&rsquo;ai aussi de l&rsquo;humour">4</a></sup></p>
<p><span id="more-462"></span></p>
<h2>Pixlr</h2>
<p>En premier lieu j&rsquo;évoquerais <strong>Pixlr</strong>.</p>
<p><a href="http://pixlr.com"><img class="alignleft size-full wp-image-466" title="pixlr" src="http://jonathankowalski.fr/blog/wp-content/uploads/2012/05/pixlr2.png" alt="" width="180" height="180" /></a>Quand on travaille sur le web, on a sans cesse besoin de retoucher des images, ne serait-ce que pour les recadrer ou corriger des petits défauts. Comme nous ne sommes pas tous multimilliardaires<sup><a href="http://jonathankowalski.fr/blog/2012/05/3-applications-web-que-jutilise-chaque-jour-ou-presque/#footnote_4_462" id="identifier_4_462" class="footnote-link footnote-identifier-link" title="pour rappel Toshop vaut la bagatelle de 955&euro;">5</a></sup> que <strong>Paint</strong> s&rsquo;avère tout de même assez vite limité et que <strong>Gimp</strong> est bien trop compliqué<sup><a href="http://jonathankowalski.fr/blog/2012/05/3-applications-web-que-jutilise-chaque-jour-ou-presque/#footnote_5_462" id="identifier_5_462" class="footnote-link footnote-identifier-link" title="don&rsquo;t feed the troll">6</a></sup>, <strong>Pixlr</strong> s&rsquo;est offert une place de choix dans mes onglets épinglés. Bien sur ne vous attendez pas à trouver là l’équivalent exact du logiciel d&rsquo;<em>Adobe</em><sup><a href="http://jonathankowalski.fr/blog/2012/05/3-applications-web-que-jutilise-chaque-jour-ou-presque/#footnote_6_462" id="identifier_6_462" class="footnote-link footnote-identifier-link" title="qui a clairement encore quelques belles ann&eacute;es devant lui">7</a></sup> mais bon, on retrouve une gestion des calques, quelques filtres intéressant et même des lignes de forces lors des cadrages-débordements, redimensionnements.</p>
<p>Ça s&rsquo;ouvre vite et ça fait ce qu&rsquo;on attend de lui. <a href="http://pixlr.com" target="_blank">http://pixlr.com</a></p>
<h2>Toggl</h2>
<p>La retouche d&rsquo;image n&rsquo;est clairement pas mon métier et il est clair que bien qu&rsquo;usité <strong>Pixlr</strong> n&rsquo;est pas l&rsquo;adresse que je fréquente le plus assidument.</p>
<p><a href="https://www.toggl.com"><img class="alignleft size-full wp-image-470" title="toggl" src="http://jonathankowalski.fr/blog/wp-content/uploads/2012/05/toggl.png" alt="" width="180" height="180" /></a> <strong>Toggl</strong> l&rsquo;est un peu plus.<br />
Notre temps est précieux. De cette affirmation en découle une autre, la productivité est importante. Puisque l&rsquo;on travaille<sup><a href="http://jonathankowalski.fr/blog/2012/05/3-applications-web-que-jutilise-chaque-jour-ou-presque/#footnote_7_462" id="identifier_7_462" class="footnote-link footnote-identifier-link" title="et qu&rsquo;on aime &ccedil;a sinon changez :p">8</a></sup> il est important de pouvoir mesurer le temps passé sur notre travail et ainsi profiler notre efficacité. <strong>Toggl</strong> est parfait pour ça. Enregistrez-vous avec votre compte <strong>Google</strong> et voilà. Vous avez accès à un outil simple vous permettant de tracker les <del>minutes</del> heures passées sur chacune de vos tâches, en retirer des rapports et des statistiques. Toggl est le rêve incarné des managers et des personnes souhaitant maitriser le temps.<sup><a href="http://jonathankowalski.fr/blog/2012/05/3-applications-web-que-jutilise-chaque-jour-ou-presque/#footnote_8_462" id="identifier_8_462" class="footnote-link footnote-identifier-link" title="rien que &ccedil;a !">9</a></sup></p>
<p>Et en plus, <strong>Toggl</strong> fournit des applications desktop et mobiles vous permettant une maîtrise et une visibilité en toutes circonstances. A noter que certaines fonctionnalités sont payantes mais il est fort probable que la version gratuite vous soit déjà agréable. <a href="http://www.toggl.com" target="_blank">http://www.toggl.com</a></p>
<h2>WorkFlowy</h2>
<p>A Londres et à New-York on dit <em>&laquo;&nbsp;Last but not least&nbsp;&raquo;</em>.</p>
<p><a href="http://workflowy.com"><img class="alignleft size-full wp-image-474" title="workflowy" src="http://jonathankowalski.fr/blog/wp-content/uploads/2012/05/workflowy.jpg" alt="" width="180" height="180" /></a><strong>WorkFlowy</strong> est sans doute la quintessence des applications web. <em>Saint-Exupéry</em> disait que la perfection était atteinte non pas quand il n&rsquo;y avait plus rien à ajouter mais quand il n&rsquo;y avait plus rien à enlever. <strong>WorkFlowy</strong> n&rsquo;est sans doute pas parfait mais il n&rsquo;y a pas grand chose à en enlever.<br />
L&rsquo;organisation est la sainte mère du professionnel et <strong>WorkFlowy</strong> va vous permettre de rester organisé de la manière la plus simple qui soit. J&rsquo;avoue être quelque peu dithyrambique mais quand une application est à la fois aussi simple et utile il est important de le souligner.</p>
<p>WorkFlowy va donc vous permettre de créer des listes afin de vous organiser<sup><a href="http://jonathankowalski.fr/blog/2012/05/3-applications-web-que-jutilise-chaque-jour-ou-presque/#footnote_9_462" id="identifier_9_462" class="footnote-link footnote-identifier-link" title="puisque je vous dis que c&rsquo;est simple !">10</a></sup>. Deux défauts quand même pour finir, 1) l&rsquo;application ne fonctionne pas sur mon Windows Phone, mais bon qui dit WP dit aussi Internet Explorer donc disons que l&rsquo;on peut comprendre&#8230; et 2) quand vous utiliserez <strong>WorkFlowy</strong> vous ne verrez plus le monde que sous forme de liste.<sup><a href="http://jonathankowalski.fr/blog/2012/05/3-applications-web-que-jutilise-chaque-jour-ou-presque/#footnote_10_462" id="identifier_10_462" class="footnote-link footnote-identifier-link" title="cependant on s&rsquo;y fait tr&egrave;s bien :p">11</a></sup>  <a href="http://workflowy.com" target="_blank">http://workflowy.com</a></p>
<h2>Fertig</h2>
<p>Voilà 3 applications utiles, gratuites et qui me permettent de gagner un peu de temps ou de sommeil en fonction. Comme dit en introduction il s&rsquo;agit là d&rsquo;un retour personnel, subjectif et partial, n’hésitez pas à me faire part de vos expériences et d&rsquo;applications encore meilleures que celles présentées ici.</p>
<p>Vive le partage.</p>
<p><iframe src="http://www.youtube.com/embed/mboV7GrSgtA" frameborder="0" width="560" height="315"></iframe></p>
<ol class="footnotes"><li id="footnote_0_462" class="footnote">avec WordPress</li><li id="footnote_1_462" class="footnote">et j&rsquo;exagère à peine</li><li id="footnote_2_462" class="footnote">et comme souvent</li><li id="footnote_3_462" class="footnote">oui j&rsquo;ai aussi de l&rsquo;humour</li><li id="footnote_4_462" class="footnote">pour rappel Toshop vaut la bagatelle de 955€</li><li id="footnote_5_462" class="footnote">don&rsquo;t feed the troll</li><li id="footnote_6_462" class="footnote">qui a clairement encore quelques belles années devant lui</li><li id="footnote_7_462" class="footnote">et qu&rsquo;on aime ça sinon changez :p</li><li id="footnote_8_462" class="footnote">rien que ça !</li><li id="footnote_9_462" class="footnote">puisque je vous dis que c&rsquo;est simple !</li><li id="footnote_10_462" class="footnote">cependant on s&rsquo;y fait très bien :p</li></ol>]]></content:encoded>
			<wfw:commentRss>http://jonathankowalski.fr/blog/2012/05/3-applications-web-que-jutilise-chaque-jour-ou-presque/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Les références en PHP</title>
		<link>http://jonathankowalski.fr/blog/2012/04/les-references-en-php/</link>
		<comments>http://jonathankowalski.fr/blog/2012/04/les-references-en-php/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 08:30:29 +0000</pubDate>
		<dc:creator><![CDATA[Jonathan Kowalski]]></dc:creator>
				<category><![CDATA[developpement]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[références]]></category>

		<guid isPermaLink="false">http://jonathankowalski.fr/blog/?p=422</guid>
		<description><![CDATA[Depuis le dernier article sur ce blog, 4 mois se sont écoulés. 4 mois ça commence à faire long, si long qu&#8217;entre temps je me suis inéluctablement rapproché de la trentaine et surtout, surtout je suis devenu l&#8217;heureux1 papa d&#8217;une &#8230; <a href="http://jonathankowalski.fr/blog/2012/04/les-references-en-php/">Lire la Suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Depuis le dernier article sur ce blog, 4 mois se sont écoulés. 4 mois ça commence à faire long, si long qu&rsquo;entre temps je me suis inéluctablement rapproché de la trentaine et surtout, surtout je suis devenu l&rsquo;heureux<sup><a href="http://jonathankowalski.fr/blog/2012/04/les-references-en-php/#footnote_0_422" id="identifier_0_422" class="footnote-link footnote-identifier-link" title="tr&egrave;s tr&egrave;s heureux">1</a></sup> papa d&rsquo;une petite merveille.</p>
<p>Toujours est-il que pour cette reprise je souhaitais répondre à mon ami H. M. qui se renseignait récemment sur la nature et l&rsquo;emploi des <strong>références en PHP</strong>.</p>
<p><span id="more-422"></span></p>
<h2>Qu&rsquo;est-ce qu&rsquo;une référence ?</h2>
<p>Une analogie commune qui s&rsquo;avère aussi être une erreur<sup><a href="http://jonathankowalski.fr/blog/2012/04/les-references-en-php/#footnote_1_422" id="identifier_1_422" class="footnote-link footnote-identifier-link" title="ou de mani&egrave;re plus tatillonne une inexactitude">2</a></sup> et de les comparer aux pointeurs C. En réalité ce sont deux choses très différentes. Les références en PHP sont des <strong>alias</strong> vers un même contenu.</p>
<script src="https://gist.github.com/4458849c9e563474b8db.js"></script><noscript><pre><code class="language-php php">&lt;?php
$alpha = 1337;
$beta =&amp; $alpha;</code></pre></noscript>
<p>Ainsi $beta et $alpha pointent sur le même contenu qui est en l’occurrence 1337. Aucune des deux variables n&rsquo;a de précédence par rapport à l&rsquo;autre elles référencent simplement le même contenu. Le manuel php évoque une similitude avec les fichiers sous Unix que je trouve assez parlante.</p>
<div id="attachment_431" style="width: 180px" class="wp-caption aligncenter"><a href="http://jonathankowalski.fr/blog/wp-content/uploads/2012/04/varcopy.png" rel="lightbox[422]" title="varcopy"><img class="size-full wp-image-431" title="varcopy" src="http://jonathankowalski.fr/blog/wp-content/uploads/2012/04/varcopy.png" alt="" width="170" height="125" /></a><p class="wp-caption-text">$a = 5; $b = $a; copie de variable</p></div>
<p>Ici dans le cas d&rsquo;une copie de variables on voit que $a et $b ont un contenu similaire mais n&rsquo;ont d&rsquo;autre lien que celui fait par notre oeil humain, une modification de $a n&rsquo;affectera en rien $b (et vice et versa).</p>
<div id="attachment_432" style="width: 173px" class="wp-caption aligncenter"><a href="http://jonathankowalski.fr/blog/wp-content/uploads/2012/04/varref.png" rel="lightbox[422]" title="varref"><img class="size-full wp-image-432" title="varref" src="http://jonathankowalski.fr/blog/wp-content/uploads/2012/04/varref.png" alt="" width="163" height="125" /></a><p class="wp-caption-text">$a = 5; $b =&amp; $a; reference.</p></div>
<p>Ici on comprend tout de suite que $a et $b ont le même contenu, ce sont simplement deux noms différents pour identifier le même contenu. Ainsi modifier $b modifiera aussi $a (et vice et versa).</p>
<p>En revanche, supprimer $b n&rsquo;affectera pas $a, on ne fait que casser le lien entre $b et le contenu 5 mais en aucun cas celui de $a. C&rsquo;est là ou la distinction avec les pointeurs C est la plus parlante car en C en libérant $b, $a n&rsquo;existerait plus.</p>
<h2>Encore un peu plus de références</h2>
<p>On a vu comment assigner une référence, mais il existe d&rsquo;autres moyens de manipuler celles-ci.</p>
<h3>Passage par référence</h3>
<p>On peut avoir envie qu&rsquo;une fonction modifie directement une variable sans passer par le retour de cette fonction. Dans ce cas on peut indiquer à une fonction que notre variable est passée par référence.</p>
<p>Un exemple classique est une fonction <em>incrementer</em></p>
<script src="https://gist.github.com/558add02c40e20d806bb.js"></script><noscript><pre><code class="language-php php">&lt;?php
function incrementer(&amp;$var){
    $var++;
}
$a = 4;
incrementer($a);
//$a vaut maintenant 5</code></pre></noscript>
<p>Cette manière nous permet de passer outre les portées et de modifier une variable directement dans une fonction un peu comme si elle était globale<sup><a href="http://jonathankowalski.fr/blog/2012/04/les-references-en-php/#footnote_2_422" id="identifier_2_422" class="footnote-link footnote-identifier-link" title="d&rsquo;ailleurs il est &agrave; noter que le mot-cl&eacute; global cr&eacute;e en fait une r&eacute;f&eacute;rence">3</a></sup>.</p>
<h3>Retourner une référence</h3>
<p>En plus de passer des arguments par référence, vous pouvez aussi faire en sorte qu&rsquo;une fonction retourne une référence.</p>
<script src="https://gist.github.com/47bb893941f6ba27666f.js"></script><noscript><pre><code class="language-php php">&lt;?php
class Demo {
    public $attribut;
    public function &amp;getAttr(){
        return $this-&gt;attribut;
    }
}
$demo = new Demo;
$attr = &amp;$demo-&gt;getAttr();
$demo-&gt;attribut = &quot;enchain&eacute;&quot;;
//$attr vaut d&eacute;sormais enchain&eacute;</code></pre></noscript>
<p>On remarquera ici que vous devez utiliser le &amp; à la déclaration de votre fonction/méthode et lors de l&rsquo;assignation.</p>
<h2>Faut-il utiliser les références ?</h2>
<p>Bonne question. Pour moi elle revient à poser sa consœur <em>&laquo;&nbsp;Doit-on nommer de plusieurs manières différentes la même chose ?&nbsp;&raquo;</em>. En particulier concernant l&rsquo;assignation par référence et le fait de retourner des références<sup><a href="http://jonathankowalski.fr/blog/2012/04/les-references-en-php/#footnote_3_422" id="identifier_3_422" class="footnote-link footnote-identifier-link" title="qui sont deux concepts assez similaires">4</a></sup>, la réponse est la même, clairement <strong>non</strong>.<br />
Le passage par référence peut à la rigueur se comprendre <code>incrementer($a);</code> étant plus compréhensible que <code>$a = incrementer($a);</code><sup><a href="http://jonathankowalski.fr/blog/2012/04/les-references-en-php/#footnote_4_422" id="identifier_4_422" class="footnote-link footnote-identifier-link" title="dans ce cas la fonction va-t-elle incr&eacute;menter de $a ou de 1 ?">5</a></sup> mais dans des cas plus &laquo;&nbsp;<em>complexes</em>&nbsp;&raquo; il serait encore préférable d&rsquo;avoir un objet implémentant une méthode <em>incrementer</em> et donc de passer par <code>$this</code> qui s&rsquo;avère déjà être une référence <code>$a-&gt;incrementer();</code></p>
<ol class="footnotes"><li id="footnote_0_422" class="footnote">très très heureux</li><li id="footnote_1_422" class="footnote">ou de manière plus tatillonne une inexactitude</li><li id="footnote_2_422" class="footnote">d&rsquo;ailleurs il est à noter que le mot-clé <em>global</em> crée en fait une référence</li><li id="footnote_3_422" class="footnote">qui sont deux concepts assez similaires</li><li id="footnote_4_422" class="footnote">dans ce cas la fonction va-t-elle incrémenter de $a ou de 1 ?</li></ol>]]></content:encoded>
			<wfw:commentRss>http://jonathankowalski.fr/blog/2012/04/les-references-en-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
