<?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>A la Poursuite du Code en Rouge &#187; Java</title>
	<atom:link href="http://www.schwinl.net/tag/java/feed" rel="self" type="application/rss+xml" />
	<link>http://www.schwinl.net</link>
	<description>Le blog de Guillaume Rams sur le génie logiciel</description>
	<lastBuildDate>Thu, 02 Feb 2012 20:43:34 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Dessine-moi un POJO&#8230;</title>
		<link>http://www.schwinl.net/articles/dessine-moi-un-pojo</link>
		<comments>http://www.schwinl.net/articles/dessine-moi-un-pojo#comments</comments>
		<pubDate>Thu, 12 Feb 2009 22:56:14 +0000</pubDate>
		<dc:creator>Guillaume</dc:creator>
				<category><![CDATA[Génie Logiciel]]></category>
		<category><![CDATA[Sauf cross-post]]></category>
		<category><![CDATA[Définition]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[POJO]]></category>

		<guid isPermaLink="false">http://www.schwinl.net/?p=138</guid>
		<description><![CDATA[Lu dans la doc d&#8217;un framework : &#171;&#160;un CouteauDeTable est une classe Java standard (ou POJO) qui sert à couper viande ou légume. Il doit sous-classer AbstractCouteau, n&#8217;utiliser dans ses signatures que les types Lame et Manche, avoir un constructeur comme ceci et des attributs comme cela. Et son nom doit finir par CouteauImpl.&#160;&#187; C&#8217;est-à-dire, [...]]]></description>
			<content:encoded><![CDATA[<p>Lu dans la doc d&#8217;un framework : &laquo;&nbsp;un CouteauDeTable est une classe Java standard (ou POJO) qui sert à couper viande ou légume. Il doit sous-classer AbstractCouteau, n&#8217;utiliser dans ses signatures que les types Lame et Manche, avoir un constructeur comme ceci et des attributs comme cela. Et son nom doit finir par CouteauImpl.&nbsp;&raquo; <img src='http://www.schwinl.net/wp-content/plugins/tango-smileys-extended/tango24/bug-eyes.png' alt='Eek!' title='Eek!' class='tse-smiley' height='24' width='24' /> C&#8217;est-à-dire, tout SAUF un POJO :ermm: !</p>
<p>Ce terme est de plus en plus utilisé comme synonyme de &laquo;&nbsp;classe Java&nbsp;&raquo;, ce qui est une erreur. Alors, qu&#8217;est-ce qu&#8217;un <a href="http://www.martinfowler.com/bliki/POJO.html">POJO</a> au juste ? Et bien, ma définition en serait : <strong>une classe Java sans contraintes particulières</strong>.</p>
<p>En fait, il n&#8217;y a pas de POJO sans framework. Un framework peut vous demander de sous-classer telle ou telle classe, respecter telle convention de nommage, limiter ci, imposer cela. A l&#8217;opposé (et un peu en réaction aux EJB), on parle de POJO quand le framework justement n&#8217;impose rien sur vos classes Java : vous développez old-school, classes et interfaces sont conçues librement.</p>
<p>Exemple de framework pas-POJO-du-tout :</p>
<p>&laquo;&nbsp;Sous-classez com.framework.AbstractPrintableObject, avec un constructeur public à un paramètre de type com.framework.PrintEnvironment. Ne définissez que des méthodes publiques non synchronisées qui lèvent comme exceptions des sous-classes de com.framework.PrintException. etc&#8230; etc&#8230;&nbsp;&raquo;</p>
<p>Le même, façon j&#8217;aime-les-POJO :</p>
<p>&laquo;&nbsp;Passez-lui un POJO, le framework d&#8217;impression essaiera de découvrir ses getters publics et de construire une représentation textuelle imprimable.&nbsp;&raquo;</p>
<p>Je précise que j&#8217;écris ça dans un souci d&#8217;illustration, loin de moi l&#8217;idée de suggérer une quelconque supériorité d&#8217;une approche tout-POJO par rapport au framework de grand-papa qui offre un lot de superclasses abstraites. Par exemple, je trouve l&#8217;approche &laquo;&nbsp;pur-POJOs (ah oui, plus plein d&#8217;annotations)&nbsp;&raquo; un peu hypocrite&#8230; :whistle:</p>
]]></content:encoded>
			<wfw:commentRss>http://www.schwinl.net/articles/dessine-moi-un-pojo/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ohmerde4j</title>
		<link>http://www.schwinl.net/articles/crap4j</link>
		<comments>http://www.schwinl.net/articles/crap4j#comments</comments>
		<pubDate>Tue, 06 Nov 2007 22:26:28 +0000</pubDate>
		<dc:creator>Guillaume</dc:creator>
				<category><![CDATA[Génie Logiciel]]></category>
		<category><![CDATA[Sauf cross-post]]></category>
		<category><![CDATA[crap4j]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Métrique]]></category>
		<category><![CDATA[Qualité de code]]></category>

		<guid isPermaLink="false">http://www.schwinl.net/archives/6</guid>
		<description><![CDATA[Alors, prenons le prochain ticket d&#8217;incident&#8230; voilà. bla bla bla&#8230; mmmh. OK. Ça doit pas être bien compliqué ça devrait se trouver quelque part dans cette classe, là. Tiens, je l&#8217;ai jamais ouverte celle-là. Allons-y, Ctrl+Shift+T, OK, de quoi ça a l&#8217;air ? 8O Oh meeerde&#8230; C&#8217;est précisément l&#8217;effet &#171;&#160;rôh merde&#160;&#187; qu&#8217;essaie de mesurer l&#8217;outil [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Alors, prenons le prochain ticket d&#8217;incident&#8230; voilà. bla bla bla&#8230; <img src='http://www.schwinl.net/wp-content/plugins/tango-smileys-extended/tango24/neutral.png' alt='Neutral' title='Neutral' class='tse-smiley' height='24' width='24' /> mmmh. OK. Ça doit pas être bien compliqué ça devrait se trouver quelque part dans cette classe, là. Tiens, je l&#8217;ai jamais ouverte celle-là. Allons-y, <code>Ctrl+Shift+T</code>, OK, de quoi ça a l&#8217;air ? 8O Oh <em>meeerde</em>&#8230;</p></blockquote>
<p>C&#8217;est précisément l&#8217;effet &laquo;&nbsp;rôh merde&nbsp;&raquo; qu&#8217;essaie de mesurer l&#8217;outil <a href="http://www.crap4j.org/" target="_blank">Crap4j</a>, via la métrique <strong>CRAP (<em>Change Risk Analysis and Predictions</em>)</strong>, ou bien, en français, l&#8217;<em>ohmerditude</em>. Cette traduction en vaut une autre, et puis j&#8217;aime bien le <a href="http://fr.wiktionary.org/wiki/-itude" target="_blank">suffixe &laquo;&nbsp;-itude&nbsp;&raquo;</a> <img src='http://www.schwinl.net/wp-content/plugins/tango-smileys-extended/tango24/grin.png' alt='Grin' title='Grin' class='tse-smiley' height='24' width='24' /> .</p>
<p>Ce qui me plaît dans cette métrique, c&#8217;est que, pour une fois, on part de la <span style="text-decoration: underline;">question</span> avant de parler de chiffres. Je n&#8217;aime pas l&#8217;approche qui consiste à constituer des tableaux de chiffres sans fin, qui certes donnent un air très savant, mais qu&#8217;on est bien en peine d&#8217;exploiter <img src='http://www.schwinl.net/wp-content/plugins/tango-smileys-extended/tango24/eyeroll.png' alt='Rolls Eyes' title='Rolls Eyes' class='tse-smiley' height='24' width='24' /> . A travers l&#8217;<em>ohmerditude</em>, dans le but de vérifier qu&#8217;un code est maintenable, on essaie de répondre à la question &laquo;&nbsp;un développeur va-t&#8217;il trouver risqué de modifier ce code lors d&#8217;une maintenance ?&nbsp;&raquo;. Si oui, on prend le risque que personne ne touche plus à ce code qu&#8217;entre deux doigts, le bras tendu et en se pinçant le nez de l&#8217;autre main (voir fig. 2 <img src='http://www.schwinl.net/wp-content/plugins/tango-smileys-extended/tango24/wink.png' alt='Wink' title='Wink' class='tse-smiley' height='24' width='24' /> ). Les développeurs vont ajouter tout autour de cette boîte noire des couches et des couches de rustines et contournements de moins en moins maintenables <img src='http://www.schwinl.net/wp-content/plugins/tango-smileys-extended/tango24/crying.png' alt='Cry' title='Cry' class='tse-smiley' height='24' width='24' /> .</p>
<p><img src='http://www.schwinl.net/wp-content/plugins/tango-smileys-extended/tango24/lamp.png' alt='Lamp' title='Lamp' class='tse-smiley' height='24' width='24' /> Maintenant que vous touchez du doigt tout l&#8217;intérêt potentiel de cette métrique, intéressons-nous à son calcul. La formule est un dosage pifométrique de complexité cyclomatique et de couverture de tests. En gros, un code sera &laquo;&nbsp;crappy&nbsp;&raquo; (ou &laquo;&nbsp;ohmerdique&nbsp;&raquo; si vous préférez) si il est (<em>1</em>) très complexe et (<em>2</em>) très peu testé. Un code très simple sans test ou un code complexe mais très bien testé seront considérés comme acceptables.</p>
<p>Crap4j mélange donc le nombre de <em>conditions </em>à tester avec la couverture de <em>lignes</em> des tests&#8230; mmmmh. <img src='http://www.schwinl.net/wp-content/plugins/tango-smileys-extended/tango24/neutral.png' alt='Neutral' title='Neutral' class='tse-smiley' height='24' width='24' /> bon, on a vu pire. Plus exactement, Crap utilise le taux de lignes non couvertes. Si l’on pose l’hypothèse que les décisions sont uniformément réparties dans les lignes de code, alors cette mesure serait une sorte d&#8217;estimation de la quantité de décisions non testées. Malheureusement je ne connais pas d’éléments qui viendraient confirmer cette hypothèse, et ça serait quand même peu fiable.</p>
<h3>Quel usage ?</h3>
<p>Prise en tant que métrique isolée, cette mesure ne serait pas passionnante. Par contre, je l&#8217;utiliserais comme indicateur de <em>testabilité</em> et de <em>possibilité de changement</em>. Selon l&#8217;ISO-9126, <em>testability</em> et <em>changeability</em> sont bien des sous-caractéristiques de <em>maintainability</em>, on est bien en élément de réponse à la question initiale. Et comme la norme laisse complètement libre la façon de calculer des indicateurs pour les sous-caractéristiques qualité (ce qui est la façon normative de dire &laquo;&nbsp;démerdez-vous on vous donnera pas la formule&nbsp;&raquo;), Crap peut être utilisé comme formule de calcul de testabilité &laquo;&nbsp;sur étagère&nbsp;&raquo;, qui présente l&#8217;avantage d&#8217;être simple à expliquer, rapide à mettre en oeuvre et déjà outillée.</p>
<p>A condition que vous n’ayez pas déjà d’outil de mesure qualité qui vous permette de consolider différentes mesures, et à condition également de calibrer crap4j en fonction de vos exigences, celui-ci peut constituer un premier niveau d&#8217;outillage qui vous incitera peut-être à aller plus loin.</p>
<p>On préférera peut-être la version produisant des rapports (via ant, à intégrer à son build continu, donc) que la version plug-in eclipse : le public visé pour cet <strong>indicateur de risque qu&#8217;un changement soit non testé </strong>me semble plutôt le gestionnaire (chef de projet par exemple) que le développeur, qui va probablement garder sous les yeux dans son IDE des règles de codage plus immédiatement &laquo;&nbsp;actionnables&nbsp;&raquo;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.schwinl.net/articles/crap4j/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

