<?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>Coder-Studio &#187; twxs</title>
	<atom:link href="http://www.coder-studio.com/blog/author/twxs/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.coder-studio.com/blog</link>
	<description></description>
	<lastBuildDate>Wed, 31 Mar 2010 00:00:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Complément du tuto sur la classe Factory</title>
		<link>http://www.coder-studio.com/blog/complement-du-tuto-sur-la-classe-factory/</link>
		<comments>http://www.coder-studio.com/blog/complement-du-tuto-sur-la-classe-factory/#comments</comments>
		<pubDate>Tue, 08 Feb 2005 17:58:05 +0000</pubDate>
		<dc:creator>twxs</dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[factory]]></category>

		<guid isPermaLink="false">http://r19649.ovh.net/cs/blog/?p=181</guid>
		<description><![CDATA[J&#8217;avais laissé en exercice à la fin du dernier tutorial sur les factories un petit exercice&#8230; face au nombreux mail de votre par je publie la réponse.

Donc pour rappel, nous avons a notre disposition une classe Factory qui nous permet de créer des instances d&#8217;objets héritant tous d&#8217;une interface de base.
i.e. Shape était notre interface [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">J&#8217;avais laissé en exercice à la fin du dernier tutorial sur les factories un petit exercice&#8230; face au nombreux mail de votre par je publie la réponse.</p>
<p><span id="more-181"></span></p>
<p>Donc pour rappel, nous avons a notre disposition une classe Factory qui nous permet de créer des instances d&#8217;objets héritant tous d&#8217;une interface de base.<br />
i.e. Shape était notre interface Cylinder, Sphere nos instance a créer.</p>
<p>Le désavantage principal de l&#8217;implémentation était l&#8217;obligation d&#8217;écrire dans chaque classe une méthode statique créant l&#8217;instance :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p181code7'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p1817"><td class="code" id="p181code7"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">static</span> Shape <span style="color: #000040;">*</span>Sphere<span style="color: #008080;">::</span><span style="color: #007788;">create</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>Heureusement, les template vont encore une fois nous aider a nous abstraire de cette contrainte.</p>
<p style="text-align: justify;">La factory retourne des objets de type Object (paramètre de la classe templatée) elle stocke pour chaque clef une fonction dont le prototype est :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p181code8'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p1818"><td class="code" id="p181code8"><pre class="cpp" style="font-family:monospace;">Object <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">L&#8217;idée va être de ne plus stocker une fonction mais un objet au sens C++ jouant le rôle de cette fonction.</p>
<p style="text-align: justify;">Dans notre cas, le foncteur a donc une méthode CreateInstance(void) retournant un Object</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p181code9'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p1819"><td class="code" id="p181code9"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span>  <span style="color: #0000ff;">struct</span> InterfaceCreator<span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">virtual</span> Object <span style="color: #000040;">*</span>CreateInstance<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>on modifie en conséquence la classe Factory :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p181code10'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p18110"><td class="code" id="p181code10"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span>  <span style="color: #0000ff;">class</span> Factory<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
&nbsp;
<span style="color: #666666;">// on redéfinit notre nouveau type comme</span>
<span style="color: #666666;">// etant un InterfaceCreator&lt;object width=&quot;100&quot; height=&quot;100&quot; type=&quot;application/x-shockwave-flash&quot;&gt;&lt;/object&gt;</span></pre></td></tr></table></div>

<p>Maintenant, il nous faut specialiser des Creator pour notre Sphere, Shape, etc&#8230;</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p181code11'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p18111"><td class="code" id="p181code11"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span>
<span style="color: #0000ff;">class</span> Creator <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> InterfaceCreator
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
  BaseClass <span style="color: #000040;">*</span>CreateInstance<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
     RealClass instance <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> RealClass<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">static_cast</span><span style="color: #008000;">&#40;</span>instance<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Petite explication de cette double paramétrisation. Nous avons besoin du type réel de l&#8217;objet (Sphere) pour le créer et le type abstrait(Shape) pour pouvoir heriter de InterfaceCreator</p>
<p>Passons a l&#8217;utilisation :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p181code12'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p18112"><td class="code" id="p181code12"><pre class="cpp" style="font-family:monospace;">Factory shapeFactory<span style="color: #008080;">;</span>
...
&nbsp;
<span style="color: #0000ff;">class</span> Sphere <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> Shape<span style="color: #008000;">&#123;</span>
  ....
  <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">bool</span> registered<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> Sphere<span style="color: #008080;">::</span><span style="color: #007788;">registered</span> <span style="color: #000080;">=</span> shapeFactory.<span style="color: #0000ff;">register</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Sphere&quot;</span>, <span style="color: #0000dd;">new</span> Creator <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">bool</span> Cylinder<span style="color: #008080;">::</span><span style="color: #007788;">registered</span> <span style="color: #000080;">=</span> shapeFactory.<span style="color: #0000ff;">register</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Cylinder&quot;</span>, <span style="color: #0000dd;">new</span> Creator <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>j&#8217;espère que ca vous aura plu un minimum <img src='http://www.coder-studio.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
a+<br />
Twxs</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coder-studio.com/blog/complement-du-tuto-sur-la-classe-factory/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>La factory</title>
		<link>http://www.coder-studio.com/blog/la-factory/</link>
		<comments>http://www.coder-studio.com/blog/la-factory/#comments</comments>
		<pubDate>Tue, 21 Dec 2004 17:41:22 +0000</pubDate>
		<dc:creator>twxs</dc:creator>
				<category><![CDATA[C & C++]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[factory]]></category>

		<guid isPermaLink="false">http://r19649.ovh.net/cs/blog/?p=164</guid>
		<description><![CDATA[La Factory, brrr
Dans ce tutorial, je vais tenter d&#8217;aborder le design pattern factory (fabrique pour les anglophobes).
A mon habitude, nous allons retrouver la même ligne directrice que pour les précédents tutoriaux.
Je vais commencer par expliquer brièvement le principe de la factory, ensuite en découlera une première implémentation en C++ et enfin on essayera de rendre [...]]]></description>
			<content:encoded><![CDATA[<p><strong>La Factory, brrr</strong></p>
<p style="text-align: justify;">Dans ce tutorial, je vais tenter d&#8217;aborder le design pattern factory (fabrique pour les anglophobes).<br />
A mon habitude, nous allons retrouver la même ligne directrice que pour les précédents tutoriaux.<br />
Je vais commencer par expliquer brièvement le principe de la factory, ensuite en découlera une première implémentation en C++ et enfin on essayera de rendre ça le plus générique possible.</p>
<p style="text-align: justify;"><span id="more-164"></span></p>
<h2>Definition</h2>
<p style="text-align: justify;">La factory est en fait un objet dont le rôle est de créer des instances d&#8217;autres objets.<br />
Dans un modeleur par exemple, on pourrait avoir une factory d&#8217;objets géométriques qui servirait à créer des sphères, cônes, etc&#8230;</p>
<h2>Première Implémentation :</h2>
<p style="text-align: justify;">Nous allons prendre le cas d&#8217;une factory d&#8217;objets géométriques dont le but est de fournir des objets héritant de l&#8217;interface Shape.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p164code26'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p16426"><td class="code" id="p164code26"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> Shape<span style="color: #008000;">&#123;</span>...<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">De plus, nous avons dans l&#8217;application des objets implémentant l&#8217;interface shape comme Sphere, Cone, &#8230;.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p164code27'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p16427"><td class="code" id="p164code27"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> Sphere <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> Shape<span style="color: #008000;">&#123;</span>...<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">class</span> Cone   <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> Shape<span style="color: #008000;">&#123;</span>...<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Une premiere implémentation de la factory pourrait donner ceci :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p164code28'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p16428"><td class="code" id="p164code28"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> ShapeFactory<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
  Shape <span style="color: #000040;">*</span> createSphere<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">new</span> Sphere<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
  Shape <span style="color: #000040;">*</span> createCone<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">new</span> Cone<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Ce qui donne à l&#8217;utilisation :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p164code29'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p16429"><td class="code" id="p164code29"><pre class="cpp" style="font-family:monospace;">ShapeFactory factory<span style="color: #008080;">;</span>
&nbsp;
Shape <span style="color: #000040;">*</span> sphere <span style="color: #000080;">=</span> factory.<span style="color: #007788;">createSphere</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
sphere<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>display<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Cette première approche fonctionne, mais a le désavantage de rendre le code de la factory dépendant de l&#8217;application.<br />
Nous allons tenter de définir la factory de manière générique (template <img src='http://www.coder-studio.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ) afin de pouvoir la réutiliser dans d&#8217;autres cas.</p>
<h2>On templatise un peu ?</h2>
<p style="text-align: justify;">On peut voir la factory comme une map : à une clef donnée, on associe un type d&#8217;objet a créer.</p>
<p style="text-align: justify;">On devrait donc avoir au niveau des paramètres de la factory générique, le type de la clef et le type d&#8217;objet que la factory retourne. Ceci nous donne le prototype suivant :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p164code30'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p16430"><td class="code" id="p164code30"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span>  <span style="color: #0000ff;">class</span> Factory<span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Et à  l&#8217;utilisation :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p164code31'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p16431"><td class="code" id="p164code31"><pre class="cpp" style="font-family:monospace;">Factory shapeFactory<span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">De plus, on s&#8217;attend à pouvoir écrire quelque chose du genre :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p164code32'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p16432"><td class="code" id="p164code32"><pre class="cpp" style="font-family:monospace;">Shape <span style="color: #000040;">*</span>sphere <span style="color: #000080;">=</span> shapeFactory.<span style="color: #007788;">create</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Sphere&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">On enrichit donc notre esquisse de la classe  :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p164code33'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p16433"><td class="code" id="p164code33"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span>  <span style="color: #0000ff;">class</span> Factory<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
  Object <span style="color: #000040;">*</span> create<span style="color: #008000;">&#40;</span>key<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Pour le corps de la méthode create, nous avons besoin de réellement créer une instance d&#8217;un objet que la factory ne connait pas. Comme ceci ne peut pas se faire par magie, il va falloir enregistrer dans la factory une fonction capable de créer chaque objet et les associer à une clef.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p164code34'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p16434"><td class="code" id="p164code34"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span>  <span style="color: #0000ff;">class</span> Factory<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
<span style="color: #666666;">// un pointeur de fonction qui retourne un Object*</span>
  <span style="color: #0000ff;">typedef</span> Object <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>Creator<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
  map _registeredCreator<span style="color: #008080;">;</span>
&nbsp;
  <span style="color: #0000ff;">bool</span> <span style="color: #0000ff;">register</span><span style="color: #008000;">&#40;</span>Key key, Creator creator<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>_registeredCreator.<span style="color: #007788;">find</span><span style="color: #008000;">&#40;</span>key<span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> _registeredCreator.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
      <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span> <span style="color: #666666;">// la clef est deja utilisé</span>
    _registeredCreator.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span>pair<span style="color: #008000;">&#40;</span>key, creator<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
&nbsp;
  Object <span style="color: #000040;">*</span> create<span style="color: #008000;">&#40;</span>Key key<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
    Object <span style="color: #000040;">*</span>object<span style="color: #008080;">;</span>
    Creator creator<span style="color: #008080;">;</span>
    map<span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> it<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #666666;">// on cherche le pointeur de fonction associé a la clef</span>
    it <span style="color: #000080;">=</span> _registeredCreator.<span style="color: #007788;">find</span><span style="color: #008000;">&#40;</span>key<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>it <span style="color: #000080;">==</span> _registeredCreator.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span> <span style="color: #666666;">// on ne l'a pas trouvé</span>
&nbsp;
    <span style="color: #666666;">// on récupère le pointeur de fonction</span>
    creator <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>it<span style="color: #008000;">&#41;</span>.<span style="color: #007788;">second</span><span style="color: #008080;">;</span>
    <span style="color: #666666;">// on appelle la fonction pour créer un nouvel objet</span>
    object <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>creator<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #666666;">// on retourne l'objet</span>
    <span style="color: #0000ff;">return</span> object<span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Regardons maintenant comment utiliser tout ça :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p164code35'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p16435"><td class="code" id="p164code35"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// des fonctions de création d'objets</span>
Shape <span style="color: #000040;">*</span>createSphere<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #0000ff;">return</span> <span style="color: #0000dd;">new</span> Sphere<span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span>
Shape <span style="color: #000040;">*</span>createCone<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #0000ff;">return</span> <span style="color: #0000dd;">new</span> Cone<span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span>
&nbsp;
Factory shapeFactory<span style="color: #008080;">;</span>
shapeFactory.<span style="color: #0000ff;">register</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Sphere&quot;</span>, createSphere<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
shapeFactory.<span style="color: #0000ff;">register</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Cone&quot;</span>, createCone<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
Shape <span style="color: #000040;">*</span>sphere <span style="color: #000080;">=</span> shapeFactory.<span style="color: #007788;">create</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Sphere&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Ici le problème reste la nécessité d&#8217;avoir des fonctions &laquo;&nbsp;C&nbsp;&raquo; à mettre dans le code, et de devoir enregistrer ces fonctions à la main. Donc à chaque ajout d&#8217;objet géométrique devoir aller remodifier ce code d&#8217;initialisation de la factory.</p>
<p style="text-align: justify;">Pour rendre ceci un peu plus propre, nous allons définir ces fonctions en statique dans chaque objet géométrique et se servir de l&#8217;initialisation des CRT pour enregistrer les fonctions automatiquement.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p164code36'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p16436"><td class="code" id="p164code36"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// sphere.h</span>
<span style="color: #0000ff;">class</span> Sphere <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> Shape<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">static</span> Shape<span style="color: #000040;">*</span> create<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">bool</span> <span style="color: #0000ff;">register</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>


<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p164code37'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p16437"><td class="code" id="p164code37"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// sphere.pp</span>
<span style="color: #339900;">#include &quot;ShapeFactory.h&quot; // on considère que la shapeFactory est une variable globale accessible par ce fichier</span>
&nbsp;
Shape <span style="color: #000040;">*</span> Shpere<span style="color: #008080;">::</span><span style="color: #007788;">create</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">new</span> Sphere<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #666666;">// auto enregistrement :</span>
<span style="color: #0000ff;">bool</span> Sphere<span style="color: #008080;">::</span><span style="color: #0000ff;">register</span> <span style="color: #000080;">=</span> shapeFactory.<span style="color: #0000ff;">register</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Sphere&quot;</span>, Sphere<span style="color: #008080;">::</span><span style="color: #007788;">create</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>Il est possible d&#8217;utiliser des macros pour encore réduire la taille du code à produire.</p>
<p style="text-align: justify;">Petite explication : au lancement du programme, la variable statique register est initialisée. Cette initialisation passe par l&#8217;appel de la methode shapeFactory::register qui enregistre le &laquo;&nbsp;create&nbsp;&raquo;.</p>
<h2>Conlusion:</h2>
<p style="text-align: justify;">J&#8217;ai ici présenté l&#8217;implémentation &laquo;&nbsp;générique&nbsp;&raquo; d&#8217;une factory; pour pousser un peu plus l&#8217;exemple du modeleur, on peut imaginer que l&#8217;interface Shape permette de décrire des attributs (association nom / valeur). Une sphère par exemple aura un paramètre de type float nommé &laquo;&nbsp;radius&nbsp;&raquo;.<br />
Notre petite application graphique aura à parcourir les entrées de la factory pour y découvrir tous les objets &laquo;&nbsp;instanciables&nbsp;&raquo; et fournir à l&#8217;utilisateur un panel de boutons pour créer des Shapes.<br />
A partir de là, à chaque Shape créé, elle pourra construire une boîte de dialogue d&#8217;édition adaptée à l&#8217;objet (à la mode 3DS), SANS en connaitre le type réel.</p>
<h2>Pour aller plus loin :</h2>
<p style="text-align: justify;">Il est possible de s&#8217;abstraire de l&#8217;écriture de la fonction create statique dans les classes en utilisant les templates pour créer des objets dont le rôle est de remplacer la fonction statique.</p>
<p style="text-align: justify;">A l&#8217;utilisation cela donne quelque chose comme :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p164code38'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p16438"><td class="code" id="p164code38"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">bool</span> Shape<span style="color: #008080;">::</span><span style="color: #0000ff;">register</span> <span style="color: #000080;">=</span> shapeFactory.<span style="color: #0000ff;">register</span> <span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Shape&quot;</span>, Creator<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Il faut pour cela modifier un peu la classe factory, mais je vous le laisse en exercice <img src='http://www.coder-studio.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  (j&#8217;ai toujours révé de dire ça un jour&#8230;)</p>
<p style="text-align: justify;">Dernier point, on peut utiliser les singleton pour ne pas avoir à stocker la factory dans une variable globale.</p>
<p><span style="color: #ff0000;"><strong>joyeuses fetes <img src='http://www.coder-studio.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </strong></span></p>
<p><strong>Twxs</strong></p>
<blockquote><p>Cet article provient du tutorial publié par Twxs le 24/12/2004 sur l&#8217;ancien site de Coder-Studio.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.coder-studio.com/blog/la-factory/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Le design pattern Observer/Observable en C++</title>
		<link>http://www.coder-studio.com/blog/le-design-pattern-observer-observable-en-c/</link>
		<comments>http://www.coder-studio.com/blog/le-design-pattern-observer-observable-en-c/#comments</comments>
		<pubDate>Wed, 03 Nov 2004 17:32:25 +0000</pubDate>
		<dc:creator>twxs</dc:creator>
				<category><![CDATA[C & C++]]></category>
		<category><![CDATA[design pattern]]></category>

		<guid isPermaLink="false">http://r19649.ovh.net/cs/blog/?p=156</guid>
		<description><![CDATA[Ce tutorial a pour but de proposer une implementation en C++ du patron de conception Observer / Observable. Comme il s&#8217;agit a la base d&#8217;un patron de conception, il en existe par definition beaucoup d&#8217;implementations specifiques au domaine.
Ici nous allons proposer une implementation &#171;&#160;generique&#160;&#187; qui sera utilisable dans la majorite des cas.

Introduction
La relation Observer/Observable est [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Ce tutorial a pour but de proposer une implementation en C++ du patron de conception Observer / Observable. Comme il s&#8217;agit a la base d&#8217;un patron de conception, il en existe par definition beaucoup d&#8217;implementations specifiques au domaine.<br />
Ici nous allons proposer une implementation &laquo;&nbsp;generique&nbsp;&raquo; qui sera utilisable dans la majorite des cas.</p>
<p><span id="more-156"></span></p>
<h2>Introduction</h2>
<p style="text-align: justify;">La relation Observer/Observable est un concept assez simple, le principe repose sur le fait de pouvoir informer automatiquement des objets (Observeurs) des modification d&#8217;un autre (l&#8217;Observable). Nous prendrons comme cas &laquo;&nbsp;d&#8217;école&nbsp;&raquo; l&#8217;exemple d&#8217;un VU mètre system. On supposera avoir une classe <span style="color: #ff0000;">CPU </span>permettant de connaitre la charge cpu, une classe <span style="color: #ff0000;">FileSystem</span> donnant accès aux informations concernant les disques et enfin, une classe charger d&#8217;afficher l&#8217;état de notre machine i.e. la charge CPU et l&#8217;occupation des disques.</p>
<p style="text-align: justify;"><strong>La classe Observer</strong><br />
L&#8217;observer est un objet &laquo;&nbsp;simple&nbsp;&raquo;, être observeur defini uniquement le fait de pouvoir être mis a jour par un objet extérieur. Ceci se traduit par avoir une méthode de type <span style="color: #ff0000;">update</span>.<br />
Ceci nous mène à une premiere définition de l&#8217;interface Observer :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p156code50'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15650"><td class="code" id="p156code50"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">struct</span> Observer <span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> update<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Rendre un objet observateur d&#8217;un sujet, se traduira alors par une implémentation de cette interface. ex :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p156code51'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15651"><td class="code" id="p156code51"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> VUMeter <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> Observer <span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">void</span> update<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// mis a jour car un sujet a changé d'etat</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">La première limitation de cette proposition vient du fait que l&#8217;on ne prend pas en compte le type du sujet observe dans l&#8217;interface. Ceci a l&#8217;utilisation, obligera en plus d&#8217;hériter de l&#8217;interface, de stocker dans ses attributs une référence au sujet. ex :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p156code52'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15652"><td class="code" id="p156code52"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> VUMeter <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> Observer<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">private</span> <span style="color: #008080;">:</span>
  Subject <span style="color: #000040;">*</span>subjet<span style="color: #008080;">;</span>
<span style="color: #0000ff;">public</span> <span style="color: #008080;">:</span>
  <span style="color: #0000ff;">void</span> update<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// subject a change</span>
    subject<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>getValues<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>...
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">une première solution, est de passer en paramètre la classe Observable dans la méthode update.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p156code53'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15653"><td class="code" id="p156code53"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> update<span style="color: #008000;">&#40;</span>Observable <span style="color: #000040;">*</span>subject<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">//</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">cette solution est presque viable, mais va obliger :</p>
<ul>
<li> soit a implementer dans l&#8217;observable, une interface generique pour récuperer les information d&#8217;un sujet &laquo;&nbsp;abstrait&nbsp;&raquo;. Il nous faudra récuperer la charge CPU, l&#8217;occupation du disque&#8230;</li>
<li> soit a &laquo;&nbsp;dynamic_caster&nbsp;&raquo; le sujet de type Observable en son reel type</li>
</ul>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p156code54'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15654"><td class="code" id="p156code54"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> update<span style="color: #008000;">&#40;</span>Observable <span style="color: #000040;">*</span>subjet<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>CPU <span style="color: #000040;">*</span>cpu <span style="color: #000080;">=</span> <span style="color: #0000ff;">dynamic_cast</span><span style="color: #008000;">&#40;</span>subject<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
     cpu<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>getLoad<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>...
  <span style="color: #008000;">&#125;</span>
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>FileSystem<span style="color: #000040;">*</span> fs <span style="color: #000080;">=</span> <span style="color: #0000ff;">dynamic_cast</span><span style="color: #008000;">&#40;</span>subject<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
    fs<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>getFreeSpace<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Cette solution n&#8217;est pas des plus élegantes. Une derniere alternative plus &laquo;&nbsp;propre&nbsp;&raquo; serait de posseder une méthode update prenant en paremetre un CPU* et une autre prenant un FileSystem*</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p156code55'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15655"><td class="code" id="p156code55"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> update<span style="color: #008000;">&#40;</span>FileSystem<span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">void</span> update<span style="color: #008000;">&#40;</span>CPU<span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Cette solution nous garantie une separation propre du code. Pour l&#8217;implementer, nous allons devoir passer par l&#8217;utilisation de template. Le principe : spécifier le type reel observé dans l&#8217;interface <span style="color: #ff0000;">Observer</span></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p156code56'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15656"><td class="code" id="p156code56"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span>
<span style="color: #0000ff;">struct</span>  Observer<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> update<span style="color: #008000;">&#40;</span>Subject <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>Et voici maintenant l&#8217;utilisation :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p156code57'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15657"><td class="code" id="p156code57"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> VUMeter <span style="color: #008080;">:</span>
  <span style="color: #0000ff;">public</span> Observer,
  <span style="color: #0000ff;">public</span> Observer<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
  <span style="color: #0000ff;">void</span> update<span style="color: #008000;">&#40;</span>FileSystem<span style="color: #000040;">*</span> fs<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
    fs<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>getFreeSpace<span style="color: #008000;">&#40;</span>...
  <span style="color: #008000;">&#125;</span>
  <span style="color: #0000ff;">void</span> update<span style="color: #008000;">&#40;</span>CPU<span style="color: #000040;">*</span> cpu<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
    cpu<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>...
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Et voila le travail, nous avons un observeur capable d&#8217;observer plusieurs sujets. Ils nous reste a implémenter l&#8217;autre partie : l&#8217;<strong>Observable</strong></p>
<p style="text-align: justify;"><strong>La classe Observable</strong><br />
Nous devons ici definir la classe de laquelle vont deriver CPU et FileSystem pour être observable. Les besoins d&#8217;un Observable sont :</p>
<ul>
<li> lui attacher un observateur</li>
<li> le détacher</li>
<li> notifier tous les observateurs</li>
<li> stocker ses observateurs</li>
</ul>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p156code58'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15658"><td class="code" id="p156code58"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> Observable<span style="color: #008000;">&#123;</span>
  std<span style="color: #008080;">::</span><span style="color: #007788;">set</span> _observers<span style="color: #008080;">;</span>
  <span style="color: #0000ff;">void</span> attach<span style="color: #008000;">&#40;</span>Observer <span style="color: #000040;">*</span>o<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// insertion dans le set</span>
  <span style="color: #0000ff;">void</span> detach<span style="color: #008000;">&#40;</span>Observer <span style="color: #000040;">*</span>o<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// suppression du set</span>
  <span style="color: #0000ff;">void</span> notify<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span> <span style="color: #666666;">// updater tous les observers dans le set</span>
    ...
      <span style="color: #007788;">obs</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>update<span style="color: #008000;">&#40;</span>...<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Cette implémentation ne fonctionne pas a cause de la &laquo;&nbsp;templatisation&nbsp;&raquo; de la class Observer qui prend, déjà, pour la méthode update le type réel du sujet (ex : FileSystem) mais aussi par le fait que les observeurs n&#8217;héritent pas de Observer, mais Observer.<br />
Dans la classe Obserable, nous devons donc connaitre le type reel du sujet.<br />
Encore une fois les template vont permettre de nous en sortir :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p156code59'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15659"><td class="code" id="p156code59"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span>  <span style="color: #0000ff;">class</span> Observable
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
  ~Observable<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">void</span> attach<span style="color: #008000;">&#40;</span>Observer <span style="color: #000040;">*</span>o<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">void</span> detach<span style="color: #008000;">&#40;</span>Observer <span style="color: #000040;">*</span>o<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">void</span> notify<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
  std<span style="color: #008080;">::</span><span style="color: #007788;">set</span><span style="color: #000080;">&lt;</span>Observer <span style="color: #000040;">*</span><span style="color: #000080;">&gt;</span> _observers<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>A l&#8217;utilisation, ceci donne :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p156code60'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15660"><td class="code" id="p156code60"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> FileSystem <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> Observable<span style="color: #008000;">&#123;</span>
   ...
   <span style="color: #0000ff;">void</span> some_func<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
     ...
     <span style="color: #007788;">notify</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// on change d'etat, informer les observateurs</span>
   <span style="color: #008000;">&#125;</span>
   ...
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
VUMeter vum<span style="color: #008080;">;</span>
&nbsp;
FileSystem fs<span style="color: #008080;">;</span>
CPU cpu<span style="color: #008080;">;</span>
&nbsp;
cpu.<span style="color: #007788;">attach</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>vum<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
fs.<span style="color: #007788;">attach</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>vum<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>Et Voilà, c&#8217;est fini!</p>
<blockquote><p>Cet article provient du tutorial publié par Twxs le 03/11/2004 sur l&#8217;ancien site de Coder-Studio.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.coder-studio.com/blog/le-design-pattern-observer-observable-en-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Introduction des RAII en OpenGL</title>
		<link>http://www.coder-studio.com/blog/introduction-des-raii-en-opengl/</link>
		<comments>http://www.coder-studio.com/blog/introduction-des-raii-en-opengl/#comments</comments>
		<pubDate>Sun, 03 Oct 2004 17:07:45 +0000</pubDate>
		<dc:creator>twxs</dc:creator>
				<category><![CDATA[C & C++]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[RAII]]></category>

		<guid isPermaLink="false">http://r19649.ovh.net/cs/blog/?p=137</guid>
		<description><![CDATA[Ce tutoriel introduit l&#8217;utilisation des RAII (Ressource Aquisition Is Initialisation) en OpenGL. Un point clef en opengl est de conserver la &#171;&#160;machine à états&#160;&#187; propre. L&#8217;utilisation de RAII va permettre de faciliter cette gestion et également de clarifier le code.
Prenons un exemple:

?View Code CglEnable&#40;flag&#41;;
....
glDisable&#40;flag&#41;;

C&#8217;est ici l&#8217;utilisation normale d&#8217;opengl. Rien de compliqué mais c&#8217;est exactement ce [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Ce tutoriel introduit l&#8217;utilisation des RAII (Ressource Aquisition Is Initialisation) en OpenGL. Un point clef en opengl est de conserver la &laquo;&nbsp;machine à états&nbsp;&raquo; propre. L&#8217;utilisation de RAII va permettre de faciliter cette gestion et également de clarifier le code.</p>
<p><span id="more-137"></span>Prenons un exemple:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code72'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13772"><td class="code" id="p137code72"><pre class="c" style="font-family:monospace;">glEnable<span style="color: #009900;">&#40;</span>flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
....
<span style="color: #202020;">glDisable</span><span style="color: #009900;">&#40;</span>flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">C&#8217;est ici l&#8217;utilisation normale d&#8217;opengl. Rien de compliqué mais c&#8217;est exactement ce qu&#8217;on veut éviter pour ne pas alourdir le code&#8230;</p>
<h2>Un premier pas vers le RAII</h2>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code73'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13773"><td class="code" id="p137code73"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> Enable<span style="color: #009900;">&#123;</span>
   Enable<span style="color: #009900;">&#40;</span>GLenum flag<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      glEnable<span style="color: #009900;">&#40;</span>flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   ~Enable<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      glDisable<span style="color: #009900;">&#40;</span>flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Puis on l&#8217;utilise dans un bloc, comme suit :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code74'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13774"><td class="code" id="p137code74"><pre class="c" style="font-family:monospace;"><span style="color: #009900;">&#123;</span>
   Enable active<span style="color: #009900;">&#40;</span>flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   ...
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Comme on peut le voir ici, Le principe est très simple : Lors de la création de l&#8217;instance de la structure Enable, on execute via le constructeur la commande opengl glEnable(). Lorsque l&#8217;on sort de la zone de portée de cette instance (ici, le bloc {}), elle est détruite. Il y a donc appel du destructeur dans lequel on a placé la commande glDisable().</p>
<h2>Conservation et propreté</h2>
<p style="text-align: justify;">Cette première version fonctionne, mais imaginons qu&#8217;avant le bloc le flag soit deja activé : à la sortie il sera desactivé. Pour s&#8217;assurer de la récuperation d&#8217;un contexte identique, nous devons modifier notre classe pour mémoriser l&#8217;etat courant avant sa modification.</p>
<p>On procède de cette manière :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code75'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13775"><td class="code" id="p137code75"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> Enable <span style="color: #009900;">&#123;</span>
&nbsp;
   GLboolean state<span style="color: #339933;">;</span>
   Enable<span style="color: #009900;">&#40;</span>GLenum flag<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      state <span style="color: #339933;">=</span> glIsEnable<span style="color: #009900;">&#40;</span>flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #666666; font-style: italic;">// State contient l'état actuel du flag</span>
      <span style="color: #666666; font-style: italic;">// Si le flag est deja activé il n'est pas necessaire de le réactiver</span>
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>state<span style="color: #009900;">&#41;</span>
         glEnable<span style="color: #009900;">&#40;</span>flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   ~Enable<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #666666; font-style: italic;">// Si le flag était désactivé à la création de la classe on le désactive à nouveau</span>
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>state<span style="color: #009900;">&#41;</span>
         glDisable<span style="color: #009900;">&#40;</span>flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Ici nous sommes : L&#8217;utilisation de l&#8217;objet conserve le contexte opengl.</p>
<h2>Cas d&#8217;usage : factorisation du code à l&#8217;aide des templates</h2>
<p>Prenons le cas suivant :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code76'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13776"><td class="code" id="p137code76"><pre class="c" style="font-family:monospace;"><span style="color: #009900;">&#123;</span>
   Enable lighting<span style="color: #009900;">&#40;</span>GL_LIGHTING<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   Enable light0<span style="color: #009900;">&#40;</span>GL_LIGHT0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   Enable depth<span style="color: #009900;">&#40;</span>GL_DEPTH_TEST<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #666666; font-style: italic;">// ...code</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Supposons que ces trois appels reviennnent régulierement : l&#8217;héritage multiple devrait nous permettre de factoriser ce code en regroupant le tout en une seule et même classe. Mais le probleme ici, c&#8217;est que nous avons une unique classe pour tous les états. Comme nous ne pouvons pas heriter plusiseurs fois de la même classe, il va falloir trouver une autre solution.</p>
<p style="text-align: justify;">Et celle qui s&#8217;y prête le mieux reste l&#8217;utilisation de templates :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code77'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13777"><td class="code" id="p137code77"><pre class="c" style="font-family:monospace;">template <span style="color: #993333;">struct</span> Enable <span style="color: #009900;">&#123;</span>
   GLboolean state<span style="color: #339933;">;</span>
   Enable<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//plus de paramètre au constructeur</span>
      state <span style="color: #339933;">=</span> glIsEnable<span style="color: #009900;">&#40;</span>Flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #666666; font-style: italic;">// state contiend l'etat actuel du flag</span>
      <span style="color: #666666; font-style: italic;">// si le flag est deja active il 'est pas necessaire de le reactiver</span>
&nbsp;
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>state<span style="color: #009900;">&#41;</span>
          glEnable<span style="color: #009900;">&#40;</span>Flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   ~Enable<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>state<span style="color: #009900;">&#41;</span>
      glDisable<span style="color: #009900;">&#40;</span>Flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">En &laquo;&nbsp;templetant&nbsp;&raquo; la classe Enable, nous obtenons une classe différente pour chaque paramètre du template, et donc pour chaque flag.</p>
<p style="text-align: justify;">Au niveau de l&#8217;utilisation,</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code78'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13778"><td class="code" id="p137code78"><pre class="c" style="font-family:monospace;">Enable depth<span style="color: #009900;">&#40;</span>GL_DEPTH_TEST<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>deviendra :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code79'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13779"><td class="code" id="p137code79"><pre class="c" style="font-family:monospace;">Enable depth<span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Mais surtout, ceci va nous permettre de factoriser des états.<br />
Reprenons les trois appels redondant de notre programme :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code80'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13780"><td class="code" id="p137code80"><pre class="c" style="font-family:monospace;">Enable lighting<span style="color: #339933;">;</span>
Enable light0<span style="color: #339933;">;</span>
Enable depth<span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>En templatant, on peut créer une structure héritant de chaque classe :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code81'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13781"><td class="code" id="p137code81"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> MonContext <span style="color: #339933;">:</span>
   Enable <span style="color: #339933;">,</span>
   Enable <span style="color: #339933;">,</span>
   Enable
<span style="color: #009900;">&#123;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Nous obtenons une structure ayant les propriétés de 3 classes parents. Et surtout, à la creation de l&#8217;objet les 3 constructeurs des parents seront appelés, et réciproquement à la destruction.<br />
On peut donc se contenter de ceci :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code82'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13782"><td class="code" id="p137code82"><pre class="c" style="font-family:monospace;"><span style="color: #009900;">&#123;</span>
   MonContext ctx_light<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h2>Conclusion</h2>
<p>Voilà pour l&#8217;utilisation des RAII : Rien de très complexe dans la théorie ou dans la pratique. C&#8217;est par contre un puissant outil qui devrait rapidement devenir indispensable à la clarté de tout programme conséquent.<br />
<strong>Un grand merci à Twxs pour ce tuto !</strong></p>
<blockquote><p>Cet article provient du tutorial publié par Twxs le 03/10/2004 sur l&#8217;ancien site de Coder-Studio.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.coder-studio.com/blog/introduction-des-raii-en-opengl/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
