<?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>Aeon Consulting : Together, let&#039;s cross the sky &#187; Java</title>
	<atom:link href="http://www.aeon-consulting.fr/fr/blog/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.aeon-consulting.fr</link>
	<description></description>
	<lastBuildDate>Fri, 30 Apr 2010 00:32:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Aeon Consulting publie les tarifs de toutes ses formations</title>
		<link>http://www.aeon-consulting.fr/fr/blog/2009/09/23/aeon-consulting-publishes-prices-all-training-sessions/</link>
		<comments>http://www.aeon-consulting.fr/fr/blog/2009/09/23/aeon-consulting-publishes-prices-all-training-sessions/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 16:16:28 +0000</pubDate>
		<dc:creator>Aeon Consulting</dc:creator>
				<category><![CDATA[Training]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[EJB]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[RDA]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[RMA]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[WS-*]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XSL]]></category>

		<guid isPermaLink="false">http://www.aeon-consulting.fr/?p=290</guid>
		<description><![CDATA[Nous avons mis en ligne les tarifs de toutes nos formations : voir notre catalogue.
Dans un souci d&#8217;être toujours plus compétitifs tout en répondant à vos attentes, vous pourrez constater que nous vous avons réservé des promotions sur certaines formations.
N’hésitez pas à nous contacter pour tout complément : sur votre demande, nous pouvons mettre sur [...]]]></description>
			<content:encoded><![CDATA[<p>Nous avons mis en ligne les tarifs de toutes nos formations : voir <a href="http://www.aeon-consulting.fr/fr/training/">notre catalogue</a>.</p>
<p>Dans un souci d&#8217;être toujours plus compétitifs tout en répondant à vos attentes, vous pourrez constater que nous vous avons réservé des promotions sur certaines formations.</p>
<p>N’hésitez pas à <a href="/fr/contact/">nous contacter</a> pour tout complément : sur votre demande, nous pouvons mettre sur pied tous types de formations.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aeon-consulting.fr/fr/blog/2009/09/23/aeon-consulting-publishes-prices-all-training-sessions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scala et avenir de Java</title>
		<link>http://www.aeon-consulting.fr/fr/blog/2009/08/17/scala-et-avenir-de-java/</link>
		<comments>http://www.aeon-consulting.fr/fr/blog/2009/08/17/scala-et-avenir-de-java/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 14:47:04 +0000</pubDate>
		<dc:creator>François Goldgewicht</dc:creator>
				<category><![CDATA[Carnets de Vol IT]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://www.aeon-consulting.fr/?p=251</guid>
		<description><![CDATA[Depuis son apparition en mai 1995, juste avant l’explosion d’Internet, Java a beaucoup évolué. Il est notamment devenu une référence en matière de développement d’applications professionnelles, Web comme Desktop. Après ces 14 ans il convient de dresser un bilan sur l’adéquation de Java aux objectifs et contraintes actuelles.
On constate deux approches distinctes :

Beaucoup se focalisent [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Depuis son apparition en mai 1995, juste avant l’explosion d’Internet, <strong>Java </strong>a beaucoup évolué. Il est notamment devenu une référence en matière de développement d’applications professionnelles, Web comme Desktop. Après ces 14 ans il convient de dresser un bilan sur l’adéquation de Java aux objectifs et contraintes actuelles.</p>
<p style="text-align: justify;">On constate deux approches distinctes :</p>
<ul style="text-align: justify;">
<li>Beaucoup se focalisent sur Java 7 : les discussions font rage sur les évolutions qui pourraient composer cette nouvelle version</li>
<li>D’autres considèrent que Java, avec sa spécification de 600 pages, est devenu trop complexe : qu’il ne pourrait donc plus apporter de réelle révolution et qu’il faudrait donc réfléchir à son digne successeur.</li>
</ul>
<p><span id="more-251"></span></p>
<h2>Complexité ?</h2>
<p style="text-align: justify;">Nous sommes bien d’accord, cette notion de complexité est relative : par exemple, tout le monde ne se sent pas obligé de mettre en œuvre et pousser les <em>Generics </em>jusqu’à leurs retranchements !</p>
<p style="text-align: justify;">Tout le monde n’a pas été convaincu par la pertinence des nombreux débats  « langages statiques contre langages dynamiques ». Ces débats ont malgré tout ouvert la voie à de nouveaux paradigmes de développement rapide et flexible.</p>
<p style="text-align: justify;">Certains se sont donc consacrés à la création d’un langage « état de l’art » afin de répondre aux problématiques actuelles avec plus de simplicité et de productivité, tout en conservant les principes qui ont fait le succès de Java. Finalement, comme Java, qui avait en quelques sortes détrôné le roi de l’époque, C++.</p>
<p style="text-align: justify;">Cet article est consacré à <strong>Scala</strong>, l’un de ces langages. Scala a été démarré en 2001 par Martin Odersky, Professeur à l’EPFL qui travaille également pour Sun à la production de l’implémentation de référence de <em>javac</em>. C’est lui qui est à l’origine de l’implémentation des <em>Generics </em>Java.</p>
<p style="text-align: justify;">Je dois avouer que <strong>je fais partie des nombreuses personnes qui ont été impressionnées par ce langage dès le premier contact</strong>. Par exemple, <strong>James Strachan</strong>, le créateur du langage dynamique Groovy, a <strong><a href="http://macstrac.blogspot.com/2009/04/scala-as-long-term-replacement-for.html" target="_blank">lui aussi été séduit par Scala</a></strong> :</p>
<blockquote>
<p style="text-align: justify;"><em>“Though my tip though for the long term replacement of javac is Scala. I&#8217;m very impressed with it! I can honestly say if someone had shown me the Programming in Scala book by Martin Odersky, Lex Spoon &amp; Bill Venners back in 2003 I&#8217;d probably have never created Groovy”</em></p>
</blockquote>
<p style="text-align: justify;">Et InfoQ <a href="http://www.infoq.com/news/2009/07/scala-replace-java" target="_blank">nous présente d’autres « mordus » de Scala</a>.</p>
<h2 style="text-align: justify;">Langage statique ou langage dynamique ?</h2>
<p style="text-align: justify;">On peut lire beaucoup de débats passionnés sur ce sujet. Mais pour le profane, il n’est pas facile d’y participer car la terminologie associée n’est pas si triviale. Commençons donc par quelques éclaircissements.</p>
<h3 style="text-align: justify;">Qu’est-ce qu’un langage statique ?</h3>
<p style="text-align: justify;">Déjà, il faut savoir que « langage statique » est un abus de langage pour «<strong> langage à typage statique</strong> ».</p>
<p style="text-align: justify;">J’aime assez la définition suivante, proposée dans le livre <a href="http://programming-scala.labs.oreilly.com/" target="_blank">Programming Scala</a> de Dean Wampler et Alex Payne (O&#8217;Reilly) :</p>
<blockquote>
<p style="text-align: justify;"><em>“in static typing, a variable is bound to a particular type for its lifetime. Its type can’t be changed and it can only reference type-compatible instances” </em></p>
</blockquote>
<p style="text-align: justify;">Ainsi, une variable de type A ne pourra être réaffectée plus tard qu’à des types compatibles avec le type A (dans un langage orienté objets, les types compatibles avec un type A sont A lui-même et les sous-classes de A). En fait, <strong>la notion de type est rattachée aux variables, non aux valeurs</strong>.</p>
<p style="text-align: justify;">On pourrait compléter cette définition informelle, mais dans notre contexte elle nous suffira amplement.</p>
<p style="text-align: justify;">Java et C++ sont des exemples de langages statiques.</p>
<h3 style="text-align: justify;">Et un langage dynamique ?</h3>
<p style="text-align: justify;">Le même livre nous donne la définition suivante du typage dynamique :</p>
<blockquote>
<p style="text-align: justify;"><em>“In dynamic typing, the type is bound to the value, not the variable” </em></p>
</blockquote>
<p style="text-align: justify;">Ainsi, une variable qui référence une valeur de type A peut très bien être réaffectée plus tard à des valeurs de n’importe quel type, même non compatible avec le type A. Dans ce cas, <strong>la notion de type est rattachée aux valeurs, non aux variables</strong>.</p>
<p style="text-align: justify;">C’est pour cette raison que l’on parle de typage dynamique : le type des variables est évalué lors de l’exécution de l’application, et non lors de la compilation comme c’est le cas du typage statique.</p>
<p style="text-align: justify;">Ruby, Python, Groovy et JavaScript sont des exemples de langages dynamiques.</p>
<h3 style="text-align: justify;">Le débat</h3>
<p style="text-align: justify;">Peut-être qu’en lisant ces définitions, compte tenu de votre expérience personnelle, vous tendez naturellement vers une de ces deux approches.</p>
<p style="text-align: justify;">Ainsi on entend souvent les arguments suivants :</p>
<ul>
<li>&laquo;&nbsp;Les langages dynamiques, plus flexibles, permettent un gain de temps sur le choix des types&raquo;&nbsp;</li>
<li>&laquo;&nbsp;Les langages statiques peuvent davantage exploiter la notion de type, ce qui facilite la création d’outils d’aide au développement comme l’auto-complétion et d’outils d’optimisation du code&raquo;&nbsp;</li>
<li>&laquo;&nbsp;Les langages dynamiques retardent la détection de certaines erreurs à l’exécution alors que les langages statiques permettent de lever ces erreurs dès la compilation&raquo;&nbsp;</li>
<li>&laquo;&nbsp;Une batterie de tests unitaires permet aux langages dynamiques de s’affranchir de la détection d’erreurs par un compilateur&raquo;&nbsp;</li>
</ul>
<p style="text-align: justify;">Et bien d’autres… Ces simples exemples suffisent à vous faire imaginer l’intensité des polémiques, dans un sens comme dans l’autre ! Sans rentrer dans les détails de ces exemples, essayons de dépasser le débat.</p>
<h3 style="text-align: justify;">Un peu de recul…</h3>
<p style="text-align: justify;">On constate deux faits intéressants :</p>
<ul>
<li>Premier constat, <strong>les langages dynamiques séduisent beaucoup de monde de par leur flexibilité et leur souplesse</strong> : le succès des langages Ruby et Python, pour ne citer qu’eux, en témoigne. Les aficionados de ces langages trouvent souvent les <strong>langages statiques trop verbeux</strong> et ils apprécient d’avoir moins de code à écrire</li>
<li>Second constat, beaucoup ne sont pas séduits par ces langages… Car <strong>cette flexibilité et cette souplesse font peur</strong> ! Après tout, <strong>écrire moins de lignes de code n’augmente pas nécessairement la productivité</strong> : il faut également que ce code soit fonctionnel, lisible, maintenable, etc.</li>
</ul>
<p style="text-align: justify;">Il est clair qu’il y a une <strong>réelle demande de langages succincts et flexibles pour gagner en productivité</strong>. Mais diminuer la quantité de code n’est pas un objectif en soi : <strong>il ne s’agit pas simplement d’une histoire de trop grande verbosité ou taille du code, mais de profiter davantage de l’inférence de type</strong>, c’est-à-dire éviter d’écrire ce que le compilateur peut deviner.</p>
<h2>Les grandes lignes de Scala</h2>
<h3>Un langage statique</h3>
<p style="text-align: justify;"><strong>Scala est un langage statique qui permet une syntaxe succincte, flexible et même élégante. Pourtant son système de typage est sophistiqué.</strong></p>
<p style="text-align: justify;">Pour quelles raisons ? J’aime beaucoup la façon dont le <strong>débat habituel est dépassé</strong> dans le livre <a href="http://www.artima.com/shop/programming_in_scala" target="_blank">Programming in Scala</a>, qu’il a co-écrit avec Lex Spoon et Bill Venners (Artima). Il nous rappelle en effet que :</p>
<ul>
<li>Oui, un compilateur ne permet de détecter que de simples erreurs : il ne vous dira pas que certaines fonctions ne se terminent pas ou que votre cahier des charges n’est pas respecté</li>
<li>Oui, des tests unitaires permettent d’avoir une couverture plus poussée</li>
</ul>
<p style="text-align: justify;">Mais il nous invite à envisager le débat sous un autre angle :</p>
<ul>
<li>Un système de typage statique ne peut pas remplacer les tests unitaires, mais il peut en réduire le nombre</li>
<li>L’inverse n’est pas vrai : les tests unitaires ne peuvent remplacer un système de typage statique. En effet, des tests ne peuvent que nous prouver la présence d’erreurs et non leur absence. Alors qu’un typage statique nous donne des garanties simples mais réelles (opérations entre types incompatibles, accès externe à des membres privés, etc.)</li>
<li>Enfin, le typage statique facilite les <em>refactorings </em>de code et la mise à jour des documentations.</li>
</ul>
<h3>Un langage  concis</h3>
<p style="text-align: justify;">Scala est donc un langage statique. Pourtant, James Strachan <a href="http://macstrac.blogspot.com/2009/04/scala-as-long-term-replacement-for.html" target="_blank">nous explique</a> &#8211; à juste titre &#8211; que <strong>Scala est un langage dont la concision rappelle les langages dynamiques</strong> :</p>
<blockquote>
<p style="text-align: justify;"><em>“Scala seems to hit the perfect sweet spot between the consise feel of a dynamic language, while actually being completely statically typed”</em></p>
</blockquote>
<p style="text-align: justify;">En fait, Scala repose sur de nombreuses techniques permettant de minimiser la syntaxe inutile : il s’agit essentiellement de l’<strong>inférence de type </strong>que nous évoquions précédemment. Ces techniques dépassent largement le cadre de cet article, nous nous contenterons d’un exemple très simple.</p>
<p style="text-align: justify;">La ligne suivante de code Java :</p>
<blockquote>
<pre style="text-align: justify;">List&lt;String&gt; list = new ArrayList&lt;String&gt;();</pre>
</blockquote>
<p style="text-align: justify;">Peut être écrite en Scala :</p>
<blockquote>
<pre style="text-align: justify;">val list : List[String] = new List[String]</pre>
</blockquote>
<p style="text-align: justify;">Ou même :</p>
<blockquote>
<pre style="text-align: justify;">val list = new List[String]</pre>
</blockquote>
<p style="text-align: justify;">Cette dernière ligne de code semble provenir de langages dynamiques mais ici le typage est statique : <strong>il est inutile de préciser le type de la variable car le compilateur est capable de le déterminer seul. C’est l’inférence de type</strong>.</p>
<p style="text-align: justify;">L’introduction à Scala sur le <a href="http://www.scala-lang.org/node/25" target="_blank">site officiel</a> évoque ainsi une diminution du volume du code d’un facteur 2 à 3.</p>
<p style="text-align: justify;">Encore une fois, le but n’est pas de produire moins d’effort de typage, mais de produire moins d’effort de lecture et de compréhension donc de réduire le nombre d’erreurs possibles. L’exemple suivant est simple mais il illustre cette idée.</p>
<p style="text-align: justify;">Voici un code classique de création d’une classe en Java :</p>
<blockquote>
<pre style="text-align: justify;">class Point {
   private int x;
   private int y;

   public Point(int x, int y) {
      this.x = x;
      this.y = y;
   }
}</pre>
</blockquote>
<p style="text-align: justify;">Voici l’équivalent Scala :</p>
<blockquote>
<pre style="text-align: justify;">class Point(x : Int, y : Int)</pre>
</blockquote>
<p style="text-align: justify;">Note : en toute rigueur, dans ce code Scala, les variables d’instances seront <em>final</em>. Ceci dit, l’idée de cet exemple est simplement de vous faire prendre conscience de la concision de Scala.</p>
<p style="text-align: justify;">En outre, Scala propose :</p>
<ul>
<li>L’utilisation de caractères non alphanumériques dans les noms des méthodes : cela permet un équivalent de la surcharge d’opérateurs</li>
<li>Les <strong><em>closures</em></strong>, qui manquent souvent aux développeurs Java qui connaissent Ruby et Python.</li>
</ul>
<p style="text-align: justify;">Voici un exemple illustrant la notion de <em>closure </em>et son intérêt. Voici une simple méthode Java qui retourne la liste des items achetés par un utilisateur :</p>
<blockquote>
<pre style="text-align: justify;">public List&lt;Item&gt; getBoughtItems(User user) {
   List&lt;Item&gt; result = new ArrayList();
   for (Item item : items) {
      if (user.bought(item)) {
         result.add(item);
      }
   }
   return result;
}</pre>
</blockquote>
<p style="text-align: justify;">Voici l’équivalent Scala, basé sur une <em>closure </em>:</p>
<blockquote>
<pre style="text-align: justify;">def getBoughtItems(user: User) =
   items.filter(user bought)</pre>
</blockquote>
<p style="text-align: justify;">En fait, l’expression <em>user bought</em> désigne un prédicat. Ce prédicat prend un paramètre en entrée, qui est omis car unique.</p>
<h3>Un langage mixte</h3>
<p style="text-align: justify;">Martin Odersky connaissant bien la Programmation Orientée Objets et la Programmation Fonctionnelle, a créé Scala comme <strong>une synthèse du meilleur de ces deux mondes</strong> :</p>
<ul>
<li>La <strong>Programmation Orientée Objets</strong> permet la <strong>construction de systèmes complexes, structurés et flexibles</strong></li>
<li>La <strong>Programmation Fonctionnelle</strong> permet de <strong>répondre rapidement et de manière concise à certaines problématiques</strong>.</li>
</ul>
<p style="text-align: justify;">Scala est un donc un langage dit « mixte ». Et <strong>c’est ce mélange, avec ses nouveaux design patterns et son style concis, qui le rend « scalable ».</strong> Car oui, le nom « Scala » est issu de la contraction de « scalable language ».</p>
<h3 style="text-align: justify;">Un langage « scalable » ?</h3>
<p style="text-align: justify;">Je vous prie de m’excuser car j’emploierai parfois le terme anglais « scalable » au lieu de son équivalent français « évolutif », car cela rappelle bien les objectifs de ce langage.</p>
<p style="text-align: justify;">Ce langage se veut évolutif car conçu pour évoluer avec la demande des utilisateurs. Comme nous l’a présenté Martin Odersky à la <a href="http://developers.sun.com/learning/javaoneonline/2008/pdf/TS-5165.pdf" target="_blank">conférence JavaOne 2008</a> :</p>
<blockquote>
<p style="text-align: justify;"><em>&laquo;&nbsp;A language is scalable if it is suitable for very small as well as very large programs&raquo;&nbsp;</em></p>
</blockquote>
<p style="text-align: justify;">Le livre <a href="http://www.artima.com/shop/programming_in_scala" target="_blank">Programming in Scala</a> nous explique la démarche derrière Scala : il ne s’agit pas de fournir le langage parfait qui contient &laquo;&nbsp;tout&raquo;&nbsp;, mais de donner des outils que l’on peut étendre et adapter.</p>
<h3 style="text-align: justify;">Un langage pour la machine virtuelle Java</h3>
<p style="text-align: justify;">Scala s’inspire d’un nombre impressionnant de langages (il suffit de lire la page 20 du livre précédent pour s&#8217;en rendre compte).</p>
<p style="text-align: justify;">Mais le compilateur Scala produit du <em>bytecode </em>pour la JVM, ou machine virtuelle Java. En effet, durant ces 14 ans :</p>
<ul>
<li>Beaucoup d’optimisations ont été apportées à la JVM : il est donc intéressant de profiter des performances obtenues d’entrée de jeu</li>
<li>Les développeurs ont acquis beaucoup de compétences et produit de nombreux frameworks et applications : il serait donc dommage de ne pas profiter de toute cette richesse.</li>
</ul>
<p style="text-align: justify;"><strong>Il est ainsi possible d’invoquer du code Java depuis du code Scala, et inversement</strong>.</p>
<h2 style="text-align: justify;">Un langage orienté objets</h2>
<h3 style="text-align: justify;">Un langage orienté objets à 100%</h3>
<p style="text-align: justify;">Scala est un langage orienté objets à 100%, construit autour du slogan <strong>&laquo;&nbsp;everything is an object&raquo;&nbsp;</strong>.</p>
<p style="text-align: justify;">En effet, <strong>chaque valeur est un objet et toute opération est un appel de méthode</strong>. Ainsi, Scala élimine les déviations de Java :</p>
<ul>
<li>Il n’y a pas de type primitif</li>
<li>Il n’y a pas de membre statique (qui rappelons-le, ne sont par définition rattachés à aucune instance) : des singletons sont utilisés à la place</li>
<li>Les tableaux ne sont pas gérés via une syntaxe spéciale : il existe une classe <em>Array </em>comme les autres.</li>
</ul>
<p style="text-align: justify;">Ces déviations ne paraissent pas si gênantes, mais elles compliquent les choses et limitent la « scalabilité » du code.</p>
<h3 style="text-align: justify;">Un système de type sophistiqué</h3>
<p style="text-align: justify;">Scala permet la définition des types classiques : classes, héritage, types abstraits… Mais son système de type est sophistiqué :</p>
<ul>
<li>Il étend celui de Java (même s’il repose beaucoup dessus en interne)</li>
<li>Les <em>Generics </em>sont plus flexibles</li>
<li>Plus de constructions sont possibles grâce à l’<strong>inférence de type</strong></li>
</ul>
<p style="text-align: justify;">On notera en particulier les deux apports suivants :</p>
<ul>
<li>La notion de <strong>traits</strong> : les traits ressemblent aux interfaces Java, sauf qu’on peut en fait y définir des propriétés et y implémenter certaines méthodes. Les traits apportent de nouveaux design patterns que nous pourrons aborder dans un autre article</li>
<li>La notion de <strong>composition mixin</strong>, qui permet de réutiliser des membres spécifiques à une classe fille (par rapport à sa classe mère) lors de la définition d’une nouvelle classe : cette notion, que vous pouvez rapidement découvrir sur le <a href="http://www.scala-lang.org/node/117" target="_blank">site officiel</a>, permet ainsi d’ajouter de l’état et du comportement à des classes (ou même des objets), ce qui était possible en C++ par de l’héritage multiple mais que partiellement en Java via des approches de type AOP (Programmation Orientée Aspects).</li>
</ul>
<p style="text-align: justify;">Voici un exemple simple, proposé sur le site officiel :</p>
<blockquote>
<pre style="text-align: justify;">abstract class AbsIterator {
   type T
   def hasNext : Boolean
   def next : T
}

<span style="color: #008000;">// Ici le mot-clé « trait » indique que cette
// classe pourra être utilisée comme mixin</span>
trait RichIterator extends AbsIterator {
   def foreach(f : T =&gt; Unit) {
      while (hasNext) f(next)
   }
}

class StringIterator(s: String) extends AbsIterator {
   type T = Char
   private var i = 0
   def hasNext = i &lt; s.length()
   def next = { val ch = s charAt i; i += 1; ch }
}

<span style="color: #008000;">// Combinons les fonctionnalités des deux classes par
// composition mixin</span>
object StringIteratorTest {
   def main(args: Array[String]) {
      class Iter extends StringIterator(args(0))
         with RichIterator
      val iter = new Iter
      iter foreach println
   }
}</pre>
</blockquote>
<p style="text-align: justify;">Dans ce cas, on dit que la classe <em>Iter </em>est construite par<em> composition mixin</em> des classes <em>StringIterator </em>et <em>RichIterator</em>. La première est son &laquo;&nbsp;parent&raquo;&nbsp;, la seconde son &laquo;&nbsp;mixin&raquo;&nbsp;.</p>
<p style="text-align: justify;">En fait, cela permet à Scala de proposer une nouvelle approche orientée modules : les composants sont des classes ou des traits, et on peut les composer par mixin.</p>
<h2 style="text-align: justify;">Et&#8230; Un langage fonctionnel !</h2>
<p style="text-align: justify;">Scala est également un langage de programmation fonctionnelle.</p>
<h3 style="text-align: justify;">Une petite présentation de la programmation fonctionnelle</h3>
<p style="text-align: justify;">Pour la petite histoire, ce type de langages est plus ancien que les langages orientés objets, mais ils étaient jusqu’ici cantonnés à des laboratoires de recherche. Si vous souhaitez en savoir plus sur l’histoire de ces langages, consultez par exemple le livre <a href="http://www.artima.com/shop/programming_in_scala" target="_blank">Programming in Scala</a>.</p>
<p style="text-align: justify;">Dans ce type de langages, <strong>les fonctions sont des valeurs de premier ordre</strong> (comme les <em>int</em>, <em>string</em>, etc. dans nos langages habituels) : on peut assigner des fonctions à des variables, passer des fonctions en arguments d’autres fonctions, déclarer des fonctions comme valeur de retour d’autres fonctions, etc. Autrement dit, toujours dans la lignée du « everything is an object », <strong>en Scala les fonctions sont des objets comme les autres</strong>. A titre d’illustration, cela va plus loin que les pointeurs de fonctions du C++ (qui ne sont que des valeurs de second ordre). Nous pourrions là-encore pousser le sujet bien plus loin, mais restons dans le cadre de cet article.</p>
<h3 style="text-align: justify;">L’immutabilité comme principe de base</h3>
<p style="text-align: justify;"><strong>Les fonctions prennent en entrée des valeurs qu’elles ne modifient pas</strong> : ces données sont dites « <strong>immutables </strong>». Les fonctions sont « sans effet de bord », ou « référentiellement transparentes » : dans un fragment de code, on peut remplacer un appel à une fonction par son résultat, c’est-à-dire sa valeur de retour.</p>
<p style="text-align: justify;">Ce principe est fondamental et il peut faire peur puisque la programmation orientée objets ne le respecte pas nécessairement. En fait, cette partie de Scala s’intègre parfaitement avec la partie orientée objets : elles ne s’opposent pas, elles s’améliorent mutuellement.</p>
<h3 style="text-align: justify;">Quel en est l’intérêt ?</h3>
<p style="text-align: justify;">Ce type de langages permet de simplifier plusieurs problèmes de design. Un bon exemple en est la programmation concurrente.</p>
<p style="text-align: justify;">Ce sujet est de plus en plus d’actualité avec la prolifération des processeurs multi-core, qui distribuent les calculs sur différents threads. Or il s’agit souvent d’un vrai casse-tête !</p>
<p style="text-align: justify;"><strong>Le modèle de Java en matière de programmation concurrente repose sur l’accès synchronisé à des ressources mutables et partagées</strong> : il est donc complexe et source d’erreurs. La gestion des <em>locks </em>est difficile, surtout pour des systèmes qui grandissent en taille et en complexité. En effet, comme nous le rappelle judicieusement le livre <a href="http://www.artima.com/shop/programming_in_scala" target="_blank">Programming in Scala</a>, les <em>deadlocks </em>ne se voient souvent qu’une fois en production et non pendant les tests.</p>
<p style="text-align: justify;"><strong>Scala apporte une solution élégante à ce problème</strong> : l’API <strong>Actors</strong>, qui repose sur le modèle du même nom, issu du langage Erlang. Elle repose sur les principes suivants :</p>
<ul>
<li>On appelle « acteurs » des entités logicielles indépendantes</li>
<li>Les acteurs ne partagent pas d’information d’état entre eux, ils communiquent en échangeant des messages asynchrones (chacun dispose d’une <em>queue</em>) : <strong>on n’a donc pas besoin de synchroniser l’accès à des données mutables partagées</strong>.</li>
</ul>
<p style="text-align: justify;">Sur ce sujet, je vous invite à étudier <a href="http://programming-scala.labs.oreilly.com/ch01.html#ATasteOfConcurrency" target="_blank">cet exemple</a> du livre <span style="text-decoration: underline;">Programming Scala</span>, ainsi que <a href="http://www.scala-lang.org/node/242" target="_blank">la page suivante</a> du site officiel.</p>
<p style="text-align: justify;">Les <em>closures</em>, que nous avons présentées précédemment, proviennent directement de la programmation fonctionnelle.</p>
<p style="text-align: justify;">Je vous invite également à jeter un œil au <strong><a href="http://www.scala-lang.org/node/120" target="_blank"><em>Pattern Matching</em></a></strong>, sorte de <em>switch/case</em> avancé. Là encore nous pourrons aborder ce point spécifique dans un article ultérieur, car cela va bien plus loin qu&#8217;un simple <em>switch/case</em> !</p>
<h2 style="text-align: justify;">Scala en pratique</h2>
<p style="text-align: justify;">Nous venons de présenter Scala, sur le papier. Qu’en est-il en pratique ?</p>
<p style="text-align: justify;"><strong>Scala est déjà mis en œuvre </strong>dans des projets en production, <a href="http://www.scala-lang.org/node/1658" target="_blank">comme nous l’indique le site officiel</a>. On y découvre que <strong>Twitter</strong>, <strong>Siemens </strong>et même une filiale d’<strong>EDF </strong>(EDF Trading) ont mis en œuvre Scala de manière plus que significative afin d’améliorer la productivité, la &laquo;&nbsp;scalabilité&raquo;&nbsp; et la fiabilité générale de projets concrets.</p>
<p style="text-align: justify;">Côté <strong>performances</strong>, <a href="http://www.scala-lang.org/node/25" target="_blank">le site officiel se veut catégorique</a> :</p>
<blockquote>
<p style="text-align: justify;"><em>“The Scala compiler is mature and proven highly reliable by years of use in production environments, The compiler was written by Martin Odersky who also wrote the Java reference compiler and co-authored the generics, used by millions of Java programmers today. You can be confident his implementation of the Scala compiler produces byte code that performs every bit as good as comparable Java code”</em></p>
</blockquote>
<p style="text-align: justify;">Côté <strong>outils</strong>, il existe déjà des plugins pour les outils de développement traditionnels (Eclipse, IntelliJ IDEA, NetBeans) et pour les outils de build (Ant, Maven).</p>
<p style="text-align: justify;">Notez enfin que Scala est même disponible pour .NET et sa machine virtuelle (CLR).</p>
<p style="text-align: justify;">Enfin, la <strong>communauté </strong>autour de Scala est déjà organisée : la distribution de Scala est téléchargée 5000 fois par mois, et des frameworks Scala voient déjà le jour. On notera par exemple le framework Web nommé <a href="http://www.scala-lang.org/node/1011" target="_blank">Lift</a>. Une <strong>conférence </strong>dédiée a même déjà été lancée : <a href="http://www.scalaliftoff.com/" target="_blank">http://www.scalaliftoff.com/</a>.</p>
<h2 style="text-align: justify;">Conclusion (temporaire)</h2>
<p style="text-align: justify;">J’espère vous avoir transmis mon intérêt pour Scala ! Scala n’est pas une amélioration de Java : il s’agit d’un langage qui se veut plus simple et plus élégant que Java, tout en produisant du <em>bytecode </em>pour la machine virtuelle Java. Scala pourrait donc bien être un digne successeur de Java. Mais il ne faut pas pour autant jeter aux orties les autres langages comme Ruby, Groovy ou Python : n’oublions pas que chaque situation a ses besoins et ses contraintes, et donc ses solutions. A suivre&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aeon-consulting.fr/fr/blog/2009/08/17/scala-et-avenir-de-java/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Lancement des Formations Aeon Consulting</title>
		<link>http://www.aeon-consulting.fr/fr/blog/2009/07/28/aeon-consulting-launches-training-activities/</link>
		<comments>http://www.aeon-consulting.fr/fr/blog/2009/07/28/aeon-consulting-launches-training-activities/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 14:25:22 +0000</pubDate>
		<dc:creator>Aeon Consulting</dc:creator>
				<category><![CDATA[Training]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[EJB]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[RDA]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[RMA]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[WS-*]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XSL]]></category>

		<guid isPermaLink="false">http://www.aeon-consulting.fr/?p=208</guid>
		<description><![CDATA[Nous avons le plaisir de vous annoncer le lancement des formations Aeon Consulting.
Nous animons nos formations dans des contextes inter-entreprises et intra-entreprises et notre catalogue est réparti selon nos thèmes clés :

Thème &#171;&#160;Applications Riches&#187;&#160;

Rich Internet Applications (RIA)
Rich Desktop Applications (RDA)
Rich Mobile Applications (RMA)


Thème &#171;&#160;Architectures Applicatives&#187;&#160;

Développement Java/JEE
Développement C#/.NET
Sujets transverses


Thème &#171;&#160;Méthodes et Outils&#187;&#160;

Conception et modélisation
Méthodologies



Voici les dates [...]]]></description>
			<content:encoded><![CDATA[<p>Nous avons le plaisir de vous annoncer le lancement des <a href="/fr/training/">formations Aeon Consulting</a>.</p>
<p>Nous animons nos formations dans des contextes inter-entreprises et intra-entreprises et notre <a href="/fr/training/">catalogue</a> est réparti selon nos thèmes clés :</p>
<ul>
<li><strong>Thème &laquo;&nbsp;Applications Riches&raquo;&nbsp;</strong>
<ul>
<li>Rich Internet Applications (RIA)</li>
<li>Rich Desktop Applications (RDA)</li>
<li>Rich Mobile Applications (RMA)</li>
</ul>
</li>
<li><strong>Thème &laquo;&nbsp;Architectures Applicatives&raquo;&nbsp;</strong>
<ul>
<li>Développement Java/JEE</li>
<li>Développement C#/.NET</li>
<li>Sujets transverses</li>
</ul>
</li>
<li><strong>Thème &laquo;&nbsp;Méthodes et Outils&raquo;&nbsp;</strong>
<ul>
<li>Conception et modélisation</li>
<li>Méthodologies</li>
</ul>
</li>
</ul>
<p>Voici les dates des premières formations planifiées :</p>
<p><span id="more-208"></span></p>
<ul>
<li>21 septembre 2009 : <a href="/fr/training/r-iph/">Développement iPhone et iPod Touch [R-IPH]</a>
<ul>
<li><span style="color: #ff0000;">Formation animée par François GOLDGEWICHT, Consultant Senior et Directeur Technique d&#8217;Aeon Consulting, qui a développé et distribué plusieurs applications iPhone à succès</span></li>
<li><span style="color: #ff0000;">Un iPod Touch offert à chaque participant à l&#8217;issue de cette formation !</span></li>
</ul>
</li>
<li>05 octobre 2009 : <a href="/fr/training/a-spr/">Développement Spring 3.0 [A-SPR]</a></li>
<li>19 octobre 2009 : <a href="/fr/training/r-iphi/">Introduction au développement iPhone et iPod Touch [R-IPHI]</a></li>
<li>09 novembre 2009 : <a href="/fr/training/a-rsti/">Introduction à REST [A-RSTI]</a></li>
<li>16 novembre 2009 : <a href="/fr/training/r-pan/">Panorama des styles et technologies RIA [R-PAN]</a></li>
<li>23 novembre 2009 : <a href="/fr/training/a-cldi/">Introduction au Cloud Computing [A-CLDI]</a></li>
<li>30 novembre 2009 : <a href="/fr/training/r-iph/">Développement iPhone et iPod Touch [R-IPH]</a>
<ul>
<li><span style="color: #ff0000;">Voir session du 21 septembre 2009</span></li>
</ul>
</li>
<li>07 décembre 2009 : <a href="/fr/training/a-spr/">Développement Spring 3.0 [A-SPR]</a></li>
<li>04 janvier 2010 : <a href="/fr/training/r-iphi/">Introduction au développement iPhone et iPod Touch [R-IPHI]</a></li>
<li>11 janvier 2010 : <a href="/fr/training/a-rsti/">Introduction à REST [A-RSTI]</a></li>
<li>18 janvier 2010 : <a href="/fr/training/r-pan/">Panorama des styles et technologies RIA [R-PAN]</a></li>
<li>25 janvier 2010 : <a href="/fr/training/a-cldi/">Introduction au Cloud Computing [A-CLDI]</a></li>
</ul>
<p>Vous pouvez découvrir la description de nos formations, notre catalogue ainsi que les modalités d&#8217;inscription sur la page dédiée : <a href="/fr/training/">Formations</a>.</p>
<p>N’hésitez pas à <a href="/fr/contact/">nous contacter</a> pour tout complément : sur votre demande, nous pouvons mettre sur pied tous types de formations.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aeon-consulting.fr/fr/blog/2009/07/28/aeon-consulting-launches-training-activities/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
