<?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>Hooba Studios &#187; Théorie</title>
	<atom:link href="http://www.hooba.ca/blog/categorie/theorie/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.hooba.ca/blog</link>
	<description></description>
	<lastBuildDate>Sun, 11 Jul 2010 13:51:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Hooba fait dans les bonnes oeuvres</title>
		<link>http://www.hooba.ca/blog/2009/hooba-fait-dans-les-bonnes-oeuvres/</link>
		<comments>http://www.hooba.ca/blog/2009/hooba-fait-dans-les-bonnes-oeuvres/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 02:53:41 +0000</pubDate>
		<dc:creator>Antoine Leclair</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Théorie]]></category>
		<category><![CDATA[Tranche de vie]]></category>

		<guid isPermaLink="false">http://www.hooba.ca/blog/?p=440</guid>
		<description><![CDATA[Je me suis fait demander récemment de commanditer un concours de vidéo qui est organisé par les bibliothèques de Lévis. Comme la demande venait d&#8217;une personne proche et qu&#8217;ils avaient besoin d&#8217;un site web, j&#8217;ai donc mis la main à la pâte.
Le concours s&#8217;appelle À l&#8217;affiche dans une bibliothèque près de chez vous. Les jeunes [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dansunebibliothequepresdechezvous.ca/"><img class="size-full wp-image-450 alignleft" title="Concours À l'affiche dans une bibliothèque près de chez vous" src="http://www.hooba.ca/blog/wp-content/uploads/2009/11/dans-une-bibliotheque-pres-de-chez-vous.png" alt="Concours À l'affiche dans une bibliothèque près de chez vous" width="210" height="149" /></a>Je me suis fait demander récemment de commanditer un concours de vidéo qui est organisé par les bibliothèques de Lévis. Comme la demande venait d&#8217;une personne proche et qu&#8217;ils avaient besoin d&#8217;un site web, j&#8217;ai donc mis la main à la pâte.</p>
<p>Le concours s&#8217;appelle <a href="http://www.dansunebibliothequepresdechezvous.ca/">À l&#8217;affiche dans une bibliothèque près de chez vous</a>. Les jeunes doivent faire un vidéo &laquo;&nbsp;bande-annonce&nbsp;&raquo; d&#8217;un livre parmi les livres sélectionnés.</p>
<p>Comme c&#8217;était du bénévolat et que les visiteurs allaient être des jeunes (donc plus enclins à utiliser un navigateur récent), je me suis permis d&#8217;expérimenter un peu avec le CSS3.</p>
<p><span id="more-440"></span></p>
<h3>Box Shadow</h3>
<p><a href="http://www.dansunebibliothequepresdechezvous.ca/"><img class="alignnone size-full wp-image-447 shadow" title="Box Shadow CSS3" src="http://www.hooba.ca/blog/wp-content/uploads/2009/11/bibliotheque-pres-de-chez-vous-box-shadow.jpg" alt="Box Shadow CSS3" width="580" height="254" /></a></p>
<p>Si vous avez un navigateur récent qui n&#8217;est pas Internet Explorer, vous pouvez voir qu&#8217;il y a un une ombre autour du contenu principal. Il s&#8217;agit de la propriété CSS <code>box-shadow</code>. Elle n&#8217;est actuellement implémenté que dans Webkit (Safara, Chrome) et Firefox 3.5+. Comme le CSS3 n&#8217;est pas encore ratifié, il faut ajouter l&#8217;extension des navigateurs à l&#8217;avant de la règle. C&#8217;est à dire <code>-moz</code> pour Firefox et <code>-webkit</code> pour Webkit. Par exemple, sur le site du concours, voici la règle que j&#8217;ai utilisée:</p>
<pre><code>-moz-box-shadow:0 0 20px 3px black;
-webkit-box-shadow:0 0 20px 2px black;
box-shadow:0 0 20px 2px black;</code></pre>
<p>La version sans préfixe sert pour le jour où cette règle CSS deviendra standard. En gros, j&#8217;ai utilisé cinq paramètres:</p>
<ol>
<li><em>Offset</em> horizontal, au cas où on voudrait décaller.</li>
<li><em>Offset</em> vertical, même chose.</li>
<li>Flou (<em>blur</em>), détermine l&#8217;intensité du flou, un peu comme dans Photoshop.</li>
<li>Étendue (<em>spread</em>), sans avoir trop expérimenté, ça ressemble un peu à <code>padding</code>, mais appliqué à l&#8217;ombre. Peut être négatif si on veut la rapetisser.</li>
<li>Couleur. Je crois que la spécification permettra aussi d&#8217;utiliser <code>rgba</code> (avec de la transparence).</li>
</ol>
<h3>IE6 n&#8217;est pas mort</h3>
<p>Après avoir fait le site web, comme tout bon intégrateur, j&#8217;ai fait le tour dans tous les navigateurs majeurs (IE6/7/8, Chrome, Firefox, Safari, Opera) afin d&#8217;y arranger les petits problèmes. Comme à l&#8217;habitude, IE6 est toujours un peu plus tannant, alors dans la même perspective qui m&#8217;avait poussé à expérimenter avec CSS3, j&#8217;ai décidé de rendre le site regardable dans ce navigateur, sans faire pieds et main pour le rendre <em>pixel perfect</em>. À ma grande surprise, lors des premiers jours après la mise en ligne, Google Analytics me disait qu&#8217;environ 90% du trafic était fait avec IE6! J&#8217;ai donc compris que les TI de la ville de Lévis n&#8217;avaient pas encore pris la peine de mettre à jour les navigateurs de certains employés! Par chance, après la vague de curieux à l&#8217;interne, la tendance est plutôt redevenue normale (c&#8217;est à dire, je n&#8217;ai pas revu d&#8217;IE6 depuis).</p>
<h3>CSS3 va rocker</h3>
<p>Dans ce projet, je n&#8217;ai utilisé qu&#8217;une seule règle de CSS3. Elle ajoute un petit quelque chose au site, sans pour autant avoir un effet dévastateur lorsqu&#8217;elle n&#8217;est pas rendue par le navigateur.</p>
<p>Il y a plusieurs autres règles qui, en réduisant l&#8217;utilisation d&#8217;images, vont vraiment accélérer l&#8217;intégration web et réduire la taille des pages.</p>
<p>Les navigateurs utilisés sont de plus en plus à jour: IE6 disparait et IE7 disparait encore plus vite maintenant qu&#8217;IE8 est sorti! On pourra donc très bientôt utiliser les derniers ajouts au fur et à mesure qu&#8217;ils arrivent.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hooba.ca/blog/2009/hooba-fait-dans-les-bonnes-oeuvres/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bon code, Bad code</title>
		<link>http://www.hooba.ca/blog/2009/bon-code-bad-code/</link>
		<comments>http://www.hooba.ca/blog/2009/bon-code-bad-code/#comments</comments>
		<pubDate>Fri, 17 Jul 2009 03:19:15 +0000</pubDate>
		<dc:creator>Antoine Leclair</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Sécurité]]></category>
		<category><![CDATA[Théorie]]></category>

		<guid isPermaLink="false">http://www.hooba.ca/blog/?p=384</guid>
		<description><![CDATA[Il n&#8217;y a pas si longtemps, j&#8217;ai eu à intégrer du code PHP qu&#8217;un autre programmeur avait déjà fait pour un autre site. Le client tenait à ce que j&#8217;utilise son &#171;&#160;module&#160;&#187; de nouvelles en pensant sauver de l&#8217;argent. La première fois que j&#8217;ai eu à intégrer ledit module, ç&#8217;a effectivement été plutôt rapide étant [...]]]></description>
			<content:encoded><![CDATA[<p>Il n&#8217;y a pas si longtemps, j&#8217;ai eu à intégrer du code PHP qu&#8217;un autre programmeur avait déjà fait pour un autre site. Le client tenait à ce que j&#8217;utilise son &laquo;&nbsp;module&nbsp;&raquo; de nouvelles en pensant sauver de l&#8217;argent. La première fois que j&#8217;ai eu à intégrer ledit module, ç&#8217;a effectivement été plutôt rapide étant donné que le site était fait dans le même <em>pattern</em> que le site d&#8217;origine. Par contre, la deuxième fois, c&#8217;était une toute autre chose!<span id="more-384"></span></p>
<h3>Du code non-réutilisable</h3>
<p>J&#8217;espère ne rendre personne triste en publiant cet article, mais je vais vous faire un petit copier-coller d&#8217;une fonction pour illustrer mes points.</p>
<pre>&lt;?php
// _______________________________________________________________________
// Display news list
function fct_display_news_list(){
    // Search
    if(isset($_GET['search']) &amp;&amp; !empty($_GET['search'])){
        $query = " WHERE title LIKE CONVERT(_utf8 '%".$_GET['search']."%' USING latin1) OR content LIKE CONVERT(_utf8 '%".$_GET['search']."%' USING latin1)";
    }else{
        if(isset($_GET['date']) &amp;&amp; ereg("^[0-9]{4}\-[0-9]{2}$", $_GET['date'])){
            $arr = explode("-", $_GET['date']);
            $date_start = mktime(0, 0, 0, $arr[1], 1, $arr[0]);
            $date_end = mktime(0, 0, 0, $arr[1] + 1, 1, $arr[0]);
            $query = " WHERE date_news&gt;=".$date_start." AND date_news&lt;".$date_end;
        }
    }
    if(!isset($query)){
        $query = " ORDER BY date_news DESC LIMIT 3";
    }else{
        $query .= " ORDER BY date_news DESC";
    }

    $query = "SELECT * FROM juris_news".$query;
    $result = mysql_query($query) or die(mysql_error());
    if(mysql_num_rows($result) &gt; 0){
        for($i = 1; $row = mysql_fetch_array($result); $i++){
?&gt;
    &lt;h3 first"); } ?&gt;"&gt;&lt;?= $row['title']; ?&gt;&lt;/h3&gt;
    &lt;p&gt;&lt;?= date("Y-m-d", $row['date_news']); ?&gt;&lt;/p&gt;
    &lt;p&gt;&lt;?= $row['intro']; ?&gt;&lt;/p&gt;
    &lt;p&gt;&lt;a href="actualites.php?id=&lt;?= $row['id']; ?&gt;" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('news&lt;?= $i; ?&gt;','','medias/img_c_btn_savoir_rl.gif',0)"&gt;&lt;img src="medias/img_c_btn_savoir_up.gif" alt="En savoir plus" name="news&lt;?= $i; ?&gt;" id="news&lt;?= $i; ?&gt;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;?php
        }
    }else{
        echo("&lt;p&gt;Aucune actualit&amp;eacute; trouv&amp;eacute;e.&lt;/p&gt;");
    }
}</pre>
<p>Il s&#8217;agit ici de la première fonction d&#8217;une dizaine de fonctions similaires qui constituent le fichier.</p>
<h3>Premier péché: mélanger la logique avec la présentation</h3>
<p>La principale force de PHP est aussi sa principale faiblesse: il est très facile de mélanger du PHP avec du HTML. On peut avoir une page entière en HTML et y insérer très facilement un peu de PHP. On peut par contre aussi avoir du PHP et y insérer du HTML. Le problème avec cette fonction, c&#8217;est qu&#8217;elle génère (et affiche) du HTML.</p>
<p>On peut voir très facilement que le code HTML affiché n&#8217;est pas réutilisable. Il y a des appels à des fonctions JavaScript et des images dont le chemin d&#8217;accès est <em>hard coded</em>. Par exemple, la fonction affiche:</p>
<pre><code>// mauvais
</code>&lt;p&gt;&lt;a href="actualites.php?id=&lt;?= $row['id']; ?&gt;" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('news&lt;?= $i; ?&gt;','','medias/img_c_btn_savoir_rl.gif',0)"&gt;&lt;img src="medias/img_c_btn_savoir_up.gif" alt="En savoir plus" name="news&lt;?= $i; ?&gt;" id="news&lt;?= $i; ?&gt;" /&gt;&lt;/a&gt;&lt;/p&gt;</pre>
<p>Il est fort peu probablement que j&#8217;aie à utiliser les mêmes fonctions JavaScript et que j&#8217;utilise les mêmes images. Aussi, le <em>markup</em> HTML généré ne conviendra générallement pas aux besoins d&#8217;un autre site. Par exemple, je doute que <code>&lt;h3 class="blue"&gt;</code> puissent être réutilisé.</p>
<p>La meilleur façon aurait été de simplement arrêter la fonction à la fin de la requête SQL. La fonction aurait simplement pu retourner un <em>array</em>, un objet ou un itérateur. De cette manière, on sépare la logique de la présentation. Par exemple, si la fonction retournait un <em>array</em> <code>$nouvelles</code>, on pourrait l&#8217;intégrer dans la page directement.</p>
<pre><code>&lt;!-- Mieux --&gt;
&lt;!-- Markup de ce qui vient avant dans la page ici... --&gt;
&lt;div id="nouvelles"&gt;
    &lt;h2&gt;Nouvelles&lt;/h2&gt;
    &lt;?php if (!empty($nouvelles)) : ?&gt;
    &lt;?php foreach ($nouvelles as $nouvelle) : ?&gt;
    &lt;p class="date"&gt;&lt;?= date("Y-m-d", $nouvelle['date_news']) ?&gt;&lt;/p&gt;
    &lt;p&gt;&lt;?= $nouvelle['intro'] ?&gt;&lt;/p&gt;
    &lt;p&gt;&lt;a href="actualites.php?id=&lt;?= $nouvelle['id']; ?&gt;" class="more"&gt;En savoir plus&lt;/a&gt;&lt;/p&gt;
    &lt;?php endforeach ?&gt;
    &lt;?php else : ?&gt;
    &lt;p&gt;Aucune nouvelle&lt;/p&gt;
    &lt;?php endif ?&gt;
&lt;/div&gt;
&lt;!-- Suite du site ici... --&gt;
&lt;div id="sidebar"&gt;</code></pre>
<h3>Deuxième péché: La fonction n&#8217;accepte aucun paramètre</h3>
<p>De la façon dont la fonction est codée, on n&#8217;a aucun moyen externe (lire: aucun paramètre) d&#8217;affecter son déroulement. Si <code>$_GET['search']</code> contient quelque chose, une recherche sera faite, sinon, les trois dernières nouvelles sont affichées.</p>
<p>Il serait bien de pouvoir appeler la fonction en lui demandant un certain nombre de nouvelles. Je ne veux pas avoir toujours les trois dernières nouvelles dans tous les sites que je dois faire.</p>
<p>Aussi, si je veux faire une recherche, je ne veux pas nécessairement utiliser <code>$_GET['search']</code> comme chaine à chercher.</p>
<p>Le prototype de cette fonction aurait plutôt dû ressembler à ceci:</p>
<pre><code>function fct_display_news_list($quantity = 3, $search = NULL)</code></pre>
<p>De cette manière, on aurait pu avoir des comportements par défaut si on ne passe aucun argument tout en ayant un certain contrôle en cas de besoin. Si je voulais à ce moment utiliser la fonction en utilisant la valeur de <code>$_GET['search']</code> comme clé de recherche, j&#8217;aurais pu l&#8217;appeler ainsi:</p>
<pre><code>fct_display_news(3, $_GET['search'])</code></pre>
<h3>Troisième péché: la fonction fait trop de choses</h3>
<p>La fonction &laquo;&nbsp;raboute&nbsp;&raquo; des morceaux de requêtes SQL <strong>en créant la fin de la requête</strong> (<code>"WHERE ..."</code>) <strong>en premier</strong>. Je trouve étrange d&#8217;avoir commencé par la fin sans raison apparente. Ça ne fait que complexifier le code.</p>
<p>En plus, pourquoi ne pas avoir simplement séparé la fonction en deux fonctions? Chaque fonction aurait été beaucoup plus claire et facile à maintenir. Exemple:</p>
<pre><code>// mieux
function get_news($quantity = 3, $search = NULL){
    if ($search == NULL)
        return get_latest_news($quantity);
    else // $search != NULL
        return get_searched_news($quantity, $search);
}

function get_lastest_news($quantity = 3){
    // fonction qui retourne les $quantity dernières nouvelles
    // ...
}

function get_searched_news($quantity = 3, $search = NULL){
    // fonction qui retourne les $quantity dernières nouvelles trouvées selon la clé de recherche
    // ...
}</code></pre>
<p>Si on regarde la liste des fonctions du fichier, on se rend vite compte qu&#8217;une approche orienté objet aurait très bien fait la job. Une classe <code>News</code> aurait grandement simplifié le tout.</p>
<h3>Quatrième péché: des noms qui ne veulent rien dire</h3>
<p>Si on retourne dans le code au début de l&#8217;article, on peut voir qu&#8217;il y a plusieurs noms encombrés d&#8217;abréviations superflues ou qui ne veulent rien dire aux yeux de la prochaine personne qui touche le code.</p>
<p>Est-ce que j&#8217;ai vraiment besoin de spécifier dans le nom d&#8217;une fonction qu&#8217;il s&#8217;agit d&#8217;une fonction en y préfixant <code>fct</code>? Aussi, un fichier nommé <code>img_c_btn_savoir_up.gif</code>: un fichier <code>gif</code> est une image, pas besoin de préfixer <code>img</code> à son nom. Dans le même nom de fichier, que veut dire le &laquo;&nbsp;<code>c</code>&laquo;&nbsp;?</p>
<p>Une fonction devrait avoir un nom qui permet de savoir ce qu&#8217;elle fait tout en étant concis. <code>display_news_list</code> aurait été suffisant.</p>
<h3>Cinquième péché: être vulnérable aux injections SQL</h3>
<p>Étant donné que la fonction n&#8217;accepte aucun paramètre, le programmeur a utilisé la valeur de <code>$_GET['search']</code> directement dans sa fonction. Le problème que je veux souligner ici c&#8217;est la manière dont il l&#8217;a utilisée. Il l&#8217;a mis directement dans une requête sans la filtrer:</p>
<pre><code>// mauvais
$query = " WHERE title LIKE CONVERT(_utf8 '%".$_GET['search']."%' USING latin1) OR content LIKE CONVERT(_utf8 '%".$_GET['search']."%' USING latin1)";
</code></pre>
<p>En insérant directement des valeurs fournies par l&#8217;utilisateur (ici, dans la barre d&#8217;adresse) sans les avoir filtrés au préalable est une mauvaise pratique car elle ouvre très grand les portes aux <a href="http://www.hooba.ca/blog/2009/prevenir-les-injections-sql-avec-php-et-mysql/">attaques par injection SQL</a>.</p>
<h3>En conclusion</h3>
<p>Quand on programme, c&#8217;est important de toujours penser à la réutilisabilité du code. Il faut bien sûr parfois faire du code &laquo;&nbsp;<em>quick and dirty</em>&laquo;&nbsp;, mais les choses importantes que je viens d&#8217;énumérer ne sont pas compliqués à respecter. D&#8217;ailleurs, le programmeur aurait en fait sauvé du temps s&#8217;il avait fait du code réutilisable, car il a eu à reprogrammer un autre ensemble complet de fonctions pour le côté administrateur. S&#8217;il avait dès le départ fait une nouvelle classe ou simplement mieux conçu ses fonctions, il aurait facilement pu sauver beaucoup de temps en réutilisant lui-même son propre code à l&#8217;intérieur du même projet.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hooba.ca/blog/2009/bon-code-bad-code/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Conception d&#8217;applications web avec l&#8217;architecture MVC</title>
		<link>http://www.hooba.ca/blog/2008/conception-dapplications-web-avec-larchitecture-mvc/</link>
		<comments>http://www.hooba.ca/blog/2008/conception-dapplications-web-avec-larchitecture-mvc/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 20:48:46 +0000</pubDate>
		<dc:creator>Antoine Leclair</dc:creator>
				<category><![CDATA[Théorie]]></category>

		<guid isPermaLink="false">http://www.hooba.ca/blog/?p=225</guid>
		<description><![CDATA[Un billet rapide aujourd&#8217;hui pour illuminer certains qui ne connaitrait pas encore l&#8217;architecture MVC. C&#8217;est un pattern qui sépare la logique de la présentation. MVC est un acronyme pour Model-View-Controller.
En quelques mots, le modèle gère la base de donnée, le contrôleur fait le lien entre le modèle et la vue, et la vue est ce [...]]]></description>
			<content:encoded><![CDATA[<p>Un billet rapide aujourd&#8217;hui pour illuminer certains qui ne connaitrait pas encore l&#8217;architecture MVC. C&#8217;est un <em>pattern</em> qui sépare la logique de la présentation. MVC est un acronyme pour Model-View-Controller.</p>
<p>En quelques mots, le modèle gère la base de donnée, le contrôleur fait le lien entre le modèle et la vue, et la vue est ce que l&#8217;utilisateur voit. Chacun de ces composants, dans le code, est générallement une classe.<span id="more-225"></span></p>
<h3>Vue</h3>
<p>C&#8217;est ce que l&#8217;utilisateur voit. Dans le cas d&#8217;une application web, c&#8217;est, en gros, le code HTML. C&#8217;est le contrôleur qui décide de ce que va être la vue. Lorsque l&#8217;utilisateur clique sur un lien, c&#8217;est le contrôleur qui reçoit le clic, pas la vue. La vue ne fait qu&#8217;être ce que l&#8217;utilisateur voit.</p>
<h3>Contrôleur</h3>
<p>C&#8217;est ce qui fait le lien entre le modèle et la vue. L&#8217;utilisateur fait un clic, le contrôleur reçoit le clic et décide de ce qu&#8217;il en fera. Il communique avec le modèle pour traiter l&#8217;information reçue et/ou pour aller en chercher. Il décidera ensuite de la vue qui sera présentée à l&#8217;utilisateur.</p>
<h3>Modèle</h3>
<p>C&#8217;est ce qui contient tout le <em>business logic</em>. Il sert de lien avec la base de donnée. C&#8217;est générallement à cet endroit que va se faire la &laquo;&nbsp;grosse job&nbsp;&raquo;: rêquetes aux bases de données, validations, arranger les données d&#8217;une manière correct (en objets ou <em>array</em> ou autre) pour remettre au contrôleur.</p>
<h3>Concrètement sur internet</h3>
<p>Un utilisateur se fait présenter un formulaire pour entrer ses coordonnées lors de l&#8217;achat d&#8217;un produit (c&#8217;est la vue). Il entre ses informations et envoie le formulaire (reçu par le contrôleur). Le contrôleur demande au modèle d&#8217;inscrire l&#8217;achat dans la base de donnée. Le modèle fait une validation des champs et se rend compte que le numéro de carte de crédit ne contient pas assez de chiffres. Il retourne l&#8217;erreur au contrôleur. Le contrôleur présente le formulaire (la vue) avec les erreurs pour qu&#8217;elles soient corrigées. L&#8217;utilisateur renvoie le formulaire corrigé. Le contrôleur renvoie les informations au modèle pour inscrire dans la base de donnée. Le modèle effectue la validation avec succès et ajoute l&#8217;achat à la base de donnée. Il informe le contrôleur que tout est déroulé avec succès. Le contrôleur affiche le message de succès (la vue) à l&#8217;utilisateur.</p>
<h3>Avantages</h3>
<p>L&#8217;avantage principal de travailler avec l&#8217;architecture MVC, c&#8217;est qu&#8217;il permet de très bien séparer la logique de la présentation. La vue n&#8217;aura aucune logique d&#8217;imbriquée, ce qui facilitera le travail d&#8217;équipe. Aussi, étant donné que tout est très bien séparé, il est très facile d&#8217;ajouter et de modifier au code sans que le reste ne s&#8217;effondre. C&#8217;est un <em>pattern</em> qui se prête très bien au développement agile.</p>
<h3>Inconvénients</h3>
<p>Le fait de travailler avec un <em>pattern</em> dans un très petit projet peut alourdir inutilement la tâche. Lorsque seulement quelques lignes de codes auraient suffi, utiliser un <em>pattern</em> comme MVC est générallement inadapté. Aussi, on doit s&#8217;assurer que toutes les personnes qui travailleront sur le projet sont familières avec le <em>pattern</em> MVC, même si ce n&#8217;est pas très long à comprendre.</p>
<h3>En résumé</h3>
<p>La raison pour laquelle je vous parlais de ça, c&#8217;est que mon engoûment pour le MVC est revenu tout récemment. Il y a quelque temps, j&#8217;avais fait une petite visite de <a href="http://www.rubyonrails.org/">Ruby on Rails</a>, qui utilise (extrêmement bien à mon avis) le MVC. Par contre, même pour les petites applications, Ruby on Rails consomme beaucoup de mémoire vive et demande des connaissances pour le déploiement qui peuvent compliquer les choses avec certains clients. Ces compétences, par exemple, ne sont pas nécessaires pour déployer une application en PHP. C&#8217;est la raison qui m&#8217;a fait mettre Rails de côté pour quelque temps.</p>
<p>Par contre, tout récemment, en fouillant un peu pour trouver le CMS parfait (que je n&#8217;ai toujours pas trouvé), je suis tombé sur <a href="http://codeigniter.com/">CodeIgniter</a>. C&#8217;est un framework MVC en PHP, très rapide, qui ne demande pas beaucoup de ressources et qui est très simple à utiliser. Son défaut, à mon avis, est qu&#8217;il est écrit en PHP4. En lisant un peu sur le net par rapport à CodeIgniter, j&#8217;ai découvert qu&#8217;il y avait un <em>fork</em> qui s&#8217;appelle <a href="http://kohanaphp.com/">Kohana</a> qui est codé en PHP5. De ce que j&#8217;en vois à date, c&#8217;est extrêmement bien et je vous conseille le coup d&#8217;oeil!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hooba.ca/blog/2008/conception-dapplications-web-avec-larchitecture-mvc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conception en amélioration progressive</title>
		<link>http://www.hooba.ca/blog/2008/conception-en-amelioration-progressive/</link>
		<comments>http://www.hooba.ca/blog/2008/conception-en-amelioration-progressive/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 16:31:09 +0000</pubDate>
		<dc:creator>Antoine Leclair</dc:creator>
				<category><![CDATA[Accessibilité]]></category>
		<category><![CDATA[Théorie]]></category>
		<category><![CDATA[Utilisabilité]]></category>

		<guid isPermaLink="false">http://www.hooba.ca/blog/?p=209</guid>
		<description><![CDATA[Il n&#8217;y a pas si longtemps, je vous parlais de jQuery, une librairie JavaScript qui permet de faire des miracles avec peu de code. Par contre, en regardant sous la jupe des sites web qui utilisent du JavaScript (avec ou sans librairie), je me rends souvent compte que les concepteurs ont oublié une chose très [...]]]></description>
			<content:encoded><![CDATA[<p>Il n&#8217;y a pas si longtemps, je vous parlais de jQuery, une librairie JavaScript qui permet de faire des miracles avec peu de code. Par contre, en regardant sous la jupe des sites web qui utilisent du JavaScript (avec ou sans librairie), je me rends souvent compte que les concepteurs ont oublié une chose très importante: ce n&#8217;est pas tous les utilisateurs qui ont JavaScript actif dans leur navigateur.</p>
<p>De nos jours, il est plutôt rare de voir quelqu&#8217;un qui, sur son ordinateur, n&#8217;a pas un navigateur qui est capable de rendre le JavaScript. En fait, pour utiliser les principales librairies, on peut se fier sur des navigateurs assez vieux, comme Internet Explorer 6 qui date de 2001.<span id="more-209"></span></p>
<p>Autrefois (on recule d&#8217;un ou deux ans), on se faisait toujours sortir les mêmes histoires par rapport à JavaScript. &laquo;&nbsp;On ne peut pas être sur que l&#8217;utilisateur a un navigateur assez récent&nbsp;&raquo; et &laquo;&nbsp;l&#8217;utilisateur est peut-être parano et a peut-être désactivé JavaScript dans son navigateur&nbsp;&raquo; (il ne faut pas oublier qu&#8217;on se faisait innonder de pop-ups il n&#8217;y a pas si longtemps).</p>
<p>Bien qu&#8217;à mon avis ces histoires ne sont plus tellement valides, il y a une nouvelle réalité qui nous explose au visage: on peut désormais naviger sur internet à partir de plein de gadgets. De la console de jeux vidéos, au téléphone cellulaire <em>low-budget</em>, en passant par le décodeur numérique du téléviseur. Je ne m&#8217;avancerai pas plus, mais nous n&#8217;en somme qu&#8217;au début des &laquo;&nbsp;gadgets connectés&nbsp;&raquo;.</p>
<p>Toutes ces plateformes n&#8217;offrent pas les mêmes capacités. C&#8217;est pourquoi, je voulais faire un petit rappel aux développeur qui vivent dans le passé:</p>
<h3>Faites la conception de vos sites internet en amélioration progressive (<em>progressive enhancement</em>)</h3>
<p>Voici la manière dont je vois la conception web. Il faut d&#8217;abord coder de manière sémantique notre XHTML. Aucune trace de présentation dans le code à date! Parce qu&#8217;encore une fois, on ne sait pas avec quoi l&#8217;utilisateur regardera le site. Peut-être qu&#8217;il le lira avec un lecteur d&#8217;écran (pour les handicapés visuels). Ensuite, on peut ajouter du CSS, pour faire la présentation. Lorsque c&#8217;est codé, on peut modifier notre page pour l&#8217;intégrer avec le code côté-serveur. Lorsqu&#8217;on a un site fonctionnel de cette manière, on peut se permettre d&#8217;ajouter du JavaScript et de jouer avec le AJAX.</p>
<p>Voici le genre de truc qui me surprend toujours par son manque d&#8217;utilisabilité:</p>
<ul>
<li>Un bouton <em>submit</em> actionné UNIQUEMENT par JavaScript (sans JavaScript, impossible d&#8217;envoyer le formulaire).</li>
<li>Une galerie d&#8217;images qui utilise JavaScript pour faire la présentation, sans avoir fait au paravant une galerie fonctionnelle (ou même présentable) sans JavaScript.</li>
<li>Une page qui affiche perpétuellement &laquo;&nbsp;chargement&#8230;&nbsp;&raquo; JavaScript est désactivé.</li>
<li>Un site web entier qui se fie sur JavaScript pour fonctionner.</li>
<li>Des liens du genre <code>&lt;a href='javascript:void(0);' onclick='blah'&gt;</code>, qui ne fonctionnent pas sans JavaScript.</li>
</ul>
<p>Je dis tout ça pour JavaScript, mais je pourrais égallement le dire pour Flash! On a encore moins de chances d&#8217;avoir Flash qui fonctionne dans les gadgets d&#8217;aujourd&#8217;hui que d&#8217;avoir JavaScript. Par exemple, le iPhone n&#8217;accepte pas encore Flash, même s&#8217;il se débrouille plutôt bien avec JavaScript. Même chose pour Opera Mobile. Avec Internet Explorer pour Windows Mobile, pour l&#8217;instant, oubliez même JavaScript! J&#8217;ai entendu dire que Microsoft travaillait sur un nouveau navigateur pour leur plateforme mobile, alors ils devraient eux aussi pouvoir accepter JavaScript sous peu.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hooba.ca/blog/2008/conception-en-amelioration-progressive/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
