<?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>Horizon .Net</title>
	<atom:link href="https://blog.developpez.com/phertzog/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/phertzog</link>
	<description></description>
	<lastBuildDate>Sun, 11 Apr 2010 11:22:57 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Démarche TDD &#8211; Une première tentative &#8211; Partie 3</title>
		<link>https://blog.developpez.com/phertzog/p8601/developpement/demarche_tdd_une_premiere_tentative_part_3</link>
		<comments>https://blog.developpez.com/phertzog/p8601/developpement/demarche_tdd_une_premiere_tentative_part_3#comments</comments>
		<pubDate>Sun, 11 Apr 2010 11:22:57 +0000</pubDate>
		<dc:creator><![CDATA[phertzog]]></dc:creator>
				<category><![CDATA[Developpement]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Les 2 articles précédents nous ont permis de construire une méthode de recherche d&#8217;un équilibrium qui semble fonctionner correctement. Par correctement j&#8217;entends qui trouve le bon équilibrium dans tous les cas que nous avons analysé pour l&#8217;instant. Démarche TDD &#8211; Une première tentative &#8211; Part 1 Démarche TDD &#8211; Une première tentative &#8211; Part 2 Cette dernière partie va se concentrer sur une autre utilisation des tests unitaires Contrainte supplémentaire Notre petite implémentation de l&#8217;équilibirum [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Les 2 articles précédents nous ont permis de construire une méthode de recherche d&rsquo;un équilibrium qui semble fonctionner correctement. Par correctement j&rsquo;entends qui trouve le bon équilibrium dans tous les cas que nous avons analysé pour l&rsquo;instant.</p>
<p><a href="http://blog.developpez.com/phertzog/p8529/developpement/tdd/demarche-tdd-andash-une-premiere-tentati/#more8529" target="_blank">Démarche TDD &#8211; Une première tentative &#8211; Part 1</a></p>
<p><a href="http://blog.developpez.com/phertzog/p8553/developpement/tdd/demarche-tdd-une-premiere-tentative-part-2/#more8553" target="_blank">Démarche TDD &#8211; Une première tentative &#8211; Part 2</a></p>
<p>Cette dernière partie va se concentrer sur une autre utilisation des tests unitaires</p>
<p><span id="more-1"></span></p>
<h3></h3>
<h3>Contrainte supplémentaire</h3>
<p>Notre petite implémentation de l&rsquo;équilibirum a été adoptée pour être incluse dans un projet en production. Super, il est toujours agréable de voir son travail utilisé. Par contre, dans le cadre de l&rsquo;application, il est demandé que notre méthode soit capable de trouver l&rsquo;équilibrium d&rsquo;un tableau de 25000 éléments en moins de 0.5 secondes. Nous allons donc mettre en place un test unitaire en utilisant l&rsquo;attribut &laquo;&nbsp;TimeOut&nbsp;&raquo; du test. Pour jouer la sécurité nous allons nous placer dans une situation un peu plus défavorable :</p>
<ol>
<li>Le tableau aura 50000 éléments. </li>
<li>L&rsquo;équilibrium sera en fin de tableau (ce qui nous obligera à faire le plus de calculs). </li>
</ol>
<h4>Le test</h4>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">[TestMethod]<br />[Timeout(500)]<br /><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> BigArray_TestMustBeFast()<br />{<br />    <span style="color: #008000">//Construire un tableau non symétrique</span><br />    <span style="color: #0000ff">int</span> total = 0;<br />    <span style="color: #0000ff">int</span>[] bigArray = <span style="color: #0000ff">new</span> <span style="color: #0000ff">int</span>[50002];<br />    <span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i = 0; i <code class="codecolorer text default"><span class="text">&lt;</span></code> 50000; i++)<br />    {<br />        bigArray[i] = 1;<br />        total += 1;<br />    }<br />    bigArray[50000] = 0;<br />    bigArray[50001] = total;            <br /><br />    <span style="color: #0000ff">int</span> actual = Problems.Equilibrium.Equilibrium.FindEquilibrium(bigArray);<br /><br />    Assert.AreEqual(50000, actual, <span style="color: #006080">"Equilibrium non trouvé. {0} au lieu de la valeur attendue"</span>, actual);<br /><br />}</pre>
<p></div>
<p>Plein de confiance nous relançons le test &#8230; pour découvrir qu&rsquo;il échoue en &laquo;&nbsp;time out&nbsp;&raquo; <img src="https://blog.developpez.com/phertzog/wp-includes/images/smilies/icon_sad.gif" alt=":-(" class="wp-smiley" /> Il va falloir retravailler notre code.</p>
<h4></h4>
<h4>Le code</h4>
<p>Allons analyser notre code. Je pense que vous avez tous assez rapidement trouvé la source de notre problème. Notre algorithme naïf à une complexité en O(n2). En effet nous avons imbriqué 2 boucles :</p>
<ol>
<li>La boucle principale qui parcoure tous les éléments. </li>
<li>Les 2 boucles internes qui calculent la somme gauche et la somme droite en parcourant également tout le tableau. </li>
</ol>
<p>Si nous voulons gagner en performance, il faut trouver un algorithme plus efficace. Je vous laisse un peu de temps?</p>
<p>En fait la solution est relativement simple en prenant un peu de recul. au lieu de repartir de 0 à chaque fois, nous allons tout simplement mettre à jour les sommes gauche et droite. L&rsquo;algorithme de base est le suivant :</p>
<ol>
<li>Etape 1 : i=0, sommeGauche = 0, sommeDroite = Somme(Valeur(1) à Valeur(n) ) ou n est le dernier élément du tableau </li>
<li>Etape 2 : i=1, sommeGauche = sommeGauche + Valeur(0), sommeDroite = sommeDroite ? Valeur(1) </li>
<li>Et ainsi de suite jusqu&rsquo;à avoir trouvé un équilibrium ou avoir atteint la fin du tableau </li>
</ol>
<p>Avec cet algorithme, la complexité tombe à O(n). En effet le temps d&rsquo;exécution augmente linéairement avec la taille du tableau. Le code optimisé est le suivant</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">int</span> FindEquilibriumOptimized(<span style="color: #0000ff">int</span>[] inputArray)<br />{<br />    <span style="color: #0000ff">if</span> ((inputArray == <span style="color: #0000ff">null</span>) || (inputArray.Length == 0))<br />    {<br />        <span style="color: #0000ff">return</span> -1;<br />    }<br />    <span style="color: #0000ff">else</span><br />    {<br />        <span style="color: #0000ff">long</span> leftSum = 0;<br />        <span style="color: #0000ff">long</span> rightSum = 0;<br />        <span style="color: #0000ff">int</span> equilibrium = 0;<br /><br />        <span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i = 1; i <code class="codecolorer text default"><span class="text">&lt;</span></code> inputArray.Length; i++)<br />        {<br />            rightSum += inputArray[i];<br />        }<br /><br />        <span style="color: #0000ff">if</span> (leftSum == rightSum)<br />        {<br />            <span style="color: #0000ff">return</span> equilibrium;<br />        }<br />        <span style="color: #0000ff">else</span><br />        {<br />            <span style="color: #0000ff">for</span> (equilibrium = 1; equilibrium <code class="codecolorer text default"><span class="text">&lt;</span></code> inputArray.Length; equilibrium++)<br />            {<br />                leftSum += inputArray[equilibrium - 1];<br />                rightSum -= inputArray[equilibrium];<br /><br />                <span style="color: #0000ff">if</span> (leftSum == rightSum)<br />                {<br />                    <span style="color: #0000ff">return</span> equilibrium;<br />                }<br />            }<br />        }<br />        <span style="color: #0000ff">return</span> -1;<br />    }<br />}</pre>
<p></div>
<p>On croise les doigts, on relance le test et &#8230; le test passe en largement moins de 2 secondes. En fait, si l&rsquo;on compare les 2 algorithmes on obtient les temps suivants :</p>
<ul>
<li>Algorithme long : 11.8950 ms </li>
<li>Algorithme court : 0.0291 ms </li>
</ul>
<h4>Conclusion</h4>
<p>Et voila, c&rsquo;était la dernière partie de cette mini série sur mes premiers pas dans l&rsquo;utilisation des tests unitaires avec Visual Studio (et dans la rédaction de billets par la même occasion). J&rsquo;espère que cela aura pu servir à quelqu&rsquo;un. Je suis preneur pour d&rsquo;éventuelle remarques sur le fond ou la forme.</p>
<p>Bonne programmation et vivez heureux et prospère.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trucs &amp; Astuces &#8211; 001 &#8211; Adresses email aléatoires</title>
		<link>https://blog.developpez.com/phertzog/p8724/trucs-et-astuces/trucs_aamp_astuces_andash_001_andash_adr</link>
		<comments>https://blog.developpez.com/phertzog/p8724/trucs-et-astuces/trucs_aamp_astuces_andash_001_andash_adr#comments</comments>
		<pubDate>Sat, 13 Mar 2010 23:33:46 +0000</pubDate>
		<dc:creator><![CDATA[phertzog]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Trucs et Astuces]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Le but de la série de billets &#171;&#160;Trucs et Astuces&#160;&#187; est de partager les petits problèmes courants que j&#8217;ai rencontré dans mon activité journalière et de montrer la solution à laquelle j&#8217;ai aboutie. A chaque fois j&#8217;essaie de présenter la solution la plus simple que j&#8217;ai trouvée, ce qui ne signifie pas forcément qu&#8217;il s&#8217;agit de la meilleure. Le problème   Récemment j&#8217;ai du écrire une série de tests d&#8217;intégration automatisés. Ces tests impliquaient la [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><font size="2" face="Georgia"></font><font size="2" face="Georgia"><em>Le but de la série de billets &laquo;&nbsp;Trucs et Astuces&nbsp;&raquo; est de partager les petits problèmes courants que j&rsquo;ai rencontré dans mon activité journalière et de montrer la solution à laquelle j&rsquo;ai aboutie. A chaque fois j&rsquo;essaie de présenter la solution la plus simple que j&rsquo;ai trouvée, ce qui ne signifie pas forcément qu&rsquo;il s&rsquo;agit de la meilleure.</em>       <br /></font></p>
<h1>Le problème</h1>
<p>  <br />Récemment j&rsquo;ai du écrire une série de tests d&rsquo;intégration automatisés. Ces tests impliquaient la création de nombreux profiles. Le critère d&rsquo;unicité des profiles était l&rsquo;adresse email. Les tests accédaient à un référentiel et je devais donc trouver une solution pour créer de manière sûre des adresses uniques (pour ne pas avoir d&rsquo;échecs du à des données existantes dans le référentiel).     </p>
<h1>La solution</h1>
<p>J&rsquo;ai d&rsquo;abord pensé à utiliser des GUIDs, mais cette solution ne me convenait pas. En effet le format des GUID impliquait de devoir les retravailler afin d&rsquo;obtenir une adresse valide. En cherchant il y avait une solution plus simple.</p>
<p>J&rsquo;ai utilisé la méthode Path.GetRandomFileName() dans l&rsquo;espace de nom &laquo;&nbsp;System.IO&nbsp;&raquo;. Comme la <a href="http://msdn.microsoft.com/en-us/library/system.io.path.getrandomfilename.aspx" target="_blank">msdn documentation</a> oublie de le dire, cette méthode génère des chaines au format 8.3 (par exemple la3taras.ovb ). Ainsi la création d&rsquo;une adresse est devenu aussi simple que le code suivant :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 128.6%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; height: 56px; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">profile.Email = <span style="color: #0000ff">string</span>.Format(<span style="color: #006080">"{0}@acme.com"</span>, Path.GetRandomFileName());</pre>
<p></div>
<p> </p>
<p>Joyeuse programmation et Longue vie et prospérité.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Démarche TDD &#8211; Une première tentative &#8211; Partie 2</title>
		<link>https://blog.developpez.com/phertzog/p8553/developpement/demarche_tdd_une_premiere_tentative_part_2</link>
		<comments>https://blog.developpez.com/phertzog/p8553/developpement/demarche_tdd_une_premiere_tentative_part_2#comments</comments>
		<pubDate>Sun, 07 Feb 2010 14:46:50 +0000</pubDate>
		<dc:creator><![CDATA[phertzog]]></dc:creator>
				<category><![CDATA[Developpement]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ce billet est la suite de mon exploration de la démarche TDD appliquée au problème de recherche de l&#8217;équilibrium. La première partie (qui décrit aussi en quoi consiste la recherche de l&#8217;équilibrium)  peut être trouvée sur mon blog : Démarche TDD &#8211; Une première tentative Lors du dernier billet, nous en étions resté aux cas basiques. Voyons maintenant d&#8217;autres tests qui vont nous permettre d&#8217;arriver à une solution complète. Cas du tableau à 2 éléments [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ce billet est la suite de mon exploration de la démarche TDD appliquée au problème de recherche de l&rsquo;équilibrium. La première partie (qui décrit aussi en quoi consiste la recherche de l&rsquo;équilibrium)  peut être trouvée sur mon blog :</p>
<p><a href="http://blog.developpez.com/phertzog/p8529/developpement/tdd/demarche-tdd-andash-une-premiere-tentati/#more8529" target="_blank">Démarche TDD &#8211; Une première tentative</a></p>
<p>Lors du dernier billet, nous en étions resté aux cas basiques. Voyons maintenant d&rsquo;autres tests qui vont nous permettre d&rsquo;arriver à une solution complète.</p>
<p><span id="more-3"></span><br />
<h3>Cas du tableau à 2 éléments</h3>
<p>Dans le cas d&rsquo;un tableau à 2 éléments, il y aura un équilibrium si et seulement si il y a au moins un des 2 éléments qui est égal à 0. Le cas ou les 2 éléments sont à 0 est particulier car il repose sur notre convention de prendre l&rsquo;équilibrium le plus petit en cas de plusieurs équilibriums. On a dons les cas suivants:</p>
<ul>
<li>i &#8211; 0 => 0 </li>
<li>0 &#8211; j => 1 </li>
<li>i &#8211; j => -1 </li>
<li>0 &#8211; 0 => 0 </li>
</ul>
<p>avec i != 0 et j != 0.</p>
<h4></h4>
<h4>Test 04</h4>
<p>Au lieu d&rsquo;écrire 4 tests séparés, nous allons utiliser une fonctionnalité des tests MS Tests qui permet de fournir un jeu de données et de réponses en entrée du test. Le test sera donc exécuté autant de fois qu&rsquo;il y a de jeux de données. Dans notre cas la source en entrée est un fichier XML. Les autres possibilités offertes sont un fichier CSV soit une base de donnée. Voici le fichier de tests (désolé pour l&rsquo;affichage, je n&rsquo;ai pas réussi à le rendre plus lisible sur le blog) :  </p>
<p> <code class="codecolorer text default"><span class="text">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;&lt;tests&gt;&lt;test&gt;&lt;name&gt;0-0&lt;/name&gt; &lt;data&gt;0,0&lt;/data&gt; &lt;expected&gt;0&lt;/expected&gt; &lt;/test&gt;&lt;test&gt;&lt;name&gt;1-0&lt;/name&gt; &lt;data&gt;1,0&lt;/data&gt; &lt;expected&gt;0&lt;/expected&gt; &lt;/test&gt;&lt;test&gt;&lt;name&gt;0-1&lt;/name&gt; &lt;data&gt;0,-1&lt;/data&gt; &lt;expected&gt;1&lt;/expected&gt; &lt;/test&gt;&lt;test&gt;&lt;name&gt;1-1&lt;/name&gt; &lt;data&gt;1,1&lt;/data&gt; &lt;expected&gt;-1&lt;/expected&gt; &lt;/test&gt;&lt;/tests&gt;</span></code><br />
<h4></h4>
<h4>Le Test</h4>
<p>Le test en lui même est assez simple    </p>
</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 400px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">[DeploymentItem(<span style="color: #006080">"ProblemsTests\\Equilibrium\\TestsData\\2_Elelments_Arrays.xml"</span>), DataSource(<span style="color: #006080">"Microsoft.VisualStudio.TestTools.DataSource.XML"</span>, <span style="color: #006080">"|DataDirectory|\\2_Elelments_Arrays.xml"</span>, <span style="color: #006080">"test"</span>, DataAccessMethod.Sequential), TestMethod]       <br /><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Simple_Array_With_2_Elements()<br />{<br />    <span style="color: #0000ff">string</span>[] input = TestContext.DataRow[1].ToString().Split(<span style="color: #0000ff">new</span> <span style="color: #0000ff">char</span>[]{<span style="color: #006080">','</span>});<br />    <span style="color: #0000ff">int</span>[] inputArray = Array.ConvertAll<code class="codecolorer text default"><span class="text">&lt;</span></code><span style="color: #0000ff">string</span>, <span style="color: #0000ff">int</span><code class="codecolorer text default"><span class="text">&gt;</span></code>(input, <span style="color: #0000ff">delegate</span>(<span style="color: #0000ff">string</span> s) { <span style="color: #0000ff">return</span> <span style="color: #0000ff">int</span>.Parse(s); });<br />    <span style="color: #0000ff">int</span> expected = Convert.ToInt32(TestContext.DataRow[2]);<br />    <span style="color: #0000ff">int</span> actual;<br /><br />    actual = Problems.Equilibrium.Equilibrium.FindEquilibrium(inputArray);<br /><br />    Assert.AreEqual(expected, actual,<span style="color: #006080">"Test failed for case {0}"</span>, TestContext.DataRow[0]);<br />}</pre>
<p></div>
<p>On remarque quelques nouveautés par rapport au tests précédents.</p>
<ol>
<li>Le nom de la méthode est décoré avec &laquo;&nbsp;DeploymentItem&nbsp;&raquo; qui indique ou se trouve le fichier xml source et d&rsquo;autres  paramètres. Ceci permet d&rsquo;indiquer que nous avons un test &laquo;&nbsp;dirigé par les données&nbsp;&raquo; ou &laquo;&nbsp;data driven test&nbsp;&raquo;. Pour plus de détails concernant la façon de mettre cela en place je vous renvoie au blog suivant :<br />
    <br /><a href="http://blogs.developpeur.org/azra/archive/2007/10/14/vs-2008-jeux-de-donn-es-xml-et-csv-pour-tests-unitaires.aspx" target="_blank">|VS 2008] Jeux de données XML et CSV pour tests unitaires</a> </li>
<li>Le tableau en entrée et créé à partir de la valeur du noeud &laquo;&nbsp;data&nbsp;&raquo; que nous convertissons en tableau d&rsquo;entiers grâce à &laquo;&nbsp;Array.ConvertAll&nbsp;&raquo;. </li>
<li>Le résultat attendu est lu à partir du noeud &laquo;&nbsp;expected&nbsp;&raquo;. </li>
</ol>
<p>En exécutant le test on a un échec car les cas 3 et 4 ne sont pas correct (ce qui est logique puisque notre implémentation actuelle ne retourne que la valeur 0 pour un tableau non nul. Corrigeons donc notre code?</p>
<h4></h4>
<h4>Le code</h4>
<p>Voici une première version du code qui passe tous les tests et qui est naïvement simple. </p>
<blockquote>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">int</span> FindEquilibrium(<span style="color: #0000ff">int</span>[] inputArray)<br />{<br />    <span style="color: #0000ff">if</span> ((inputArray == <span style="color: #0000ff">null</span>) || (inputArray.Length == 0))<br />    {<br />        <span style="color: #0000ff">return</span> -1;<br />    }<br />    <span style="color: #0000ff">else</span><br />    {<br />        <span style="color: #0000ff">if</span> (inputArray.Length == 1)<br />        {<br />            <span style="color: #0000ff">return</span> 0;<br />        }<br />        <span style="color: #0000ff">else</span><br />        {<br />            <span style="color: #0000ff">if</span> (inputArray[1] == 0)<br />            {<br />                <span style="color: #0000ff">return</span> 0;<br />            }<br />            <span style="color: #0000ff">else</span> <span style="color: #0000ff">if</span> (inputArray[0] == 0)<br />            {<br />                <span style="color: #0000ff">return</span> 1;<br />            }<br />            <span style="color: #0000ff">else</span><br />            {<br />                <span style="color: #0000ff">return</span> -1;<br />            }<br />        }<br />    }            <br />}</pre>
<p></div>
<p>Ce code fonctionne mais l&rsquo;imbrication de conditions donne un sentiment de code mal écrit. Tentons d&rsquo;améliorer les choses. Tant que le tableau n&rsquo;avait pas plus d&rsquo;un élément il était possible de donner le résultat en un seul test. A partir de 2 éléments, on voit qu&rsquo;il faut plusieurs tests. Il est donc temps, je pense, de réfléchir à un algorithme plus proche de la définition. Voici le résultat auquel j&rsquo;arrive :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">int</span> FindEquilibrium(<span style="color: #0000ff">int</span>[] inputArray)<br />{<br />    <span style="color: #0000ff">if</span> (inputArray == <span style="color: #0000ff">null</span>)<br />    {<br />        <span style="color: #0000ff">return</span> -1;<br />    }<br />    <span style="color: #0000ff">else</span><br />    {<br />    <br />        <span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i = 0; i <code class="codecolorer text default"><span class="text">&lt;</span></code> inputArray.Length; i++)<br />        {<br />            var sommeGauche = 0;<br />            <span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> j = 0; j <code class="codecolorer text default"><span class="text">&lt;</span></code> i; j++)<br />            {<br />                sommeGauche += inputArray[j];<br />            }<br /><br />            var sommeDroite = 0;<br />            <span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> k = i + 1; k <code class="codecolorer text default"><span class="text">&lt;</span></code> inputArray.Length; k++)<br />            {<br />                sommeDroite += inputArray[k];<br />            }<br /><br />            <span style="color: #0000ff">if</span> (sommeGauche == sommeDroite)<br />            {<br />                <span style="color: #0000ff">return</span> i;<br />            }<br />        }<br />        <span style="color: #0000ff">return</span> -1;<br />    }           <br />}</pre>
<p></div>
<p>Nous avons implémenter le définition de l&rsquo;équilibrium presque mot pour mot. Nous parcourons les éléments du tableau et additionnons les éléments à gauche de l&rsquo;élément courant avec les éléments à droite de l&rsquo;élément courant. On remarquera ici que je n&rsquo;utilise pas une taille fixe pour le tableau mais bien la taille réelle? Ceci n&rsquo;est pas une anticipation d&rsquo;un test futur mais bien une volonté de ne pas utiliser de constante &laquo;&nbsp;magique&nbsp;&raquo; dans le code. Utiliser directement la valeur &laquo;&nbsp;2&nbsp;&raquo; aurait masqué le fait qu&rsquo;il s&rsquo;agit de la taille de mon tableau.</p>
<p>En première intention j&rsquo;avais mis le bloc implémentant l&rsquo;algorithme (c&rsquo;est à dire les 2 boucles imbriquées) le bloc &laquo;&nbsp;else&nbsp;&raquo; correspondant au cas (taille du tableau > 1). En prenant ensuite un peu de recul j&rsquo;ai remarqué que les cas tableau à 0 et 1 élément étaient également couverts par la boucle imbriquée. Je pouvais donc retirer les tests &laquo;&nbsp;inputArray.Length == 0&Prime; et &laquo;&nbsp;inputArray.Length == 1&Prime; ce qui simplifie encore le code.</p>
</blockquote>
<h3></h3>
<h3>Cas du tableau à 3 éléments</h3>
<p>L&rsquo;étape suivant consiste à traiter les tableaux à 3 éléments. Cette fois la partie ardue à consister à déterminer les cas de tests pertinents pour éviter d&rsquo;avoir à faire toutes les combinaisons possibles. J&rsquo;en suis arrivé à isoler 4 cas qui couvrent (sauf erreur de ma part) toutes les configurations pour un tableau (i,j,k) :</p>
<ol>
<li>Somme droite nulle (j+k = 0) : résultat = 0 </li>
<li>Somme droite non nulle (j+k != 0) et somme gauche nulle (i + j = 0) : résultat = 2 </li>
<li>Somme droite non nulle (j+k != 0) et somme gauche non nulle (i+j != 0) et symétrie centrale (i = k) : résultat = 1 </li>
<li>Somme droite non nulle (j+k != 0) et somme gauche non nulle (i+j != 0) et pas de symétrie centrale (i != k)  : résultat = ?1 </li>
</ol>
<p>On obtient le jeu de test suivant :</p>
<p><code class="codecolorer text default"><span class="text">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;&lt;tests&gt;&lt;test&gt;&lt;name&gt;Cas 1: somme droite nulle (j+k = 0)&lt;/name&gt; &lt;data&gt;145887,14770,-14770&lt;/data&gt; &lt;expected&gt;0&lt;/expected&gt; &lt;/test&gt;&lt;test&gt;&lt;name&gt;Cas 2: Symetrie centrale (i == k) avec somme droite non nulle (j+k != 0)&lt;/name&gt; &lt;data&gt;-54,1,-54&lt;/data&gt; &lt;expected&gt;1&lt;/expected&gt; &lt;/test&gt;&lt;test&gt;&lt;name&gt;Cas 3 somme gauche nulle (i+j = 0) et somme droite non nulle (j+k != 0)&lt;/name&gt; &lt;data&gt;-15,15,1024&lt;/data&gt; &lt;expected&gt;2&lt;/expected&gt; &lt;/test&gt;&lt;test&gt;&lt;name&gt;Cas 4: aucune symetrie (i != k), somme droite non nulle, somme gauche non nulle &lt;/name&gt;&lt;data&gt;1,2,3&lt;/data&gt; &lt;expected&gt;-1&lt;/expected&gt; &lt;/test&gt;&lt;/tests&gt;</span></code></p>
<h4>Le test</h4>
<p>Le code du test est le même que celui du test précédent. Seul le fichier source va changer.</p>
<h4>Le code</h4>
<p>Ici on constate que tous les cas passent avec succès. Le code fonctionne donc très bien sur les tableaux à 3 éléments.</p>
<h3></h3>
<h3>La suite &#8230;</h3>
<p>A partir des différents tests mené, j&rsquo;assume que les combinaisons avec des tableaux de tailles > 3 peuvent se ramener à un des cas de tableau à 3 éléments. Par exemple pour un tableau à 4 éléments (i, j, k, l) si i est l&rsquo;équilibrium, il sera aussi l&rsquo;équilibrium du tableau (i, j, k+l) ou (i, j+k, l). Et ainsi de suite. Par sécurité j&rsquo;ai tout de même rajouté un test avec un fichier contenant quelques tests de tableaux supérieurs à 3. Aucune modification de code n&rsquo;a été nécessaire. Je vous laisse essayer des cas avec le code fournis. Si vous trouvez une configuration qui n&rsquo;est pas couverte n&rsquo;hésitez pas à m&rsquo;en faire part.</p>
<p>Je considère donc qu&rsquo;il n&rsquo;est pas nécessaire de faire plus de tests pour valider le bon fonctionnement du code. Par contre il nous reste quelques tests un peu plus subtils à écrire. Nous verrons cela dans le dernier article de la série.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Démarche TDD – Une première tentative</title>
		<link>https://blog.developpez.com/phertzog/p8529/developpement/demarche_tdd_andash_une_premiere_tentati</link>
		<comments>https://blog.developpez.com/phertzog/p8529/developpement/demarche_tdd_andash_une_premiere_tentati#comments</comments>
		<pubDate>Fri, 22 Jan 2010 23:01:43 +0000</pubDate>
		<dc:creator><![CDATA[phertzog]]></dc:creator>
				<category><![CDATA[Developpement]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Le but de ce premier billet est de vous faire partager mes tentatives d&#8217;application d&#8217;une démarche de développement dirigée par les tests (ou TDD) à un cas simple. Actuellement j&#8217;utilise plutôt une démarche &#171;&#160;classique&#160;&#187; : je réfléchis d&#8217;abord à mon problème dans sa globalité, je conçois et j&#8217;implémente mon algorithme et seulement ensuite je passe à la phase des tests unitaires. La démarche et le sujet Pour cet exercice je me suis forcé à appliquer [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><font size="2" face="Georgia">Le but de ce premier billet est de vous faire partager mes tentatives d&rsquo;application d&rsquo;une démarche de développement dirigée par les tests (ou TDD) à un cas simple. Actuellement j&rsquo;utilise plutôt une démarche &laquo;&nbsp;classique&nbsp;&raquo; : je réfléchis d&rsquo;abord à mon problème dans sa globalité, je conçois et j&rsquo;implémente mon algorithme et seulement ensuite je passe à la phase des tests unitaires.</font></p>
<h2></h2>
<h3>La démarche et le sujet</h3>
<p><font size="2" face="Georgia">Pour cet exercice je me suis forcé à appliquer au plus prêt ce que je pense avoir saisi de la démarche TDD. C&rsquo;est à dire :</font></p>
<ol>
<li><font size="2" face="Georgia">Ecrire d&rsquo;abord un test qui échoue </font></li>
<li><font size="2" face="Georgia">Ecrire le code minimum pour faire passer le test. C&rsquo;est à dire qu&rsquo;à chaque étape il ne faut pas anticiper le code pour un test futur. </font></li>
<li><font size="2" face="Georgia">Après chaque modification faite pour passer un nouveau test, il faut prendre du recul et modifier le code afin de le rendre &laquo;&nbsp;propre&nbsp;&raquo; (ce que je traduis par faire que le code respecte les principes de développement comme le fait de supprimer les répétitions, de s&rsquo;assurer que chaque classe et méthode à bien une seule responsabilité &#8230;). </font></li>
</ol>
<p><font size="2" face="Georgia">Pour appliquer ces principe, j&rsquo;ai choisi de prendre un essai de résolution d&rsquo; un petit problème informatique assez simple et connu : la recherche de l&rsquo;é</font><font size="2" face="Georgia">quilibrium. Petit énoncé du sujet pour rappel :</font></p>
<blockquote><p><font size="2" face="Georgia">Etant donné une suite d&rsquo;entier dans un tableau, il faut trouver la position dans le tableau à partir de laquelle la somme des entiers de gauche est égale à la somme des entiers de droite (on ne compte pas la valeur de l&rsquo;élément pivot). Prenons un exemple :</font></p>
<p><font size="2" face="Georgia">Soit le tableau A[0]=-7 A[1]=1 A[2]=5 A[3]=2 A[4]=-4 A[5]=3 A[6]=0  les équilibrium possibles sont:        <br />3 => A[0]+A[1]+A[2]=A[4]+A[5]+A[6]         <br />6 => A[0]+A[1]+A[2]+A[3]+A[4]+A[5]=0 et la somme de 0 éléments est aussi égale à 0 (il n&rsquo;y a pas d&rsquo;élément au delà de l&rsquo;indice 6). </font></p>
<p><font size="2" face="Georgia">Les bases de l&rsquo;exercice étant posée, passons au vif du sujet : la réalisation d&rsquo;une méthode qui prend en argument un tableau d&rsquo;entiers et qui </font></p>
<ul>
<li>
<p><font size="2" face="Georgia">renvoie l&rsquo;équilibrium d&rsquo;indice le plus bas s&rsquo;il existe au moins un équilibrium : le fait de retourner l&rsquo;indice de plus bas niveau est un choix purement arbitraire.</font></p>
</li>
<li>
<p><font size="2" face="Georgia">la valeur -1 si aucun équilibrium n&rsquo;est trouvé.</font> </p>
</li>
</ul>
</blockquote>
<p><span id="more-2"></span></p>
<p><font size="2" face="ge">Maintenant que le contexte est posé, passons au codage.</font></p>
<h3>Le codage</h3>
<p><font size="2" face="ge">Nous allons donc créer des tests de plus en plus évolués. A chaque étape je vais présenter le code obtenu pour passer le test.</font></p>
<h4>Cas du tableau &laquo;&nbsp;null&nbsp;&raquo;</h4>
<p><font size="2" face="ge">Ce premier cas est totalement trivial. Si on passe un tableau vide à la fonction, elle doit renvoyer -1.      <br />Ecrivons donc ce premier test à l&rsquo;aide de MS Test (inclus dans la version beta de Visual Studio 2010).</font></p>
<h5>Test 01</h5>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">[TestMethod()]<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Simple_NullArray_NoEquilibrium()<br />        {<br />            <span style="color: #0000ff">int</span>[] inputArray = <span style="color: #0000ff">null</span>; <br />            <span style="color: #0000ff">int</span> expected = -1; <br />            <span style="color: #0000ff">int</span> actual;<br /><br />            actual = Equilibrium.FindEquilibrium(inputArray);<br />            <br />            Assert.AreEqual(expected, actual);            <br />        }</pre>
</div>
<h5>Le code</h5>
<p><font size="2" face="ge">Ecrivons maintenant le minimum de code pour faire passer ce test. Ici ma principale difficulté était de ne pas écrire trop de code en anticipant ce qui allait venir.</font>
</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> Equilibrium<br />{<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">int</span> FindEquilibrium(<span style="color: #0000ff">int</span>[] inputArray)<br />    {<br />        <span style="color: #0000ff">return</span> -1;<br />    }<br />}</pre>
</div>
<p><font size="2" face="ge">Plus simple que ça, je ne vois pas.</font></p>
<h4>Cas du tableau vide</h4>
<p><font size="2" face="ge">Cette fois ci nous allons envoyer un tableau vide à la méthode. Comme il n&rsquo;y a pas d&rsquo;indice défini, la réponse doit à nouveau être -1. Ecrivons donc le test.</font> </p>
<h5>Test 02</h5>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">[TestMethod()]<br /><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Simple_EmptyArray_NoEquilibrium()<br />{<br />    <span style="color: #0000ff">int</span>[] inputArray = <span style="color: #0000ff">new</span> <span style="color: #0000ff">int</span>[] {};<br />    <span style="color: #0000ff">int</span> expected = -1;<br />    <span style="color: #0000ff">int</span> actual;<br /><br />    actual = Equilibrium.FindEquilibrium(inputArray);<br /><br />    Assert.AreEqual(expected, actual);<br />}</pre>
<p></div>
<h5>Le code</h5>
<p><font size="2" face="ge">Comme nous avons écris du code robuste <img src="https://blog.developpez.com/phertzog/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" /> ce test passe au la main. Il n&rsquo;y a pas besoin d&rsquo;ajouter du code à notre code précédent.</font></p>
<h4>Cas du tableau à 1 élément</h4>
<p><font size="2" face="ge">Notre prochain cas va s&rsquo;occuper de traiter un tableau contenant un seul élément. Dans ce cas, la fonction doit retourner 0. En effet à gauche et à droite de l&rsquo;unique élément il n&rsquo;y a rien => somme de 0 de chaque coté. On remarquera au passage que le valeur stockée dans le tableau n&rsquo;a pas d&rsquo;importance.</font></p>
<h5>Test 03 </h5>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">[TestMethod]        <br /><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Simple_Array_1_Return_0()<br />{<br />    <span style="color: #008000">//La valeur réelle de l'élément n'a aucune importance dans ce cas</span><br />    <span style="color: #0000ff">int</span>[] inputArray = <span style="color: #0000ff">new</span> <span style="color: #0000ff">int</span>[1] { 1 };<br />    <span style="color: #0000ff">int</span> expected = 0;<br />    <span style="color: #0000ff">int</span> actual;<br /><br />    actual = Equilibrium.FindEquilibrium(inputArray);<br /><br />    Assert.AreEqual(expected, actual); <br />}</pre>
<p></div>
<p><font size="2"><u>Remarque</u> : je n&rsquo;ai pas voulu mettre un nombre aléatoire dans le tableau car je pense que chaque exécution d&rsquo;un test doit se comporter de la même manière. Un élément aléatoire risquerait d&rsquo;introduire un comportement dans lequel le test échouerait de manière non prédictive, ce qui nuit à la confiance accordée aux tests. J&rsquo;ai donc préféré ajouter un commentaire expliquant que le choix de la valeur 1 n&rsquo;a pas d&rsquo;importance dans notre cas.</font></p>
<p><font size="2">Cette fois ci notre implémentation ne passe pas le test 03. Il faut donc modifier le code.</font></p>
<h5>Le code</h5>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> Equilibrium<br />{<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">int</span> FindEquilibrium(<span style="color: #0000ff">int</span>[] inputArray)<br />    {<br />        <span style="color: #0000ff">if</span> ((inputArray == <span style="color: #0000ff">null</span>) || (inputArray.Length == 0))<br />        {<br />            <span style="color: #0000ff">return</span> -1;<br />        }<br />        <span style="color: #0000ff">else</span><br />        {<br />            <span style="color: #0000ff">return</span> 0;<br />        }            <br />    }<br />}</pre>
<p></div>
<p><font size="2" face="ge">Nous avons regroupé les cas qui doivent renvoyer -1 et ajouter un else qui retourne 0. Même si nous savons que cette solution est imparfaite, elle convient cependant à tous nos tests et c&rsquo;est ce que nous gardons à ce stade.</font></p>
<h4>Et la suite &#8230;</h4>
<p><font size="2" face="ge">Pour l&rsquo;instant nous avons couvert les cas simple. Le prochain billet couvrira de nouveau cas. En attendant ce billet je te laisse, cher lecteur, réfléchir aux tests à rajouter. Tu pourras ainsi également comparer le résultat auquel tu seras arrivé avec mon résultat.</font></p>
<p><font size="2" face="ge">PS : Ceci est mon premier billet, merci de faire preuve d&rsquo;un peu d&rsquo;indulgence. Par contre les critiques constructives sur le fond ou la forme sont les bienvenues.</font></p>
<p><font size="2" face="ge">A bientôt</font></p>
<blockquote>
<p><font size="2" face="ge">Live long and prosper</font></p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
