<?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>Blog de Philippe Vialatte &#187; C#</title>
	<atom:link href="https://blog.developpez.com/philippe/pcategory/net/c/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/philippe</link>
	<description></description>
	<lastBuildDate>Fri, 03 Jan 2014 15:12:09 +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>HiLo : développer une application C++/XAML</title>
		<link>https://blog.developpez.com/philippe/p11733/net/hilo</link>
		<comments>https://blog.developpez.com/philippe/p11733/net/hilo#comments</comments>
		<pubDate>Mon, 21 Jan 2013 08:38:41 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/philippe/?p=211</guid>
		<description><![CDATA[Le groupe Pattern &#38; Practice de Microsoft vient de rendre disponible un guide montrant le développement étape par étape d&#8217;une application Windows 8 en C++/xaml Pour ceux qui seraient intéressés, c&#8217;est déjà localisé en Français, et disponible ici: http://msdn.microsoft.com/fr-fr/library/windows/apps/jj160316.aspx Bonne lecture]]></description>
				<content:encoded><![CDATA[<p>Le groupe Pattern &amp; Practice de Microsoft vient de rendre disponible un guide montrant le développement étape par étape d&rsquo;une application Windows 8 en C++/xaml</p>
<p><img src="http://i.msdn.microsoft.com/dynimg/IC591455.png" alt="Logo P&amp;P" /></p>
<p>Pour ceux qui seraient intéressés, c&rsquo;est déjà localisé en Français, et disponible ici:<br />
<a href="http://msdn.microsoft.com/fr-fr/library/windows/apps/jj160316.aspx" title="http://msdn.microsoft.com/fr-fr/library/windows/apps/jj160316.aspx">http://msdn.microsoft.com/fr-fr/library/windows/apps/jj160316.aspx<br />
</a></p>
<p>Bonne lecture <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Le beurk du jour</title>
		<link>https://blog.developpez.com/philippe/p10869/net/le_beurk_du_jour</link>
		<comments>https://blog.developpez.com/philippe/p10869/net/le_beurk_du_jour#comments</comments>
		<pubDate>Fri, 23 Mar 2012 10:11:00 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Tiens, ca faisait longtemps que j&#8217;avais pas bloggé&#8230; Qu&#8217;est-ce que vous pensez de ce bout de code, et est-ce que vous pouvez deviner pourquoi il me donne des boutons ? flag = hidValue.Value == "1" ? "F" : hidValue.Value == "2" ? "Y" : hidValue.Value == "3" ? "N" : null; Y&#8217;a rien a gagner]]></description>
				<content:encoded><![CDATA[<p>Tiens, ca faisait longtemps que j&rsquo;avais pas bloggé&#8230;</p>
<p>Qu&rsquo;est-ce que vous pensez de ce bout de code, et est-ce que vous pouvez deviner pourquoi il me donne des boutons ?</p>
<div class="csharpcode">
<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">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">flag = hidValue.Value == <span style="color: #006080">"1"</span> ? <span style="color: #006080">"F"</span> :   </pre>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">       hidValue.Value == <span style="color: #006080">"2"</span> ? <span style="color: #006080">"Y"</span> :    </pre>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">       hidValue.Value == <span style="color: #006080">"3"</span> ? <span style="color: #006080">"N"</span> : <span style="color: #0000ff">null</span>;</pre>
</p></div>
</p></div>
</div>
<p>Y&rsquo;a rien a gagner <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Une chose que j&#8217;ignorais avec les initialiseurs d&#8217;objets</title>
		<link>https://blog.developpez.com/philippe/p8223/net/une_chose_que_jarsquo_ignorais_avec_les_</link>
		<comments>https://blog.developpez.com/philippe/p8223/net/une_chose_que_jarsquo_ignorais_avec_les_#comments</comments>
		<pubDate>Fri, 23 Oct 2009 19:57:00 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Comme quoi on en apprends tous les jours. La MSDN ne fournissant que des exemples du genre :  Cat cat = new Cat { Age = 10, Name = &#171;&#160;Sylvester&#160;&#187; }; Je m&#8217;étais résigné à n&#8217;utiliser les initialiseurs qu&#8217;avec des constructeurs sans paramètres. Alors qu&#8217;en fait, non, on peut tout à fait faire ceci : row.Cells.Add(new WorksheetCell(&#171;&#160;Ventes par mois&#160;&#187;, DataType.String, &#171;&#160;Entete&#160;&#187;) { MergeAcross = 4 }); Qui fonctionne très bien]]></description>
				<content:encoded><![CDATA[<p>Comme quoi on en apprends tous les jours.</p>
<p>La MSDN ne fournissant que des exemples du genre :</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Consolas"><font size="2"><span style="background-color: #efefe4"> </span><font color="#0080c0">Cat</font><font color="#000000"> </font><font color="#0080c0">cat</font><font color="#000000"> </font><font color="#000096">=</font><font color="#000000"> </font><font color="#000096">new</font><font color="#000000"> </font><font color="#0080c0">Cat</font><font color="#000000"> { </font><font color="#0080c0">Age</font><font color="#000000"> </font><font color="#000096">=</font><font color="#000000"> </font><font color="#ff0000">10</font><font color="#000000">, </font><font color="#0080c0">Name</font><font color="#000000"> </font><font color="#000096">=</font><font color="#000000"> </font><font color="#0000ff">&laquo;&nbsp;Sylvester&nbsp;&raquo;</font><font color="#000000"> };</font></font></font> </div>
</p></div>
<p>Je m&rsquo;étais résigné à n&rsquo;utiliser les initialiseurs qu&rsquo;avec des constructeurs sans paramètres.</p>
<p>Alors qu&rsquo;en fait, non, on peut tout à fait faire ceci :</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Consolas"><font size="2"></font><font color="#0080c0"><span style="background-color: #efefe4">row</span><font color="#000096">.</font><font color="#0080c0">Cells</font><font color="#000096">.</font><font color="#0080c0">Add</font><font color="#000000">(</font><font color="#000096">new</font><font color="#000000"> </font><font color="#800000">WorksheetCell</font><font color="#000000">(</font><font color="#0000ff">&laquo;&nbsp;Ventes par mois&nbsp;&raquo;</font><font color="#000000">, </font><font color="#2b91af">DataType</font><font color="#000096">.</font><font color="#0080c0">String</font><font color="#000000">, </font><font color="#0000ff">&laquo;&nbsp;Entete&nbsp;&raquo;</font><font color="#000000">) { </font><font color="#0080c0">MergeAcross</font><font color="#000000"> </font><font color="#000096">=</font><font color="#000000"> </font><font color="#ff0000">4</font><font color="#000000"> });</font></font></font> </div>
</p></div>
</p>
<p>Qui fonctionne très bien <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Encore une couche sur l&#8217;IoC ?</title>
		<link>https://blog.developpez.com/philippe/p8213/net/c/encore_une_couche_sur_l_ioc</link>
		<comments>https://blog.developpez.com/philippe/p8213/net/c/encore_une_couche_sur_l_ioc#comments</comments>
		<pubDate>Tue, 20 Oct 2009 15:33:00 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[C#]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Suite a encore un mini tollé dans la communauté Agile/Alt.Net, une fois de plus provoqué par un billet de Joël Spolski (mais bon, ca devient une habitude ), une des nombreuses critiques faites concernait le &#171;&#160;cout d&#8217;entrée&#160;&#187; pour utiliser des outils considérés comme pas encore &#171;&#160;standards&#160;&#187; &#8230;sous-entendu, le développeur lambda ne peut/veut pas comprendre l&#8217;intérêt d&#8217;utiliser, par exemple, un ORM, un framework IoC ou les principes SOLID. Je ne reviendrais pas sur le sujet (déjà [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Suite a encore un mini tollé dans la communauté Agile/Alt.Net, une fois de plus provoqué par un billet de Joël Spolski (mais bon, ca devient une habitude <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> ), une des nombreuses critiques faites concernait le &laquo;&nbsp;cout d&rsquo;entrée&nbsp;&raquo; pour utiliser des outils considérés comme pas encore &laquo;&nbsp;standards&nbsp;&raquo;</p>
<p>&#8230;sous-entendu, le développeur lambda ne peut/veut pas comprendre l&rsquo;intérêt d&rsquo;utiliser, par exemple, un ORM, un framework IoC ou les principes SOLID.</p>
<p>Je ne reviendrais pas sur le sujet (<a href="http://blog.developpez.com/philippe/p7244/divers/conception-une-nouvelle-guerre-de-religi/">déjà fait la dernière fois</a>), mais Rob Conery (depuis peu parti de Microsoft) a pondu quelques billets très bien fichus sur l&rsquo;intérêt d&rsquo;utiliser un framework IoC, ou sur le mocking.</p>
<p>Alors, oui, c&rsquo;est en anglais, mais c&rsquo;est le prix a payer <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p><a href="http://blog.wekeroad.com/smackdown/200-page-manual-on-inversion-of-control-plus-or-minus-199/">200 Page Manual on Inversion of Control (plus or minus 199)</a>   <br /><a href="http://blog.wekeroad.com/cool-kids/200-page-manual-on-inversion-of-control-part-2/">200 Page Manual on Inversion of Control, Part 2</a>   <br /><a href="http://blog.wekeroad.com/cool-kids/using-dependency-injection-and-mocking-for-testability/">Using Dependency Injection and Mocking For Testability</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>L&#8217;operateur ??</title>
		<link>https://blog.developpez.com/philippe/p8160/net/l_operateur</link>
		<comments>https://blog.developpez.com/philippe/p8160/net/l_operateur#comments</comments>
		<pubDate>Tue, 06 Oct 2009 08:02:00 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[En revue de code, cette semaine, j&#8217;ai eu beaucoup de code du genre : 1: HttpContext context = HttpContext.Current; 2: LifeCycle lifecycle; 3:  4: if (context.Session["CachedLifeCycle"] != null) { 5: lifecycle = (LifeCycle)context.Session["CachedLifeCycle"]; 6: } else { 7: lifecycle = Factory.GetLifeCycle(); 8: context.Session["CachedLifeCycle"] = lifecycle; 9: } 10:  11: return lifecycle; Genre&#8230;beaucoup&#8230; Et du code comme ca, aussi (je simplifie : 1: if (value == null){ 2: message = "default"; 3: }else{ 4: message = [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>En revue de code, cette semaine, j&rsquo;ai eu beaucoup de code du genre :</p>
<div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; direction: ltr; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4; text-align: left">
<div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum1" style="color: #606060">   1:</span> HttpContext context = HttpContext.Current;</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum2" style="color: #606060">   2:</span> LifeCycle lifecycle;</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum3" style="color: #606060">   3:</span>  </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum4" style="color: #606060">   4:</span> <span style="color: #0000ff">if</span> (context.Session[<span style="color: #006080">"CachedLifeCycle"</span>] != <span style="color: #0000ff">null</span>) {</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum5" style="color: #606060">   5:</span>     lifecycle = (LifeCycle)context.Session[<span style="color: #006080">"CachedLifeCycle"</span>];</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum6" style="color: #606060">   6:</span> } <span style="color: #0000ff">else</span> {</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum7" style="color: #606060">   7:</span>     lifecycle = Factory.GetLifeCycle();</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum8" style="color: #606060">   8:</span>     context.Session[<span style="color: #006080">"CachedLifeCycle"</span>] = lifecycle;</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum9" style="color: #606060">   9:</span> }</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum10" style="color: #606060">  10:</span>  </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum11" style="color: #606060">  11:</span> <span style="color: #0000ff">return</span> lifecycle;</pre>
</p></div>
</div>
<p>Genre&#8230;beaucoup&#8230;</p>
<p>Et du code comme ca, aussi (je simplifie :</p>
<div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; direction: ltr; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4; text-align: left">
<div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum1" style="color: #606060">   1:</span> <span style="color: #0000ff">if</span> (<span style="color: #0000ff">value</span> == <span style="color: #0000ff">null</span>){</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum2" style="color: #606060">   2:</span>   message = <span style="color: #006080">"default"</span>;</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum3" style="color: #606060">   3:</span> }<span style="color: #0000ff">else</span>{</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum4" style="color: #606060">   4:</span>   message = <span style="color: #0000ff">value</span>;</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum5" style="color: #606060">   5:</span> }</pre>
</p></div>
</div>
<p>Et la, du coup, il a fallu sortir un coup l&rsquo;artillerie pour faire rentrer tout le monde dans le droit chemin, a savoir, l&rsquo;operateur ??</p>
<p>L&rsquo;operateur ?? est un operateur qui renvoie, au choix, sa partie gauche si elle n&rsquo;est pas nulle, et la partie droite sinon.</p>
<p>Donc, pour le second code, il permets de faire simplement :</p>
<div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; direction: ltr; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4; text-align: left">
<div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum1" style="color: #606060">   1:</span> message = <span style="color: #0000ff">value</span> ?? <span style="color: #006080">"default"</span>;</pre>
</p></div>
</div>
<p>Le premier code est un peu plus compliqué, mais ?? va nous permettre de clarifier un peu tout ca aussi :</p>
<div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; direction: ltr; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4; text-align: left">
<div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum1" style="color: #606060">   1:</span> HttpContext context = HttpContext.Current;</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum2" style="color: #606060">   2:</span> LifeCycle lifecycle = (LifeCycle)context.Session[<span style="color: #006080">"CachedLifeCycle"]</span> ?? Factory.GetLifeCycle();</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum3" style="color: #606060">   3:</span> context.Session[<span style="color: #006080">"CachedLifeCycle"</span>] = lifecycle;</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum4" style="color: #606060">   4:</span>  </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum5" style="color: #606060">   5:</span> <span style="color: #0000ff">return</span> lifecycle;</pre>
</p></div>
</div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Brownfield Application Development in .Net</title>
		<link>https://blog.developpez.com/philippe/p7978/net/brownfieldapplicationdevelopmentpreview</link>
		<comments>https://blog.developpez.com/philippe/p7978/net/brownfieldapplicationdevelopmentpreview#comments</comments>
		<pubDate>Tue, 25 Aug 2009 16:09:00 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Livres]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ce livre est encore en pré-production, mais comme j&#8217; ai eu la chance de participer à sa revue, je me suis dit que cela ne ferait pas de mal de vous en faire profiter&#8230; Brownfield Application Development in .NET Kyle Baley and Donald Belcham Softbound print: December 2009 (est.) &#124; 550 pages ISBN: 1933988711 Note : 5/5 Dès que le livre sort officiellement, je corrige toute info erronée, et ça part dans les critiques Version [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ce livre est encore en pré-production, mais comme j&rsquo; ai eu la chance de participer à sa revue, je me suis dit que cela ne ferait pas de mal de vous en faire profiter&#8230;</p>
<table cellspacing="0" cellpadding="2" border="0">
<tbody>
<tr>
<td valign="top" width="250">
<a href="http://wwwm.manning.com/baley/"><br />
<img title="Brownfield Application Development in .Net" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" alt="image" src="http://philippe.developpez.com/images/brownfield.jpg" width="154" border="0" /></a></td>
<td valign="top" width="250">
<p><b>Brownfield Application Development in .NET</b>             </p>
<p><b>Kyle Baley and Donald Belcham              <br /></b></p>
<p>Softbound print: December 2009 (est.) | 550 pages            <br />ISBN: 1933988711</p>
<p>Note : 5/5 <img src="http://www.developpez.be/images/kitstars-5-0" alt="5 sur 5" /></p>
</td>
</tr>
</tbody>
</table>
<p> Dès que le livre sort officiellement, je corrige toute info erronée, et ça part dans les critiques <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p><span id="more-183"></span></p>
<p><strong><u>Version Française</u></strong></p>
<p>Ayant principalement travaillé avec le Framework .NET depuis bientôt huit ans (depuis la beta en 2001), j&rsquo;ai régulièrement à intervenir sur des projets démarrés depuis un certain temps, et qui sont tranquillement, mais surement, devenu totalement impossible à maintenir.</p>
<p>La faute n&rsquo;est en général pas liée au Framework en lui-même, mais à ce qui semble être une tendance naturelle de tout programme non trivial à dégénérer dans cet état.</p>
<p>Le livre &laquo;&nbsp;Brownfield Application Development in .NET&nbsp;&raquo; décrit un ensemble de pratiques qui peuvent permettre de sortir un projet de l&rsquo;ornière, tout en diminuant le nombre de bugs, les problèmes de maintenance, et en améliorant la qualité du code.</p>
<p>Le livre est composé de deux grandes parties.</p>
<p>Il commence par décrire l&rsquo;écosystème du projet, a savoir le contrôleur de code source, l&rsquo;intégration continue, les métriques, et le suivi des bugs.</p>
<p>Il décrit ensuite comment améliorer la qualité du code en appliquant des fondamentaux de la conception orientée objet, tels que le découpage en couche, les principes SOLID, ou le découplage des dépendances, </p>
<p>Le livre s&rsquo;attaque en suite a l&rsquo;interface utilisateur, en la refactorisant vers le pattern MVP, puis explique comment introduire un ORM, ainsi  que ses avantages. La partie suivante est consacrée a une technique consistant a insérer une couche supplémentaire entre deux entités, de façon a créer une couche anti-corruption.</p>
<p>Enfin, il se termine en proposant un certain nombre de suggestions sur comment garder le rythme une fois que le projet est revenu a un état maintenable.</p>
<p>Ce que j&rsquo;ai le plus apprécié dans ce livre, c&rsquo;est qu&rsquo;en plus d&rsquo;être techniquement intéressant, il se paye le luxe d&rsquo;être abordable a tout le monde (des développeurs juniors qui le liront d&rsquo;une traite, aux plus senior qui y reviendront pour des points précis), et fun a lire.    </p>
<p>De plus, les auteurs se montrent ouverts, et ne présentent aucune solution comme étant <strong>LA</strong> solution, préférant inviter le lecteur a sortir de sa zone de confort en présentant des solutions alternatives.</p>
<p>Au final, ce livre est un des meilleurs livres que j&rsquo;aie lu ces dernières années sur le processus de développement, et qui a sa place sur les étagères de tout développeur qui doit assurer la maintenance d&rsquo;une application&#8230;même si cette application lui appartient <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p><strong><u>English Version</u></strong></p>
<p>Having worked for the better parts of the last eight years with the .Net framework, I am regularly called to work on a project started some times ago,    <br />that quietly and slowly started to turn in an unmaintainable mess.</p>
<p>The fault, usually, is not limited to the framework, but seems to be a natural tendency for any non-trivial program to devolve into this state. </p>
<p>The book &laquo;&nbsp;Brownfield Application Development in .NET&nbsp;&raquo; explains the practices that may turn one of these projects back to a better health, with less bugs, less maintenance issues, and better code quality.</p>
<p>It firsts describes what should be the project ecosystem, starting from the version control, to continuous integration, automatic testing, quality metrics and defect tracking.</p>
<p>Then, it describes how to enhance the code quality by applying some OO fundamentals, like layering and dependency management.</p>
<p>After this, the book describes how to refactor from the usually entangled user interface code to a cleaner MVP pattern, how to abstract the data access code by using an ORM and how to prevent the code from corruption by adding an additional layer.</p>
<p>Finally, it ends by some suggestions on how to keep the project from returning to the brownfield state.</p>
<p>The best thing in this book is that it is really well balanced, fun to read, and accurate technically.</p>
<p>The authors also have an open point of view, not selling one solution as being the &laquo;&nbsp;true one and only&nbsp;&raquo; solution, but giving some advice, and challenging users assumptions all along.</p>
<p>All in all, it is one of the best books I have red in the last three years on development process and good practices, and it has its place on each developer that has to maintain an application&#8230;even if he is the one that developed it <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Livres] Pourquoi les Early Acces, c’est trop bien</title>
		<link>https://blog.developpez.com/philippe/p7353/livres/livres_pourquoi_les_early_acces_carsquo</link>
		<comments>https://blog.developpez.com/philippe/p7353/livres/livres_pourquoi_les_early_acces_carsquo#comments</comments>
		<pubDate>Fri, 13 Mar 2009 19:26:00 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Livres]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Comme je l&#8217;ai mentionné il y&#8217;à quelques jours, je suis en pleine lecture, en ce moment, du livre &#171;&#160;Brownfield Application Development in .NET&#160;&#187;, en early access. La ou la formule est géniale, c&#8217;est que: &#8211; Mardi, je trouve une erreur dans le livre &#8211; Jeudi, l&#8217;auteur me réponds en vitesse pour me remercier (déjà, sympa de voir que non seulement les posts sont lus, mais en plus pris en compte) &#8211; Mais le plus fort, [&#8230;]]]></description>
				<content:encoded><![CDATA[<table cellspacing="0" cellpadding="2" width="95%" border="0">
<tbody>
<tr>
<td valign="top">Comme je l&rsquo;ai mentionné il y&rsquo;à quelques jours, je suis en pleine lecture, en ce moment, du livre &laquo;&nbsp;<a href="http://www.manning.com/baley/"><strong>Brownfield Application Development in .NET&nbsp;&raquo;</strong></a><strong>,</strong> en early access.   </p>
<p>La ou la formule est géniale, c&rsquo;est que:           <br />     &#8211; Mardi, je trouve une erreur dans le livre           <br />     &#8211; Jeudi, l&rsquo;auteur me réponds en vitesse pour me remercier (déjà, sympa de voir que non seulement les posts sont lus, mais en plus pris en compte)           <br />     &#8211; Mais le plus fort, c&rsquo;est que je suis le blog de l&rsquo;auteur depuis un moment, et que dans la foulée, il avait écrit un <a href="http://codebetter.com/blogs/kyle.baley/archive/2009/03/12/quick-cyclomatic-complexity-question.aspx">petit post</a> sur le point en question&rsquo;           </p>
<p>Voila, personnellement, je trouve assez super niveau mentalité, et ouverture <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" />           </td>
<td valign="top" width="10"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="160" alt="image" src="http://philippe.ftp-developpez.com/blog/Cruis.NetAppliquerunlabelautomatiquement_A380/image.jpg" width="127" border="0" /> </td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tester les exceptions avec NUnit</title>
		<link>https://blog.developpez.com/philippe/p8051/net/tester_les_exceptions_avec_nunit</link>
		<comments>https://blog.developpez.com/philippe/p8051/net/tester_les_exceptions_avec_nunit#comments</comments>
		<pubDate>Fri, 11 Sep 2009 09:30:00 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Tests]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[En ce moment, je suis en pleine session d&#8217;écriture de tests, et une chose en particulier me fait tiquer, a savoir les tests qui ne sont pas couverts a 100 %. Dans le code en questions, les tests qui font baisser la couverture sont en général des tests qui concernent les exceptions. On y trouve deux familles de tests, on a donc: Le test &#171;&#160;avec attribut&#160;&#187;  [Test] [ExpectedException(typeof(ArgumentOutOfRangeException))] public void MinIntLimit() {     Roman r = new Roman(0); } Ce test [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>En ce moment, je suis en pleine session d&rsquo;écriture de tests, et une chose en particulier me fait tiquer, a savoir les tests qui ne sont pas couverts a 100 %.</p>
<p>Dans le code en questions, les tests qui font baisser la couverture sont en général des tests qui concernent les exceptions. </p>
<p>On y trouve deux familles de tests, on a donc:</p>
<p><strong>Le test &laquo;&nbsp;avec attribut&nbsp;&raquo;</strong> </p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Consolas"><font size="2"><span>[</span><font color="#800000">Test</font><font color="#000000">]            <br />[</font><font color="#800000">ExpectedException</font><font color="#000000">(</font><font color="#000096">typeof</font><font color="#000000">(</font><font color="#800000">ArgumentOutOfRangeException</font><font color="#000000">))]            <br /></font><font color="#000096">public</font><font color="#000000"> </font><font color="#000096">void</font><font color="#000000"> </font><font color="#0080c0">MinIntLimit</font><font color="#000000">() {            <br />    </font><font color="#2b91af">Roman</font><font color="#000000"> </font><font color="#0080c0">r</font><font color="#000000"> </font><font color="#000096">=</font><font color="#000000"> </font><font color="#000096">new</font><font color="#000000"> <font color="#2b91af">Roman</font></font><font color="#000000">(</font><font color="#ff0000">0</font><font color="#000000">);            <br />}</font></font></font> </div>
</p></div>
<p>Ce test utilise l&rsquo;attribut <strong>ExpectedException</strong> pour que le test fonctionne réussisse si et seulement si il jette un exception du type demande (ici, <strong>ArgumentOutOfRangeException</strong>). Le problème, en termes de couverture, est que tout le code situe en dessous de l&rsquo;exception est ignore, le code n&rsquo;est donc pas couvert a 100%.</p>
<p><strong>Le test &laquo;&nbsp;traditionnel&nbsp;&raquo;</strong></p>
<p>Si on n&rsquo;utilise pas NCover, ou si on veut faire des tests sur le message retourné, on produit plus régulièrement de genre de code :</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Consolas"><font size="2"><span>[</span><font color="#800000">Test</font><font color="#000000">]            <br /></font><font color="#000096">public</font><font color="#000000"> </font><font color="#000096">void</font><font color="#000000"> </font><font color="#0080c0">TestThatProperExceptionIsThrown</font><font color="#000000">() {            <br />    </font><font color="#000096">try</font><font color="#000000"> {            <br />        </font><font color="#0080c0">MethodUnderTest</font><font color="#000000">(</font><font color="#0080c0">anInvalidObject</font><font color="#000000">);            <br />        </font><font color="#800000">Assert</font><font color="#000096">.</font><font color="#0080c0">Fail</font><font color="#000000">(</font><font color="#0000ff">&laquo;&nbsp;Expected an exception, but none was thrown&nbsp;&raquo;</font><font color="#000000">);            <br />    } </font><font color="#000096">catch</font><font color="#000000"> (</font><font color="#800000">ArgumentException</font><font color="#000000"> </font><font color="#0080c0">ex</font><font color="#000000">) {            <br />        </font><font color="#800000">Assert</font><font color="#000096">.</font><font color="#0080c0">AreEqual</font><font color="#000000">(</font><font color="#0080c0">ex</font><font color="#000096">.</font><font color="#0080c0">ParamName</font><font color="#000000">, </font><font color="#0000ff">&laquo;&nbsp;myParam&nbsp;&raquo;</font><font color="#000000">);            <br />        </font><font color="#800000">Assert</font><font color="#000096">.</font><font color="#0080c0">AreEqual</font><font color="#000000">(</font><font color="#0080c0">ex</font><font color="#000096">.</font><font color="#0080c0">Message</font><font color="#000000">, </font><font color="#0000ff">&laquo;&nbsp;My message&nbsp;&raquo;</font><font color="#000000">);            <br />    } </font><font color="#000096">catch</font><font color="#000000"> (</font><font color="#800000">Exception</font><font color="#000000"> </font><font color="#0080c0">ex</font><font color="#000000">) {            <br />        </font><font color="#800000">Assert</font><font color="#000096">.</font><font color="#0080c0">Fail</font><font color="#000000">(</font><font color="#0000ff">&laquo;&nbsp;Expected an ArgumentException but got a &nbsp;&raquo;            <br /></font><font color="#000000">          </font><font color="#000096">+</font><font color="#000000"> </font><font color="#0080c0">ex</font><font color="#000096">.</font><font color="#0080c0">GetType</font><font color="#000000">()</font><font color="#000096">.</font><font color="#0080c0">FullName</font><font color="#000000">);            <br />    }             <br />}</font></font></font> </div>
</p></div>
<p>NB. : cet exemple vient directement du <a href="http://nunit.com/blogs/?p=63">blog de NUnit</a>, alors on peut admettre qu&rsquo;il soit mentionné comme &laquo;&nbsp;bonne pratique&nbsp;&raquo;</p>
<p><strong>Sauf que&#8230;</strong></p>
<p>Sauf que si les tests fonctionnent correctement, une partie du code ne sera jamais atteinte, de même que si ils échouent.</p>
<p><strong>Pourquoi ca pose problème ?</strong></p>
<p>En général, je ne cherche pas a atteindre 100% de couverture&#8230;dans mon code testé ! Par contre, si une partie du code de test n&rsquo;est pas joué, cela peut vouloir dire, au choix, deux choses :</p>
<ol>
<li>Que le code testé est faux </li>
<li>Que le test est faux </li>
</ol>
<p><strong>Comment corriger les tests ?</strong></p>
<p>Une option est de reprendre le code ci-dessus de la façon suivante :</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Consolas"><font size="2"><span>[</span><font color="#800000">Test</font><font color="#000000">]            <br /></font><font color="#000096">public</font><font color="#000000"> </font><font color="#000096">void</font><font color="#000000"> </font><font color="#0080c0">TestThatProperExceptionIsThrown</font><font color="#000000">() {            <br />    </font><font color="#000096">bool</font><font color="#000000"> </font><font color="#0080c0">wasTriggered</font><font color="#000000"> </font><font color="#000096">=</font><font color="#000000"> </font><font color="#000096">false</font><font color="#000000">;            <br />    </font><font color="#000096">try</font><font color="#000000"> {            <br />        </font><font color="#0080c0">MethodUnderTest</font><font color="#000000">(</font><font color="#0080c0">anInvalidObject</font><font color="#000000">);            <br />    } </font><font color="#000096">catch</font><font color="#000000"> (</font><font color="#800000">ArgumentException</font><font color="#000000"> </font><font color="#0080c0">ex</font><font color="#000000">) {            <br />        </font><font color="#0080c0">wasTriggered</font><font color="#000000"> </font><font color="#000096">=</font><font color="#000000"> </font><font color="#000096">true</font><font color="#000000">;            <br />        </font><font color="#800000">Assert</font><font color="#000096">.</font><font color="#0080c0">AreEqual</font><font color="#000000">(</font><font color="#0080c0">ex</font><font color="#000096">.</font><font color="#0080c0">ParamName</font><font color="#000000">, </font><font color="#0000ff">&laquo;&nbsp;myParam&nbsp;&raquo;</font><font color="#000000">);            <br />        </font><font color="#800000">Assert</font><font color="#000096">.</font><font color="#0080c0">AreEqual</font><font color="#000000">(</font><font color="#0080c0">ex</font><font color="#000096">.</font><font color="#0080c0">Message</font><font color="#000000">, </font><font color="#0000ff">&laquo;&nbsp;My message&nbsp;&raquo;</font><font color="#000000">);            <br />    }             <br />    </font><font color="#800000">Assert</font><font color="#000096">.</font><font color="#0080c0">IsTrue</font><font color="#000000">(</font><font color="#0080c0">wasTriggered</font><font color="#000000">, </font><font color="#0000ff">&laquo;&nbsp;Expected an exception, but none was thrown&nbsp;&raquo;</font><font color="#000000">);            <br />}</font></font></font> </div>
</p></div>
<p>Le catch sur une exception n&rsquo;est plus présent&#8230;effectivement, mais de toute façon, si il n&rsquo;est plus présent, le test va échouer quoi qu&rsquo;il arrive&#8230;</p>
<p>Et selon vous, la couverture du code de test est-elle importante ? Cette méthode vous semble-t&rsquo;elle valide ?</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Article DVP] Introduction a SubSonic</title>
		<link>https://blog.developpez.com/philippe/p7512/net/article_dvp_introduction_a_subsonic</link>
		<comments>https://blog.developpez.com/philippe/p7512/net/article_dvp_introduction_a_subsonic#comments</comments>
		<pubDate>Wed, 22 Apr 2009 07:18:00 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[SubSonic]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Aujourd&#8217;hui, jour de sortie d&#8217;article Apres pas mal de transpiration (premières lignes écrites en Décembre), voila un tutoriel sur l&#8217;utilisation de base de SubSonic (SubSonic, c&#8217;est bon, mangez-en ) L&#8217;article est présent ici : http://philippe.developpez.com/articles/Subsonic/ Le bon coté,  c&#8217;est que maintenant que l&#8217;article est publie, je vais pouvoir parler un peu plus de SubSonic sur ce blog (avant, je n&#8217;avais pas de référence en français a fournir ) Maintenant, allez télécharger SubSonic, et commencez a [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Aujourd&rsquo;hui, jour de sortie d&rsquo;article <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p>Apres pas mal de transpiration (premières lignes écrites en Décembre), voila un tutoriel sur l&rsquo;utilisation de base de SubSonic (SubSonic, c&rsquo;est bon, mangez-en <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> )</p>
<p>L&rsquo;article est présent ici :</p>
<p><a title="http://philippe.developpez.com/articles/Subsonic/" href="http://philippe.developpez.com/articles/Subsonic/">http://philippe.developpez.com/articles/Subsonic/</a></p>
<p>Le bon coté,  c&rsquo;est que maintenant que l&rsquo;article est publie, je vais pouvoir parler un peu plus de SubSonic sur ce blog (avant, je n&rsquo;avais pas de référence en français a fournir <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /> )</p>
<p>Maintenant, allez télécharger SubSonic, et commencez a travailler avec une DAL propre et facile a utiliser en moins de temps qu&rsquo;il ne vous en a fallu pour lire ce post&#8230;</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[SubSonic] Utiliser l’objet InlineQuery</title>
		<link>https://blog.developpez.com/philippe/p7544/net/subsonic_inlinequery</link>
		<comments>https://blog.developpez.com/philippe/p7544/net/subsonic_inlinequery#comments</comments>
		<pubDate>Mon, 27 Apr 2009 20:23:00 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[SubSonic]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[J&#8217;avais complètement oublié de le mentionner dans mon article précédent sur SubSonic, mais, de toutes les nouveautés de SubSonic dans la version 2.1, une des plus utiles quand on en à besoin est l&#8217;objet InlineQuery. En effet, comme je le montrais (et si vous n&#8217;avez pas lu l&#8217;article, allez-y maintenant ), SubSonic peut se révéler très puissant pour travailler avec des opérations de type CRUD, ainsi que pour le mapping des objets de la base [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>J&rsquo;avais complètement oublié de le mentionner dans mon article précédent sur SubSonic, mais, de toutes les nouveautés de SubSonic dans la version 2.1, une des plus utiles quand on en à besoin est l&rsquo;objet InlineQuery.</p>
<p>En effet, comme je le montrais (et si vous n&rsquo;avez pas lu l&rsquo;article, <a href="http://philippe.developpez.com/articles/Subsonic">allez-y maintenant</a> <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> ), SubSonic peut se révéler très puissant pour travailler avec des opérations de type CRUD, ainsi que pour le mapping des objets de la base de données avec les objets .net, mais qu&rsquo;en est-il des requêtes &laquo;&nbsp;tordues&nbsp;&raquo; ou &laquo;&nbsp;bizarres&nbsp;&raquo; avec lesquelles on est régulièrement forcé de travailler (et je ne vous parle pas des requêtes dont on hérite avec la maintenance d&rsquo;une application vieille de quelques années :-/.) ?</p>
<p>Est-ce que je ne vais pas avoir aussi vite fait de tout me taper à la main ?</p>
<p>Dans les versions précédentes, on avait grosso modo deux choix :</p>
<ol>
<li>Créer une vue ou une procédure stockée (en fonction de l&rsquo;action), et appeler la vue ou l&rsquo;action à partir de SubSonic</li>
<li>Avoir un moyen annexe pour &laquo;&nbsp;shooter&nbsp;&raquo; des requêtes directement dans la base (oui, un bon vieux select, avec un datareader, des dataset, des connections, t tout le toutim.)</li>
</ol>
<p>Depuis la version 2, on à enfin un nouveau choix, plus &laquo;&nbsp;propre&nbsp;&raquo;, et surtout plus rapide à mettre en ouvre, vous l&rsquo;aurez deviné, l&rsquo;objet InlineQuery.</p>
<p>En terme de code, il suffit de faire :</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Consolas"><font size="2"></font><font color="#800000"><span style="background-color: #efefe4">ContactCollection</span><font color="#000000"> </font><font color="#0080c0">contacts</font><font color="#000000"> </font><font color="#000096">=</font><font color="#000000"> </font><font color="#000096">new</font><font color="#000000"> </font><font color="#800000">InlineQuery</font><font color="#000000">()           <br />    </font><font color="#000096">.</font><font color="#0080c0">ExecuteAsCollection</font>&lt;<font color="#800000">ContactCollection</font>&gt;<font color="#000000">(</font><font color="#0000ff">&laquo;&nbsp;SELECT * from Contact Where surname = @surname&nbsp;&raquo;</font><font color="#000000">, </font><font color="#0000ff">&laquo;&nbsp;Vialatte&nbsp;&raquo;</font><font color="#000000">);</font></font></font> </div>
</p></div>
<p>(Ceci est évidemment un exemple simpliste, mais c&rsquo;est pour donner une idée).</p>
<p>Dans l&rsquo;exemple du dessus, le @surname va permettre à SubSonic de créer une requête paramétrée directement. Si on avait voulu ajouter plus de paramètres, la fonction attends un tableau d&rsquo;objets, on peut donc se lâcher ;).</p>
<p>InlineQuery propose aussi des méthodes renvoyant des DataReader, des DataSets, des scalaires (wow, un ExecuteScalar&lt;T&gt; <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> ), et même un ExecuteTypedList, pour renvoyer une liste de T.</p>
<p>Voila, facile, pas cher, que du bonheur <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
