<?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>@Repository(&#34;djo&#34;) &#187; Introduction à Scala</title>
	<atom:link href="https://blog.developpez.com/djo-mos/pcategory/java/scala/introduction-a-scala/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/djo-mos</link>
	<description></description>
	<lastBuildDate>Sun, 27 Sep 2009 00:05:37 +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>Introduction à Scala : Méthodes et Fonctions</title>
		<link>https://blog.developpez.com/djo-mos/p6161/java/scala/introduction_a_scala_methodes_et_fonctio</link>
		<comments>https://blog.developpez.com/djo-mos/p6161/java/scala/introduction_a_scala_methodes_et_fonctio#comments</comments>
		<pubDate>Mon, 04 Aug 2008 08:28:45 +0000</pubDate>
		<dc:creator><![CDATA[djo.mos]]></dc:creator>
				<category><![CDATA[Introduction à Scala]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans ce troisième volet de la série &#171;&#160;Introduction à Scala&#160;&#187;, je vais présenter la notion de méthodes et fonctions de Scala, qui est bien plus puissante que celle dans Java, dans la mesure où les fonction dans Scala sont des objets à part entière, pouvant être stockées dans une variable, passées ou retournées par une autre méthode, etc. 1. Présentation La définition d&#8217;une méthode en Scala se présente comme suit: [private&#124;protected] [override] def nom [paramètres] [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><img src="http://farm3.static.flickr.com/2047/2373244137_2bddf36de4_o.png" alt="Scala" title="" align="left"/>Dans ce troisième volet de la série &laquo;&nbsp;Introduction à Scala&nbsp;&raquo;, je vais présenter la notion de méthodes et fonctions de Scala, qui est bien plus puissante que celle dans Java, dans la mesure où les fonction dans Scala sont des objets à part entière, pouvant être stockées dans une variable, passées ou retournées par une autre méthode, etc.</p>
<p><span id="more-146"></span></p>
<h1 style="text-align: left">1. Présentation</h1>
<p>La définition d&rsquo;une méthode en Scala se présente comme suit:</p>
<p><em><code class="codecolorer text default"><span class="text">[private|protected] [override] def nom [paramètres] [type de retour] [corps]</span></code></em></p>
<p>Ici, ce qui est entre [ ] dénote un élément optionnel.</p>
<p>Notez l&rsquo;utilisation du mot clé <strong>def</strong> pour définir une fonction.<br />
Dans Scala, et tout comme pour les définitions des classes, la visibilité par défaut est public, à moins qu&rsquo;on précise explicitement la visibilité privée (via private) ou protégée (via protected).</p>
<p>Tout comme Java, les fonctions dans Scala sont virtuelles par défaut. Par contre, et à l&rsquo;inverse de Java, pour redéfinir une méthode virtuelle, il faut le préciser explicitement avec le mot clé override, ce qui permet d&rsquo;éviter quelques séances intensives de débogage pour comprendre l&rsquo;origine de bugs bizarroïdes <img src="https://blog.developpez.com/djo-mos/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /> (C&rsquo;est la même approche que celle prise par C#).</p>
<p>La partie paramètres d&rsquo;une fonction est un peu différente de celle de Java et ce pour diverses raisons:<br />
&#8211; Tout d&rsquo;abord, à cause de la convention Pascal pour les déclarations (nom:Type)<br />
&#8211; Mais aussi le fait que les parenthèses sont complètement optionnelles pour les méthodes sans arguments<br />
&#8211; Et enfin, une fonction peut déclarer plusieurs listes de paramètres (j&rsquo;y reviendrais plus tard)</p>
<p>J&rsquo;ai déjà montré quelques exemples de méthodes avec les getters et les setters.<br />
En voici une autre:</p>
<p><img src="http://farm4.static.flickr.com/3273/2730586977_e9014fc605_o.png" alt="Code Scala" title="" /></p>
<p>Cette méthode augmente l&rsquo;age de la personne de n années.<br />
Son invocation n&rsquo;a rien d&rsquo;exceptionnel, et se présente comme suit:</p>
<p><img src="http://farm4.static.flickr.com/3153/2730586981_93b901eb9f_o.png" alt="Code Scala" title="" /></p>
<p>Cette méthode montre entre autres comment le type de retour est optionnel. D&rsquo;ailleurs, elle ne le déclare pas. La définition exacte aurait été:</p>
<p><img src="http://farm4.static.flickr.com/3217/2730586983_794721d3ce_o.png" alt="Code Scala" title="" /></p>
<h1 style="text-align: left">2. De l&rsquo;objet au fonctionnel</h1>
<p>Dans cette partie, je vais montrer l&rsquo;aspect fonctionnel de Scala à travers un exemple où on part d&rsquo;une implémentation à base des paradigmes de l&rsquo;OO, puis en convertissant vers une approche plus fonctionnelle.</p>
<h2 style="text-align: left">2.1. La version OO</h2>
<p>Il s&rsquo;agit tout simplement d&rsquo;implémenter une méthode qui effectue un traitement d&rsquo;une façon répétitive mais périodique.<br />
Dans l&rsquo;approche OO (et Java plus précisément), on commencerait par créer une interface qui définit une méthode.<br />
Puis, on créerait une méthode qui prend cette interface comme paramètre ainsi que la période de répétition.</p>
<p>Voici une implémentation de cette approche en Scala :</p>
<p><img src="http://farm4.static.flickr.com/3010/2730586987_8748d5e516_o.png" alt="Code Scala" title="" /></p>
<p>J&rsquo;ai défini un trait Action (la chose qui ressemble le plus à une interface dans Scala) avec une méthode <em>doSomething</em>.<br />
J&rsquo;ai ensuite crée une implémentation <em>PingAction</em> de ce trait qui ne fait qu&rsquo;afficher le message &laquo;&nbsp;ping&nbsp;&raquo; dans la sortie standard (j&rsquo;ai utilisé <em><strong>object</strong></em> au lieu de <em>class</em> tout simplement pour avoir un singelton).<br />
J&rsquo;ai aussi défini une méthode <em>doPeriodically</em> qui prend un <em>Action</em> et un entier comme paramètres, et qui répète l&rsquo;exécution de l&rsquo;action indéfiniment tout en &laquo;&nbsp;dormant&nbsp;&raquo; à chaque itération.</p>
<p>Voici à titre de comparaison la version Java de ceci:</p>
<p><img src="http://farm4.static.flickr.com/3131/2730586991_f6419b810e_o.png" alt="Code Scala" title="" /></p>
<h2 style="text-align: left">2.2. La version fonctionnelle</h2>
<p>En relisant le code précédent,  on constate que malgré le fait qu&rsquo;on a seulement besoin d&rsquo;une méthode à exécuter périodiquement, on est obligé de construire plein de plomberie sans réel apport pour pouvoir y arriver, i.e. définir une interface, faire implémenter cette interface par une classe, et passage d&rsquo;une instance de l&rsquo;implémentation à la méthode d&rsquo;exécution.</p>
<p>Or, ceci n&rsquo;est aucunement nécessaire dans un langage fonctionnel comme Scala, où une méthode est un type de données comme les autres, c&rsquo;est à dire que l&rsquo;on peut écrire une méthode qui prend une méthode comme paramètre.</p>
<p>La définition du type d&rsquo;une méthode en Scala se présente comme suit :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">([paramètres]) =&gt; type-de-retour</div></div>
<p>Par exemple, une fonction mathématique comme le sinus ou le consinus admet le type suivant:</p>
<p><code class="codecolorer text default"><span class="text">(Float) =&gt; Float</span></code></p>
<p>C&rsquo;est à dire que c&rsquo;est une fonction qui prend un <em>float</em> (réel) en paramètre et retourne aussi un réel.</p>
<p>Pour revenir à notre exemple, la méthode <em>doPeriodically</em> a besoin d&rsquo;une méthode qui ne prend aucun paramètre et qui ne retourne rien, ce qui correspond au type :</p>
<p><code class="codecolorer text default"><span class="text">() =&gt; Unit</span></code></p>
<p><em><strong>Unit</strong></em> en Scala correspond au <em>void</em> de Java.<br />
Voici donc une nouvelle version du programme précédent utilisant ces nouvelles données :</p>
<p><img src="http://farm4.static.flickr.com/3249/2730586993_d27f61637f_o.png" alt="Code Scala" title="" /></p>
<p>En gros, plus d&rsquo;interface à implémenter ou d&rsquo;objets à passer : on passe directement une méthode telle quelle à une autre fonction (via son nom), et celle-ci peut dès lors l&rsquo;invoquer (toujours via son nom).</p>
<h1 style="text-align: left">3. Concrètement</h1>
<p>En fait, la notation &laquo;&nbsp;<code class="codecolorer text default"><span class="text">(params) =&gt; type-du-résultat</span></code>&nbsp;&raquo; n&rsquo;est que du sucre syntaxique fourni par Scala pour simplifier l&rsquo;utilisation des fonctions.<br />
Concrètement, les fonctions sont représentées par un ensemble de traits <strong><em>FunctionN</em></strong> où <em>N</em> dénote le nombre de paramètres qu&rsquo;elle prend.</p>
<p>Par exemple, le type de fonction ne prenant pas de paramètres est représenté par <em>Function0[+R]</em>, où le <em>R</em> dénote le type de retour, tandis qu&rsquo;une fonction prenant un seul paramètre est représentée par <em>Function1[-T1, +R]</em>, où <em>T1</em> est le type du paramètre et <em>R</em> le type de retour.</p>
<p>Dans tous les cas, ces traits définissent une méthode abstraite <em>apply</em> qui dans le cas de <em>Function1</em> par exemple est définie comme suit:</p>
<p><code class="codecolorer text default"><span class="text">apply &nbsp;(v1 : T1) : R</span></code></p>
<h1 style="text-align: left">4. Higher order functions</h1>
<p>En utilisant ce qu&rsquo;on vient de voir, il devient possible de coder des trucs vraiment intéressant avec les fonctions, genre une méthode qui combine deux fonctions en une nouvelle fonction par exemple.<br />
Ce type de fonctions s&rsquo;appelle fonctions d&rsquo;ordre supérieur, ou &laquo;&nbsp;<em><a href="http://en.wikipedia.org/wiki/Higher-order_function">Higer Order Functions</a></em>&laquo;&nbsp;.<br />
A titre d&rsquo;exemple, voici une implémentation en Scala de la fonction &laquo;&nbsp;rond&nbsp;&raquo;, dénoté&nbsp;&raquo; par &laquo;&nbsp;o&nbsp;&raquo; en Mathématiques.</p>
<p>Petit rappel : <code class="codecolorer text default"><span class="text">f o g (x) = f(g(x))</span></code></p>
<p><img src="http://farm4.static.flickr.com/3053/2730589557_39a3a97da3_o.png" alt="Code Scala" title="" /></p>
<p>Je commence par déclarer un nouveau type <em>MathFunc</em> qui est <code class="codecolorer text default"><span class="text">(Float) =&gt; Float</span></code>, où encore une fonction prenant un <em>float</em> comme paramètre et retournant un <em>float</em> (C&rsquo;est strictement optionnel, et uniquement dans le but de simplifier le code).</p>
<p>Je code ensuite la fonction rond qui prend deux <em>MathFunc</em> f et g en paramètre et retourne un <em>MathFunc</em>, i.e une nouvelle fonction de type <em>MathFunc</em> et qui devrait correspondre ) f o g.<br />
Comme résultat, cette méthode retourne une nouvelle instance de <em>Function1[Float, Float]</em> dont la méthode <em>apply</em> retourne <em>f(g(x))</em>.</p>
<p>Dans la méthode main, je montre un exemple d&rsquo;utilisation de cette fonction en combinant deux fonctions f et g que j&rsquo;ai défini.</p>
<p><b>Remarque</b> : Veuillez notez que la composition de fonctions que je viens de montrer est déjà implémentée dans Scala par les traits <em>Function*</em>, via la méthode compose.</p>
<p>Maintenant, à titre d&rsquo;exemple (que je ne vais pas expliquer), et juste pour montrer la puissance de Scala et sa flexibilité, voici un bout de code qui permet de remplacer le &laquo;&nbsp;<em>rond(f, g)</em>&nbsp;&raquo; de l&rsquo;exemple précédent par la notation plus naturelle &laquo;&nbsp;<em>f o g</em>&nbsp;&raquo; (La ligne surlignée en bleu clair):</p>
<p><img src="http://farm4.static.flickr.com/3291/2730589563_e269c8f12a_o.png" alt="Code Scala" title="" /></p>
<h1 style="text-align: left">5. Currying</h1>
<p><em><ins>Cette section a été corrigée suite à une remarque de SpaceGuid. Merci à lui</ins></em></p>
<p>Le <em><strong><a href="http://en.wikipedia.org/wiki/Currying">currying</a></strong></em> est une technique qui consiste à fixer la valeur de quelques uns des paramètres d&rsquo;une fonction pour en créer une nouvelle qui prend les autres paramètres et qui retourne le résultat de l&rsquo;originale.</p>
<p>Plus abstraitement, étant donné une fonction de type <em>(X x Y) => Z</em> (prend un paramètre de type X et un autre de type Y, et retourne un résultat de type Z), sa currification la transforme en fonction de type <em>X => (Y => Z)</em>, c&rsquo;est à dire une fonction prenant un paramètre de type X, et retournant une fonction qui prend un paramètre de type Y et retournant un résultat de type Z.</p>
<p>Par exemple, étant donné une fonction <em>mul</em> qui prend 2 paramètres x et y et qui retourne x*y (très intéressante et puissante comme fonction :D), on peut en dériver une fonction double qui prend un seul paramètre x et qui retourne son double (2*x) en fixant la valeur de y à &laquo;&nbsp;2&nbsp;&raquo;.</p>
<p>Le currying est très simple et intuitif à mettre en place avec Scala. Jugez vous en par vous même à travers cet exemple :</p>
<p><img src="http://farm4.static.flickr.com/3211/2740476683_8ff850826f_o.png" alt="Code Scala" title="" /></p>
<p><ins>En gros, j&rsquo;ai fait le currying de la fonction mul(x)(y) en fixant la valeur du paramètre x à 2 (via mul(2)), ce qui donne naissance à une nouvelle fonction qui ne prend plus qu&rsquo;un seul paramètre et qui le multiplie par 2.</ins></p>
<h1 style="text-align: left">6. Exemple: Collections Scala</h1>
<p>Les collections de Scala utilisent intensivement l&rsquo;aspect fonctionnel du langage, ce qui permet de réaliser des traitements complexes sur une liste d&rsquo;une façon intuitive et fluide.</p>
<p>Je vais commencer par montrer quelques exemple simples, pour finir avec d&rsquo;autres plus complexes.</p>
<h2 style="text-align: left">6.1. Exemples simples</h2>
<p><img src="http://farm4.static.flickr.com/3140/2730589575_c81ca92d87_o.png" alt="Code Scala" title="" /></p>
<p>Les commentaires expliquent ce que fait chaque méthode.<br />
Notez que j&rsquo;ai usé du <em>type-inference</em> du compilateur Scala pour pouvoir écrire </p>
<p><code class="codecolorer text default"><span class="text">(x, y) =&gt; x + y</span></code></p>
<p>par exemple en omettant les types des arguments :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(x : Int, y : Int) =&gt; x + y</div></div>
<h2 style="text-align: left">6.2. Ne joues pas au plus &laquo;&nbsp;Perl&nbsp;&raquo; avec Scala !</h2>
<p>Maintenant, je vais présenter les même exemples de la section précédente, mais en introduisant la &laquo;&nbsp;Perl touch&nbsp;&raquo;, i.e. quelques hiéroglyphes magiques qui réduisent considérablement la taille de code (mais au risque de réduire autant la lisibilité du code).<br />
L&rsquo;hiéroglyphe magique en question dans Scala est le &laquo;&nbsp;_&nbsp;&raquo;, qui représente le joker (% dans le SQL, ? dans les expressions régulières, * dans les noms de fichiers, etc.).<br />
Il a plusieurs connotations dans Scala et ce selon où il est utilisé.<br />
Dans le cas des <em>closures</em>, il permet de représenter un paramètre d&rsquo;une fonction.<br />
Par exemple, &laquo;&nbsp;<code class="codecolorer text default"><span class="text">(x) =&gt; 2 * x</span></code>&nbsp;&raquo; peut être ré-écrit en &laquo;&nbsp;<code class="codecolorer text default"><span class="text">2 * _</span></code>&laquo;&nbsp;, et le compilateur Scala est assez malin pour savoir ce qui va dans le slot &laquo;&nbsp;_&nbsp;&raquo;. De même, le compilateur peut se débrouiller avec un truc comme &laquo;&nbsp;<code class="codecolorer text default"><span class="text">_ + _</span></code>&nbsp;&raquo; qui correspond à &laquo;&nbsp;<code class="codecolorer text default"><span class="text">(x, y)=&gt; x + y</span></code>&nbsp;&raquo; peut devenir .<br />
Ainsi, le code précédant devient :</p>
<p><img src="http://farm4.static.flickr.com/3173/2730589579_6e976b87ce_o.png" alt="Code Scala" title="" /></p>
<h2 style="text-align: left">6.3. Exemple plus complexe</h2>
<p><img src="http://farm4.static.flickr.com/3265/2730589581_2a98b7e58e_o.png" alt="Code Scala" title="" /></p>
<p>No comment ! en fait si, un commentaire : dans Scala, ça bloque pas, c&rsquo;est très fluide <img src="https://blog.developpez.com/djo-mos/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /></p>
<h1 style="text-align: left">Conclusion</h1>
<p>Voilà, ainsi s&rsquo;entame le troisième volet de l&rsquo;introduction à Scala qui a servi, je l&rsquo;espère, à présenter l&rsquo;aspect fonctionnel de Scala via le.<br />
Dans le prochain volet, ce serait le tour des <strong><em>traits</em></strong>, une sorte d&rsquo;interfaces Java aux stéroïdes.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Introduction à Scala : Les Traits</title>
		<link>https://blog.developpez.com/djo-mos/p6209/java/scala/title_103</link>
		<comments>https://blog.developpez.com/djo-mos/p6209/java/scala/title_103#comments</comments>
		<pubDate>Mon, 25 Aug 2008 11:11:13 +0000</pubDate>
		<dc:creator><![CDATA[djo.mos]]></dc:creator>
				<category><![CDATA[Introduction à Scala]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans ce quatrième volet de la série &#171;&#160;Introduction à Scala&#160;&#187;, je vais présenter la notion des traits dans Scala, qui sont ce qui ressemble le plus aux interfaces de Java. 1. Présentation La définition d&#8217;un trait en Scala se présente comme suit: trait nom [extends un-trait &#124; une-classe [with un-autre-trait ...] ] Ici, ce qui est entre [ ] dénote un élément optionnel, le &#124; indique que l&#8217;une ou l&#8217;autre des alternative est applicable, et [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><img src="http://farm4.static.flickr.com/3156/2783562997_b7e0c3fd12_o.png" alt="[Scala]" align="left"/>Dans ce quatrième volet de la série &laquo;&nbsp;Introduction à Scala&nbsp;&raquo;, je vais présenter la notion des traits dans Scala, qui sont ce qui ressemble le plus aux interfaces de Java.</p>
<p><span id="more-147"></span></p>
<h1 style="text-align: left">1. Présentation</h1>
<p>La définition d&rsquo;un trait en Scala se présente comme suit:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">trait nom [extends un-trait | une-classe [with un-autre-trait ...] ]</div></div>
<p>Ici, ce qui est entre <strong>[ ]</strong> dénote un élément optionnel, le <strong>|</strong> indique que l&rsquo;une ou l&rsquo;autre des alternative est applicable, et <strong>&#8230;</strong> indique que ce qui précède peut être répété à volonté.</p>
<p>Bref, le plus important c&rsquo;est le mot clé &laquo;&nbsp;<em><strong>trait</strong></em>&laquo;&nbsp;, qui la différencie d&rsquo;une classe ordinaire.</p>
<p>Voici un exemple d&rsquo;un trait:</p>
<p><img src="http://farm4.static.flickr.com/3202/2764497499_f607a7feb1_o.png" alt="Code Scala" title="" /></p>
<p>Ici, j&rsquo;ai défini un trait nommé <em>Action</em> qui contient une seule méthode abstraite <em>action</em>.</p>
<p>Voici maintenant une classe qui étend ce trait :</p>
<p><img src="http://farm4.static.flickr.com/3161/2764497503_d2ae72b081_o.png" alt="Code Scala" title="" /></p>
<p>Veuillez noter qu&rsquo;une classe peut étendre plusieurs traits, et ce en utilisant le mot clé <em><strong>with</strong></em> à partir du second tait étendu, comme montré dans l&rsquo;exemple suivant:</p>
<p><img src="http://farm4.static.flickr.com/3163/2764497507_b4de96d925_o.png" alt="Code Scala" title="" /></p>
<h1 style="text-align: left">2. Les traits comme des interfaces</h1>
<p>Dans une première approche, on peut utiliser les traits de Scala pour émuler les interfaces de Java, en limitant leur rôle à la définition des contrats des classes.</p>
<p>A titre d&rsquo;exemple, considérons ce bout de code :</p>
<p><img src="http://farm4.static.flickr.com/3047/2764497511_0083a6999a_o.png" alt="Code Scala" title="" /></p>
<p>J&rsquo;ai commencé par définir un trait <em>Age</em> pour représenter une entité ayant un âge, d&rsquo;où la méthode abstraite <em>age</em>.<br />
J&rsquo;ai ensuite défini un trait <em>Comparable</em> qui contient quelques méthodes permettant de comparer deux entités ayant un âge comme <em>sameAge</em>, <em>olderThan</em>, etc.</p>
<p>A la fin, j&rsquo;ai implémenté ces deux traits dans une classe <em>Person</em>.</p>
<h1 style="text-align: left">3. Les traits pour simplifier l&rsquo;implémentation</h1>
<p>La tache des classes implémentant le trait Comparable peut être grandement simplifié quand on sait que plusieurs méthodes du trait <em>Comparable</em> peuvent être déduites de deux autres méthodes de ce même trait.<br />
Par exemple, si on suppose disposer de <em>sameAge</em> et <em>olderThan</em>, on peut donc déduire le reste des méthodes :<br />
&#8211; <em>youngerThan</em> est alors <code class="codecolorer text default"><span class="text">!olderThan(that) &amp;&amp; !sameAge(that)</span></code><br />
&#8211; etc.</p>
<p>Les traits Scala, et à l&rsquo;inverse des interfaces de Java, peuvent avoir des champs et implémenter des méthodes.<br />
En tirant profit des deux points précédents, on peut ré-écrire l&rsquo;exemple précédent en :</p>
<p><img src="http://farm4.static.flickr.com/3188/2764497515_868e46b558_o.png" alt="Code Scala" title="" /></p>
<p>Ainsi, il suffit d&rsquo;implémenter 2 méthodes des 5 définies par <em>Comparable</em> pour avoir une implémentation complète.</p>
<h1 style="text-align: left">4. Utiliser les traits comme décorateurs</h1>
<p>Un autre utilisation possible des itérateurs serait des les combiner à une classe donnée en tant que décorateurs, apportant de nouvelles fonctionnalités ou modifiant les fonctionnalités existantes.</p>
<p>Pour illustrer ce concept, commençons par définir un trait représentant une opération quelconque :</p>
<p><img src="http://farm4.static.flickr.com/3202/2764497499_f607a7feb1_o.png" alt="Code Scala" title="" /></p>
<p>Ainsi qu&rsquo;une implémentation bidon, qui lance ou non, et de façon aléatoire une exception :</p>
<p><img src="http://farm4.static.flickr.com/3135/2764497517_a0a3432ddd_o.png" alt="Code Scala" title="" /></p>
<p>Je vais commencer par un décorateur simple, qui ne fait qu&rsquo;afficher un message avant l&rsquo;exécution de l&rsquo;action concrète et un autre après sa fin.<br />
Un tel décorateur se définit comme un trait ordinaire, avec quelques points à respecter :<br />
&#8211; Il doit hériter du trait définissant l&rsquo;action (<em>Action</em>)<br />
&#8211; Il doit implémenter la méthode du trait parent, tout en déclarant cette implémentation comme abstraite, pour s&rsquo;assurer que la classe d&rsquo;implémentation concrète définisse bel et bien l&rsquo;action réelle.<br />
&#8211; L&rsquo;implémentation réelle de l&rsquo;action peut alors être référencée par <code class="codecolorer text default"><span class="text">super.action()</span></code> dans le trait de décoration.</p>
<p>En suivant ces règles, le trait de <em>logging</em> s&rsquo;écrit alors :</p>
<p><img src="http://farm4.static.flickr.com/3035/2765352646_2d2d2a5bb1_o.png" alt="Code Scala" title="" /></p>
<p>Maintenant, pour combiner ce décorateur à l&rsquo;action concrète, on procède comme suit :</p>
<p><img src="http://farm4.static.flickr.com/3238/2765352648_faec7e03af_o.png" alt="Code Scala" title="" /></p>
<p>Notez l&rsquo;instanciation de l&rsquo;action concrète suivie du mot clé <em>with</em>  et du nom de du trait décorateur.</p>
<p>A l&rsquo;exécution, on obtient :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">before action <br />
TestAction <br />
after action</div></div>
<p>On peut dès lors imaginer toute sorte de décorateurs, comme par exemple un décorateur qui répète N fois l&rsquo;action tant qu&rsquo;elle lance une exception :</p>
<p><img src="http://farm4.static.flickr.com/3261/2765352650_d8e43efbe1_o.png" alt="Code Scala" title="" /></p>
<p>Ou encore un décorateur qui rend l&rsquo;exécution synchronisée :</p>
<p><img src="http://farm4.static.flickr.com/3141/2765352654_da3f2c55a6_o.png" alt="Code scala" title="" /></p>
<p>Enfin, on peut associer une classe donnée à plusieurs traits de décoration comme suit :</p>
<p><img src="http://farm4.static.flickr.com/3074/2765352656_63c6fac560_o.png" alt="Code Scala" title="" /></p>
<p>Notez que l&rsquo;ordre de l&rsquo;apparence d&rsquo;un trait dans l&rsquo;instanciation influe sur son ordre à l&rsquo;exécution : le premier trait qui apparaît serait le dernier à être exécuté, et ainsi de suite.<br />
Dans tous les cas de figure, la classe concrète serait exécutée en dernier.</p>
<p>Ainsi, dans l&rsquo;exemple précédent, l&rsquo;ordre d&rsquo;exécution serait :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">1. RetryNTimesAction <br />
2. LoggedAction <br />
3. SynchronizedAction <br />
4. TestAction.</div></div>
<h1 style="text-align: left">Conclusion</h1>
<p>Dans ce volet de l&rsquo;introduction à Scala, j&rsquo;ai présenté les traits via quelques cas d&rsquo;utilisations courants.<br />
N&rsquo;hésitez surtout pas à me communiquer vos impressions, critiques et propositions et ce en commentant dans ce même blog, ou via messages privés (via forum).</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Introduction à Scala: Hello World</title>
		<link>https://blog.developpez.com/djo-mos/p5366/java/scala/introduction_a_scala_hello_world</link>
		<comments>https://blog.developpez.com/djo-mos/p5366/java/scala/introduction_a_scala_hello_world#comments</comments>
		<pubDate>Wed, 26 Mar 2008 19:36:01 +0000</pubDate>
		<dc:creator><![CDATA[djo.mos]]></dc:creator>
				<category><![CDATA[Introduction à Scala]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ce billet vient inaugurer une suite de billets visant à présenter quelques notions de base de Scala. Comme il se doit dans de telles occasions, je vais commencer par l&#8217;inévitable Hello World, ou plus précisément comment récupérer ce qu&#8217;il faut pour faire du Scala et comment écrire, compiler et exécuter son premier programme. Je vais commencer par les outils. Malheureusement, Scala ne dispose pas encore de tooling décent, mais ça viendra, je n&#8217;en doutes pas. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><img src="http://farm3.static.flickr.com/2047/2373244137_2bddf36de4_o.png" alt="Scala" title="" align="left" /> Ce billet vient inaugurer une suite de billets visant à présenter quelques notions de base de Scala.</p>
<p>Comme il se doit dans de telles occasions, je vais commencer par l&rsquo;inévitable Hello World, ou plus précisément comment récupérer ce qu&rsquo;il faut pour faire du Scala et comment écrire, compiler et exécuter son premier programme.<br />
<span id="more-144"></span></p>
<p>Je vais commencer par les outils.<br />
Malheureusement, Scala ne dispose pas encore de tooling décent, mais ça viendra, je n&rsquo;en doutes pas.</p>
<p>En gros, vous avez le choix entre la <em>méthode dure</em> ou encore la <em>méthode moins dure</em>.</p>
<p><strong>La méthode dure:</strong> ça consiste à télécharger la distribution Scala (la dernière version est la 2.7.0):</p>
<ul>
<li>Version Linux (<a href="http://www.scala-lang.org/downloads/distrib/files/scala-2.7.0-final.tar.gz">tar.gz: 12.2Mo</a>, <a href="http://www.scala-lang.org/downloads/distrib/files/scala-2.7.0-final.tar.bz2">tar.bz2: 11.8Mo</a>)</li>
<li>Version Windows (<a href="http://www.scala-lang.org/downloads/distrib/files/scala-2.7.0-final.zip">Zip: 13.6Mo</a>)</li>
</ul>
<p>Il faut ensuite extraire l&rsquo;archive téléchargé quelque part dans son disque (<em>${SCALA_HOME}</em>), et ajouter le dossier <em>${SCALA_HOME}/bin</em> dans le <em>PATH</em>.</p>
<p><strong>La méthode moins dure:</strong> ça consiste à passer par le plugin eclipse officiel de Scala.<br />
Faites pointer un nouveau Update site (Remote) sur cette adresse:</p>
<p>http://www.scala-lang.org/downloads/scala-plugin/</p>
<p><strong>N.B.</strong> Ce plugin nécessite eclipse 3.3.* et une JRE >= 5.0</p>
<p>Une fois le plugin installé et eclipse redémarré, vous disposerez d&rsquo;un support décent de Scala mais pas plus.</p>
<p>Le plugin offre:<br />
&#8211; Menu New:</p>
<p><img src="http://farm4.static.flickr.com/3027/2361802021_6fceee1a7c.jpg?v=0" alt="Menu New" title="Menu New" /></p>
<p>&#8211; Coloration Syntaxique</p>
<p><img src="http://farm3.static.flickr.com/2101/2361802017_4205a09ebb.jpg?v=0" alt="Coloriation syntaxique" title="Coloriation syntaxique" /></p>
<p>&#8211; Emplacement des erreurs mais pas leur messages (ne me demandez pas pourquoi)</p>
<p><img src="http://farm4.static.flickr.com/3095/2361802011_477019a7f0.jpg?v=0" alt="Erreurs" title="Erreurs" /></p>
<p>&#8211; Menu d&rsquo;exécution et de débogage (qui marche parfois <img src="https://blog.developpez.com/djo-mos/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /> )</p>
<p><img src="http://farm4.static.flickr.com/3159/2361802023_7bba5b329e.jpg?v=0" alt="Exécution" title="Exécution" /><br />
&#8211; Voilou.</p>
<p>C&rsquo;est encore très loin d&rsquo;un tooling du calibre du JDT, mais c&rsquo;est déjà infiniment plus pratique que de passer par le compilateur en ligne de commande.</p>
<p>Une fois votre environnement mis en place et configuré, il faudrait créer un fichier HelloWorld.scala avec le code suivant</p>
<p><img src="http://farm3.static.flickr.com/2227/2364726974_29827ec2e8.jpg?v=0" alt="object HelloWorld {    def main(args: Array[String]) {      val message = 'Hello World'     println(message)    }  }" title="Hello Scala !" /></p>
<p>Si vous êtes sous eclipse avec le plugin Scala, il suffit de passer par le menu Run, Run As, Scala Application.<br />
En ligne de commande, il faudrait taper les commandes suivantes:</p>
<blockquote><pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&gt;cd &quot;l'emplacement du fichier&quot; <br />
&gt;scalac HelloWorld.scala <br />
&gt;scala HelloWorld</div></div>

</pre>
</blockquote>
<p>Je vous laisse deviner la sortie de ce programme <img src="https://blog.developpez.com/djo-mos/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p>Passons maintenant à l&rsquo;analyse de ce bout de code:</p>
<p><em><strong>object HelloWorld {</strong></em><br />
Il s&rsquo;agit ici de la déclaration d&rsquo;un objet nommé HelloWorld.<br />
Dans la terminologie Scala, un objet est grosso modo l&rsquo;équivalent d&rsquo;une classe Java complètement statique. Mais en réalité, Scala ne supporte pas la notion des membres statiques et propose plutôt les objets qui sont des singletons.<br />
Si on a besoin d&rsquo;un membre statique, il faut le déclarer dans un objet.</p>
<p><em><strong>def main(args: Array[String]) {</strong></em><br />
Il s&rsquo;agit ici de définir la méthode main de l&rsquo;objet, i.e. la méthode où commence l&rsquo;exécution du programme.<br />
Une méthode est déclarée avec le mot clé <strong>def</strong> en Scala suivi par son nom, ses paramètres et son type de retour.<br />
Comme je viens de le préciser, et à l&rsquo;inverse de Java, la méthode main n&rsquo;est pas statique (Scala n&rsquo;a pas de notion de membres statiques), mais fait partie d&rsquo;un objet (singleton).</p>
<p>Les paramètres de cette méthode sont toujours précisés entre parenthèses.<br />
Là, un point capital dans Scala, les déclaration des variables est similaire à ce qu&rsquo;on fait dans Pascal, c&rsquo;est à dire de la forme &laquo;&nbsp;<em>nom_de_la_variable : type_de_la_variable</em>&nbsp;&raquo; et non pas comme dans les langages EcmaScript-like (C, C++, Java, JavaScript, etc.) où l&rsquo;on procède plutôt par: &laquo;&nbsp;<em>type_de_la_variable nom_de_la_variable</em>&nbsp;&raquo;</p>
<p>Comme pour Java, main prend un tableau de chaînes, représenté dans Scala par Array[String].<br />
Je tiens tout d&rsquo;abord à préciser que les crochets ici n&rsquo;ont rien à voir avec les tableaux, et qu&rsquo;il servent plutôt à déclarer les paramètres génériques d&rsquo;un type (équivalent aux &lt; et &gt; de Java).</p>
<p>de plus, Scala est un langage orienté objet <strong>pur</strong>, dans la mesure où tout est soit un objet, soit un passage de message (appel de méthode) entre objets.<br />
Donc exit les types primitifs (int, char, etc.) ou les types spéciaux (tableaux, etc.)<br />
Ici, Array est un objet ordinaire et à part entière tout comme les listes par exemples.</p>
<p>Un autre point important à signaler ici est que malgré le côté objet pur de Scala, <em>qui est une idée noble en théorie, mais généralement associée à de graves problèmes de performance en pratique</em>, Scala transforme les objets aux types primitifs lors de la compilation là où c&rsquo;est possible, ce qui élimine complètement les problèmes de performances.</p>
<p><em><strong>val message = &laquo;&nbsp;Hello World&nbsp;&raquo;</strong></em><br />
Il s&rsquo;agit ici d&rsquo;une déclaration de variable, ou plus exactement d&rsquo;une constante.<br />
La déclaration commence par le mot clé <em>val</em> qui est l&rsquo;équivalent du <em>final</em> de Java. On aurait pu aussi utiliser <em>var</em> au lieu de <em>val</em> pour ôter l&rsquo;aspect constant de la variable.</p>
<p>S&rsquo;en suit le nom de la variable, <em>message</em> ici, puis l&rsquo;initialisation avec le littéral &laquo;&nbsp;Hello World&nbsp;&raquo;.</p>
<p>La question qui se pose est où est le type de la variable ?<br />
Scala est un langage <strong>statiquement typé</strong>, et chaque membre doit obligatoirement avoir un type. Seulement, le compilateur de Scala est suffisamment intelligent pour reconnaître automatiquement le type d&rsquo;un membre donné pour faire éviter au programmeur d&rsquo;avoir à le spécifier explicitement tout le temps: c&rsquo;est l&rsquo;inférence de types.</p>
<p>Attention toutefois: ce n&rsquo;est pas toujours possible d&rsquo;avoir une inférence automatique, et il y&rsquo;a des cas où l&rsquo;on devrait spécifier explicitement le type de déclaration.</p>
<p>Dans ce cas-ci, vu que la partie droite de l&rsquo;assignation est un littéral de type String, Scala infère automatiquement String comme type de <em>message</em>.</p>
<p>Si on voulait plutôt s&rsquo;exercer à l&rsquo;art de <em>pourquoi-taper-moins-qunad-on-peut-taper-plus</em>, on aurait pu déclarer explicitement le type ainsi:</p>
<p><em><strong>val message : String = &laquo;&nbsp;Hello World&nbsp;&raquo;</strong></em></p>
<p>Seulement, quand est ce qu&rsquo;on sait si l&rsquo;inférence de types est possible et quand est ce que ça ne l&rsquo;est pas ?<br />
Difficile de répondre &#8230; le moteur d&rsquo;inférence de types de Scala est complexe, et il ne cesse d&rsquo;évoluer au fil des versions.<br />
En règle générale, essayez de ne pas déclarer les types jusqu&rsquo;à ce que le compilateur s&rsquo;en plaint <img src="https://blog.developpez.com/djo-mos/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p>Avant de passer à l&rsquo;instruction suivante, vous l&rsquo;aurez remarqué peut être déjà: les &laquo;&nbsp;;&nbsp;&raquo; sont optionnels dans Scala, dans la mesure où l&rsquo;on met une instruction par ligne, ce qui est, j&rsquo;espère, le cas tout le temps.<br />
<em>(Ce n&rsquo;est pas la seule condition pour ne pas mettre des ; en fin de ligne en fait)</em></p>
<p><em><strong>println(message)</strong></em><br />
L&rsquo;instruction suivante est claire: ça affiche la valeur de message dans la console.<br />
Notez juste le <em>println</em> introduit par Scala au lieu du <em>system.out.println</em>. Toutefois, il est toujours possible d&rsquo;utiliser ce dernier si vous êtes adeptes de la règle citée plus haut :), chose possible grâce au fait que Scala importe implicitement tout le <em>package java.lang</em> mais aussi la compatibilité de Scala avec Java:</p>
<ul>
<li>On peut utiliser les objets Java dans Scala</li>
<li>On peut étendre des classes Java dans Scala</li>
<li>On peut implémenter des interfaces Java avec Scala</li>
<li>Un programme Scala compilé tourne sur la JVM</li>
</ul>
<p>L&rsquo;autre sens n&rsquo;est pas vrai.</p>
<p>Ainsi s&rsquo;achève ce premier billet de la série &laquo;&nbsp;Introduction à Scala&nbsp;&raquo;, dans lequel j&rsquo;ai présenté quelques notions <em>(surfaciques)</em> sur le langage de programmation Scala.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Introduction à Scala: Classes et Objets</title>
		<link>https://blog.developpez.com/djo-mos/p5397/java/scala/introduction_a_scala_classes_et_objets</link>
		<comments>https://blog.developpez.com/djo-mos/p5397/java/scala/introduction_a_scala_classes_et_objets#comments</comments>
		<pubDate>Sun, 13 Apr 2008 18:09:54 +0000</pubDate>
		<dc:creator><![CDATA[djo.mos]]></dc:creator>
				<category><![CDATA[Introduction à Scala]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans ce second volet de l&#8217;introduction à Scala, je vais présenter comment définir et utiliser les classes et les objets avec Scala. 1. Classes 1.1. Définition d&#8217;une Classe Je vais commencer par les classes. Scala ne joue pas aux fantaisies ici, et une classe est toujours une structure regroupant champs et traitements. Voici la déclaration minimale d&#8217;une classe en Scala A l&#8217;inverse de Java, une classe est par défaut publique, donc plus besoin d&#8217;ajouter public [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><img src="http://farm3.static.flickr.com/2047/2373244137_2bddf36de4_o.png" alt="Scala" title="" align="left"/>Dans ce second volet de l&rsquo;introduction à Scala, je vais présenter comment définir et utiliser les classes et les objets avec Scala.<br />
<span id="more-145"></span></p>
<h1 style="text-align: left">1. Classes</h1>
<h2 style="text-align: left">1.1. Définition d&rsquo;une Classe</h2>
<p>Je vais commencer par les classes. Scala ne joue pas aux fantaisies ici, et une classe est toujours une structure regroupant champs et traitements.</p>
<p>Voici la déclaration minimale d&rsquo;une classe en Scala</p>
<p><img src="http://farm3.static.flickr.com/2031/2409410677_dce4512195_o.png" alt="class Person" title="" /></p>
<p>A l&rsquo;inverse de Java, une classe est par défaut publique, donc plus besoin d&rsquo;ajouter public à la déclaration.<br />
D&rsquo;ailleurs, le mot public n&rsquo;existe même pas pour Scala.<br />
Là, on peut se poser la question de ou est passé le modificateur de visibilité par défaut de Java, qui limite l&rsquo;accès à un champ/classe au package dans lequel il/elle est défini ?<br />
Scala va beaucoup plus loin (encore une fois) que Java en offrant un contrôle très précis de qui a le droit d&rsquo;accéder à tel ou tel champ/classe, mais ce n&rsquo;est pas dans le cadre de ce billet.</p>
<h2 style="text-align: left">1.2. Définition des champs</h2>
<p>Ajoutons maintenant quelques champs à cette classe, ce qui donne:</p>
<p><img src="http://farm4.static.flickr.com/3030/2409410681_f478d64046_o.png" alt="class Person" title="" /></p>
<p>La déclaration d&rsquo;un champ se présente comme suit:</p>
<p><em>[modificateur de visibilité] (var|val) nom [:Type] [= Valeur]</em></p>
<p>les parties entre [ et ] sont optionnelles, et (x|y) indique un choix exclusif entre deux options x et y.<br />
var indique qu&rsquo;un champ est muable tandis que val indique qu&rsquo;un champ est immuable.</p>
<p><strong>Une note importante s&rsquo;impose: si un champ n&rsquo;est pas initialisé avec une valeur lors de sa déclaration, il est considéré par Scala comme champ abstrait. </strong></p>
<p>Vous êtes déjà habitués aux méthodes et classes abstraites dans Java. Scala va encore plus loin en étendant cette notion au champs aussi.</p>
<p>Ainsi, il est nécessaire d&rsquo;assigner une valeur à un champ lors de sa déclaration si on ne veut pas qu&rsquo;il soit considéré comme abstrait.</p>
<p>Dans le cas où on n&rsquo;a pas de valeur précise à assigner comme valeur par défaut à un champ, on peut utiliser le &lsquo;<em>wild card</em>&lsquo; _ de Scala comme valeur, comme ici:</p>
<p><img src="http://farm3.static.flickr.com/2032/2409717739_2b99395722_o.png" alt="class Person" title="" /></p>
<p>Le &lsquo;_&rsquo; serait traduit par le compilateur en la valeur adapté au type du champ, 0 pour les Int, &laquo;&nbsp;&nbsp;&raquo; pour les chaînes, etc.</p>
<p>Optimisons encore la chose en tirant profit du puissant système d&rsquo;inférence de types de Scala, qui nous permet de ne pas avoir à declarer le type d&rsquo;un champ du moment que ce même type peut être déterminé depuis la valeur d&rsquo;initialisation:</p>
<p><img src="http://farm3.static.flickr.com/2125/2409427393_2ca4422b72_o.png" alt="Inférence de types" title="" /></p>
<p>Tout comme pour les classes, les champs dans Scala sont publics par défaut.</p>
<p>Voici maintenant comment on peut instancier une telle classe et l&rsquo;utiliser:</p>
<p><img src="http://farm3.static.flickr.com/2206/2410273138_ea0d30fbec_o.png" alt="Classe de Test" title="" /></p>
<p>Là, je vois déjà les puristes OO en désarroi face à cette absence d&rsquo;encapsulation: accès direct aux champs ?? !!</p>
<p>Rassurez vous, même si ça en a tout l&rsquo;air, &lsquo;<em>under the hoods</em>&lsquo;, Scala alloue un espace mémoire pour un champ inaccessible au programmeur, et génère automatiquement l&rsquo;équivalent d&rsquo;un getter et d&rsquo;un setter Java et ce sont eux qui sont invoqués lors de la lecture et écriture (plus de détails dans la suite).</p>
<h2 style="text-align: left">1.3. Constructeurs</h2>
<h3 style="text-align: left">a. Constructeur principal</h3>
<p>Je vais maintenant montrer une autre fonctionnalité puissante de Scala qui s&rsquo;adapte bien à ce genre d&rsquo;objets (conteneurs de données): les constructeurs.</p>
<p>Les constructeurs d&rsquo;une classe dans Scala sont un peu différents de ceux en Java, et sont considérés des &lsquo;<em>first class citizens</em>&lsquo;.</p>
<p>Voici comment on définit le constructeur principal d&rsquo;une classe Scala:</p>
<p><img src="http://farm3.static.flickr.com/2358/2410573050_ce49c3c103_o.png" alt="class Person(var name: String, var age: Int)" title="" /></p>
<p>Yep, la classe tient désormais sur une seule ligne <img src="https://blog.developpez.com/djo-mos/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /><br />
Ce bout de code définit à la fois les deux champs name et age ainsi qu&rsquo;un constructeur qui prend les valeurs de ces deux champs comme paramètres.</p>
<p>Voici comment instancier une telle classe:</p>
<p><img src="http://farm3.static.flickr.com/2002/2410573052_974f3c11e1_o.png" alt="instantiation d'une classe" title="" /></p>
<p>Qui comme vous le remarquez est similaire à ce qu&rsquo;on fait en Java.</p>
<h3 style="text-align: left">b. Constructeurs auxiliaires</h3>
<p>Maintenant, la question qui se pose, est comment déclarer, tout comme dans Java, d&rsquo;autre constructeurs de signatures différentes ?<br />
C&rsquo;est tout à fait logique vu comment est défini le constructeur principal.</p>
<p>Scala impose la limite suivante: <strong>on peut définir d&rsquo;autres constructeurs, mais ils doivent obligatoirement invoquer directement ou indirectement le constructeur principal</strong>.</p>
<p>Voici comment déclarer d&rsquo;autres constructeurs (secondaires ou auxiliaires):</p>
<p><img src="http://farm3.static.flickr.com/2077/2410606090_48be871596_o.png" alt="Constructeurs secondaires" title="" /></p>
<p>Et voici comment invoquer ces nouveaux constructeurs</p>
<p><img src="http://farm3.static.flickr.com/2377/2410606096_6c6720867d_o.png" alt="Instantiations" title="" /></p>
<p>Les constructeurs secondaires peuvent très bien effectuer d&rsquo;autres traitements, comme dans ce cas par exemple:</p>
<p><img src="http://farm3.static.flickr.com/2322/2409820595_5b4d26592c_o.png" alt="Constructeur auxiliaire" title="" /></p>
<p>Mais la règle d&rsquo;invocation du constructeur principal tient toujours. Ici, ça se fait indirectement.</p>
<h2 style="text-align: left">1.4. Getters et Setters</h2>
<p>La question suivante est comment spécifier par exemple son propre getter et setter pour un champ ainsi défini ?</p>
<p>Voici comment ça se fait:</p>
<p><img src="http://farm3.static.flickr.com/2232/2410715014_6066f94287_o.png" alt="getter et setter" title="" /><br />
J&rsquo;ai d&rsquo;abord ajouté <em>private</em> à la déclaration de <em>age</em> dans le constructeur (en le renommant en a du même coup) et défini deux méthodes (via le mot clé <strong>def</strong>):</p>
<ul>
<li>age: qui ne fait que retourner le champ privé a en lui ajoutant la chaine &nbsp;&raquo; ans&nbsp;&raquo;, d&rsquo;où le type de retour en String. Remarque que j&rsquo;aurais pu retourner a directement et mettre le type en Int, c&rsquo;est juste pour montrer les possibilités &#8230;</li>
<li>age_= : oui, &lsquo;age_=&rsquo; est un identificateur valide en Scala. Cette méthode prend un paramètre de type Int, et teste s&rsquo;il est positif, auquel cas elle affecte sa valeur au champ a, autrement elle lance une exception.</li>
</ul>
<p>Voici maintenant un bout de code qui teste ce qu&rsquo;on a fait:</p>
<p><img src="http://farm3.static.flickr.com/2416/2410715018_15e1861f4c_o.png" alt="Test getter et setter" title="" /></p>
<p>p.age qui est passé à <em>println</em> invoque bel et bien le getter qu&rsquo;on a défini, et retourne &laquo;&nbsp;25 ans&nbsp;&raquo;.<br />
p.age = 15 invoque le setter et ça passe, vu que 15 > 0<br />
p.age = -5 lance une exception, comme prévu <img src="https://blog.developpez.com/djo-mos/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<h1 style="text-align: left">2. Objets</h1>
<h2 style="text-align: left">2.1. Définition</h2>
<p>Passons maintenant aux objets.<br />
Les objets sont une notion spécifique à Scala (par rapport à Java) et se présentent entre autres comme remplaçant du contexte static de Java (inexistant dans Scala).<br />
Dans la section précédente, j&rsquo;ai montré comment définir une classe (une partie du moins).<br />
Une classe ne définit que la structure de l&rsquo;entité, mais pour l&rsquo;utiliser, il faut l&rsquo;instancier dans un conteneur pour pouvoir la manipuler.</p>
<p>Un objet est tout comme une classe dans la mesure où il définit la structure, mais il définit aussi l&rsquo;instance, ce qui permet de le manipuler directement, sans avoir à l&rsquo;instancier dans un conteneur.</p>
<p>Seulement, dans Scala, il s&rsquo;agit plutôt d&rsquo;un Singleton, crée, et maintenu par le compilateur.<br />
Un objet est crée la première fois qu&rsquo;on y accède, et c&rsquo;est cette même et unique instance qui sera partagée entre tous ses clients.</p>
<h2 style="text-align: left">2.2. Exemples</h2>
<h3 style="text-align: left">a. La méthode main</h3>
<p>L&rsquo;exemple le plus courant de l&rsquo;utilisation des objets dans Scala est tout comme Java, pour définir la fonction main, le point d&rsquo;entrée d&rsquo;un programme.<br />
Une telle méthode doit obligatoirement être définie dans un Objet, comme dans le montre cet exemple:</p>
<p><img src="http://farm3.static.flickr.com/2162/2410017499_725d7e0e54_o.png" alt="main" title="" /><br />
La déclaration d&rsquo;un objet utilise <em>object</em> au lieu de <em>class</em>.</p>
<h3 style="text-align: left">b. Le cas général</h3>
<p>Voici un autre exemple où l&rsquo;on définit une méthode utilitaire (square) pour pouvoir l&rsquo;invoquer sans avoir à instantier une classe (comme Math de Java):</p>
<p><img src="http://farm3.static.flickr.com/2419/2410017507_fcc9e630cb_o.png" alt="object Calc" title="" /></p>
<p>On peut dès lors accéder directement à la méthode square:</p>
<p><img src="http://farm3.static.flickr.com/2051/2410017509_4f0f018a6a_o.png" alt="Appel de méthode d'un objet" title="" /></p>
<p>Pour tout le reste, les objets et les classes dans Scala se présentent de la même façon, <strong>excepté l&rsquo;absence de constructeurs</strong>, qui n&rsquo;ont plus aucun sens dans un objet.</p>
<h1 style="text-align: left">3. Conclusion</h1>
<p>Voilou, c&rsquo;est la fin de ce (<em>long</em>) billet, qui a présenté quelques notions de base sur la définition et l&rsquo;utilisation des classes et des objets dans Scala.<br />
Le billet suivant de la série &laquo;&nbsp;Introduction à Scala&nbsp;&raquo; couvrirait les méthodes et les fonctions, qui sont des entités à part entière dans Scala et permettent de faire des choses très intéressantes &#8230;</p>
<h3>Changelog</h3>
<p>=> <ins><strong>11/07/08</strong>: J&rsquo;ai corrigé la partie sur les constructeurs suite à un retour de <strong>gorgonite</strong> (à propos du currying). Merci à lui.</ins></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
