<?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>OCTO talks ! &#187; grails</title>
	<atom:link href="http://blog.octo.com/tag/grails/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.octo.com</link>
	<description>Le blog d&#039;OCTO Technology, cabinet d&#039;architectes en systèmes d&#039;information</description>
	<lastBuildDate>Fri, 03 Feb 2012 13:46:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Analyser la qualité de votre code Groovy / Grails</title>
		<link>http://blog.octo.com/analyse-code-groovy-grails/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=analyse-code-groovy-grails</link>
		<comments>http://blog.octo.com/analyse-code-groovy-grails/#comments</comments>
		<pubDate>Tue, 19 Oct 2010 09:51:06 +0000</pubDate>
		<dc:creator>Cyril Picat</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[analyse statique]]></category>
		<category><![CDATA[codenarc]]></category>
		<category><![CDATA[développement]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[sonar]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=16170</guid>
		<description><![CDATA[Groovy / Grails est une bouffée d&#8217;air frais pour le programmeur Java, vous permettant d&#8217;écrire du code plus expressif et plus lisible, sans les lourdeurs de Java ou de JEE. Groovy vous simplifie également la vie en vous épargnant les écueils classiques du programmeur débutant ou distrait (BigDecimal, equals(), etc…). Ce n&#8217;est pas pour autant [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/paris-jug-groovy-et-grails/' rel='bookmark' title='Paris JUG : Groovy et Grails'>Paris JUG : Groovy et Grails</a></li>
<li><a href='http://blog.octo.com/transactions-en-grails/' rel='bookmark' title='Transactions et traitement métier en Grails'>Transactions et traitement métier en Grails</a></li>
<li><a href='http://blog.octo.com/retour-jug-lausanne-qualite-code-java/' rel='bookmark' title='Retour sur le JUG de Lausanne sur l&#8217;analyse de la qualité du code Java'>Retour sur le JUG de Lausanne sur l&#8217;analyse de la qualité du code Java</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fanalyse-code-groovy-grails%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Analyser%20la%20qualit%C3%A9%20de%20votre%20code%20Groovy%20%2F%20Grails%22%20%7D);"></div>
<p>Groovy / Grails est une bouffée d&#8217;air frais pour le programmeur Java, vous permettant d&#8217;écrire du code plus expressif et plus lisible, sans les lourdeurs de Java ou de JEE. Groovy vous simplifie également la vie en vous épargnant les écueils classiques du programmeur débutant ou distrait (BigDecimal, equals(), etc…). Ce n&#8217;est pas pour autant suffisant pour s&#8217;assurer de la qualité du code délivré et il vous faudra là aussi un ensemble de pratiques pour garder un code maintenable malgré les ajouts et évolutions.</p>
<p>Une de ces pratiques est l&#8217;analyse statique de votre code source via des métriques et des règles, et la surveillance de leur évolution d&#8217;une version sur l&#8217;autre, ou de manière plus ciblée pour une version particulière. Dans ce domaine le programmeur Java est sans aucun doute l&#8217;un des mieux outillés, avec des outils comme PMD, FindBugs, CheckStyle, XDepend, Sonar etc… Qu&#8217;en est-il en Groovy / Grails ? <span id="more-16170"></span></p>
<p><a href="http://blog.octo.com/en/analyzing-groovy-grails-code">L&#8217;article complet</a>, en anglais uniquement, aborde les points suivants :</p>
<ul>
<li>les outils disponibles en Groovy, à savoir <a href="http://gmetrics.sourceforge.net/">GMetrics</a>, <a href="http://codenarc.sourceforge.net/">CodeNarc</a>, <a href="http://www.sonarsource.org/">Sonar</a></li>
<li>la pertinence des autres outils Java sur du code Groovy, par exemple PMD, FindBugs, CheckStyle ou XDepend</li>
<li>la spécificité des langages dynamiques et l&#8217;importance des tests et d&#8217;une métrique comme la couverture de tests</li>
<li>comment mettre en place la solution retenue sur votre projet Grails : <strong>Sonar</strong>, plus précisément le <a href="http://docs.codehaus.org/display/SONAR/Groovy+Plugin">plugin Groovy</a> pour Sonar</li>
<li>une ouverture sur l&#8217;impact d&#8217;un IDE sur la qualité du code et les possibilités d&#8217;analyse d&#8217;IntelliJ via les &laquo;&nbsp;inspections&nbsp;&raquo;</li>
</ul>
<p>En guise de teaser, voici un exemple de tableau de bord Sonar sur un projet Grails :</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2010/10/sonar-screenshot.png"><img class="aligncenter size-large wp-image-15875" title="sonar screenshot" src="http://blog.octo.com/wp-content/uploads/2010/10/sonar-screenshot-1024x580.png" alt="Screenshot of Sonar dashboard on a Grails project" width="1024" height="580" /></a></p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=16170" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/paris-jug-groovy-et-grails/' rel='bookmark' title='Paris JUG : Groovy et Grails'>Paris JUG : Groovy et Grails</a></li>
<li><a href='http://blog.octo.com/transactions-en-grails/' rel='bookmark' title='Transactions et traitement métier en Grails'>Transactions et traitement métier en Grails</a></li>
<li><a href='http://blog.octo.com/retour-jug-lausanne-qualite-code-java/' rel='bookmark' title='Retour sur le JUG de Lausanne sur l&#8217;analyse de la qualité du code Java'>Retour sur le JUG de Lausanne sur l&#8217;analyse de la qualité du code Java</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/analyse-code-groovy-grails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Confessions d&#8217;un Javaiste repenti</title>
		<link>http://blog.octo.com/confession-javaiste-repenti-rails/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=confession-javaiste-repenti-rails</link>
		<comments>http://blog.octo.com/confession-javaiste-repenti-rails/#comments</comments>
		<pubDate>Fri, 17 Sep 2010 05:00:47 +0000</pubDate>
		<dc:creator>Christian Blavier</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[play]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=15045</guid>
		<description><![CDATA[Cela fait maintenant 6 ans que je fais du Java de manière professionnelle, que je collectionne les jars et empile les frameworks tel un jeu de légo. Mais voilà c&#8217;est terminé ! Depuis 6 mois je fais du Ruby on Rails (aka Rails), aussi bien sur mes projets persos que professionnels &#8230; laissez-moi vous expliquer pourquoi. Ruby On [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/presentation-rails-au-paris-jug/' rel='bookmark' title='Présentation Rails au Paris JUG'>Présentation Rails au Paris JUG</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fconfession-javaiste-repenti-rails%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Confessions%20d%27un%20Javaiste%20repenti%22%20%7D);"></div>
<div id="_mcePaste">
<p class="p1">Cela fait maintenant 6 ans que je fais du Java de manière professionnelle, que je collectionne les jars et empile les frameworks tel un jeu de légo. Mais voilà c&#8217;est terminé ! Depuis 6 mois je fais du <a href="http://rubyonrails.org/"><em>Ruby on Rails</em></a><em> </em>(aka <em>Rails</em>), aussi bien sur mes projets persos que professionnels &#8230; laissez-moi vous expliquer pourquoi.</p>
<p><span id="more-15045"></span><strong> </strong></p>
<h2><strong>Ruby On Rails, un framework web</strong></h2>
<p class="p1">Lorsque l&#8217;on parle de <em>Rails</em>, on pense le plus souvent à ses caractéristiques totalement orientées vers la productivité du développeur :</p>
<ul>
<li>un paradigme <strong><em>convention over configuration</em></strong>, reléguant les longs fichiers de configuration XML à la préhistoire</li>
<li>un <strong>langage interprété</strong> facilitant le rechargement de code à chaud et permettant ainsi de tester les modifications de son code au plus vite</li>
<li>l&#8217;utilisation d&#8217;un <strong>langage dynamique</strong> avec toutes les fonctionnalités modernes permettant (entre autre) de très facilement créer des méthodes à la volée ou permettant de manipuler les collections avec beaucoup de facilité</li>
</ul>
<pre class="brush:ruby" style="text-align: left;">#Exemple de manipulation de collection avec une closure
print ["google", "yahoo", "bing"].map{|host| "http://www.#{host}.com" }
&gt; ["http://www.google.com", "http://www.yahoo.com", "http://www.bing.com"]</pre>
</div>
<p class="p1">Ces caractéristiques ont sans aucun doute marqué le monde du développement, mais elles ont désormais été intégrées par de nombreux langages. Ainsi, Spring ou JEE sont profondément emprunts de <strong><em>c</em></strong><strong><em>onvention over configuration</em> </strong>et de <strong><em>d</em></strong><strong><em>on&#8217;t repeat yourself</em><em> </em></strong>permettant d&#8217;alléger les fastidieux fichiers de configuration XML. Les langages JVM de nouvelle génération (dynamiques ou non) comme Groovy ou Scala sont désormais matures. Et pour finir, l&#8217;outil <a href="http://www.zeroturnaround.com/jrebel/">JRebel</a> propose une solution efficace au problème de &laquo;&nbsp;<em>hot deploy&nbsp;&raquo;</em> en Java.  <strong>Ces 3 points ne justifient donc pas en eux même de privilégier Rails à une <em>stack</em></strong><strong> Java.</strong></p>
<p class="p1">Mais ne nous méprenons pas, <strong>la principale force de Rails est d&#8217;être un framework web </strong>; en effet, point d&#8217;embarqué ou de client lourd en Rails. Mais cette spécialisation, qui correspond malgré tout à 95% de mon utilisation de Java en entreprise, est réellement un atout. En parlant de Java j&#8217;ai maintenant l&#8217;image d&#8217;un tank : ça fait tout, ça finit par passer partout, mais pas forcément de la plus efficace et la plus élégante des manières.</p>
<p class="p1"><strong>Le reste de cet article sera donc consacré à opposer Rails à Java en tant que frameworks web.</strong></p>
<p class="p1">Mais au fait, Java peut il concourir dans la catégorie framework web ? Oui et non : Java n&#8217;est pas un framework web en tant que tel et l&#8217;on considérera en fait Java comme une pile de <em>frameworks</em>. On peut aussi bien utiliser la pile Java officielle (JEE), une pile alternative (comme Spring ou JBoss Seam) ou encore un assemblage à façon des nombreux frameworks existants.</p>
<p class="p1"><strong>Et en fin de compte, cette variété de frameworks nuit à Java : elle apporte beaucoup de complexité, aussi bien dans le choix des briques que dans leur assemblage</strong>. Ainsi la communauté Java s&#8217;est longtemps consacré à simplifier l&#8217;intégration entre les frameworks et entre les couches d&#8217;une application (l&#8217;IOC n&#8217;a jamais été aussi simple et peu verbeux). Cet objectif est aujourd&#8217;hui atteint et la pile standard Java est enfin devenue aussi légère à utiliser qu&#8217;elle devrait l&#8217;être.</p>
<p class="p1"><strong>Mais ceci s&#8217;est fait au détriment de ses fonctionnalités ! </strong>On s&#8217;estime aujourd&#8217;hui heureux en Java lorsque le framework que l&#8217;on utilise nous permet de mettre en oeuvre simplement le pattern MVC, de <em>binder</em> des objets sur des composants graphiques, de faire de la validation et éventuellement de faire un peu d&#8217;Ajax. C&#8217;est bien, mais c&#8217;est le b.a.-ba du web.</p>
<p class="p1"><strong>Si j&#8217;utilise aujourd&#8217;hui <em>Rails</em>, c&#8217;est parce que ce framework est définitivement plus abouti et plus riche en terme de fonctionnalités web</strong>. <em>Rails</em> (contrairement à Java) est le fruit de <a href="http://contributors.rubyonrails.org/">centaines de contributeurs</a> oeuvrant tous dans le même sens : faire de ce framework le plus productif pour réaliser des applications web. Voici quelques exemples de fonctionnalités natives en <em>Rails</em>, et à mon sens vitales pour faire une application web en 2010 :</p>
<ul>
<li><strong>Mapping REST </strong>et <a href="http://guides.rubyonrails.org/routing.html">contrôle fin des URLS générées</a></li>
<li>Exposition de <strong>services web en JSON ou XML</strong></li>
<pre class="brush:ruby" style="text-align: left;">#controlleur MVC pour retourner un objet sérialisé en JSON
class BooksController &lt; ApplicationController   def show     render :json =&gt; Book.find_by_id(params[:id])
  end
end</pre>
<li><strong>Gestion intégrée d&#8217;un memcache</strong> ou encore gestion du cache pour des <strong>fragments de page</strong></li>
<li><strong>Compression automatique des ressources web</strong></li>
<li><strong>Accès transparent à la base de donnée</strong> (ie. pas besoin d&#8217;écrire de code SQL ou apparenté pour une bête recherche en base)</li>
<pre class="brush:ruby" style="text-align: left;">class User &lt; ActiveRecord::Base
  #la classe est vide, les attributs de la classe sont induits depuis le schema de la base : schema.rb
end
 #exemple de méthode dynamique : Rails interprète dynamiquement le nom de la méthode pour exécuter le code SQL correspondant
User.find_by_name</pre>
</ul>
<h2>Il y a aussi une gem pour ça !</h2>
<p class="p1">Et ce n&#8217;est pas parce que <em>Rails</em> bénéficie d&#8217;une direction claire et contrôlée qu&#8217;il n&#8217;existe pas de communauté. La contribution externe est très riche, et les frameworks pululent sur <a href="https://github.com">github</a>. Voici quelques exemples de gem (i.e. librairie <em>Ruby</em>) absolument bluffantes :</p>
<ul>
<li><a title="devise" href="http://github.com/plataformatec/devise">devise</a> vous aide à gérer tous les aspects sécurité. Pas seulement le processus d&#8217;authentification, mais aussi toute l&#8217;ihm nécessaire à enregistrer un nouvel utilisateur, changer son mot de passe ou encore confirmer la création de son compte. Devise est extensible et s&#8217;intègre particulièrement bien à openid ou oauth (pour utiliser Facebook ou Twitter en SSO par exemple)</li>
<li><a title="formtastic" href="http://github.com/justinfrench/formtastic">formtastic</a> simplifie drastiquement l&#8217;écriture de vos formulaires en poussant au plus loin le paradigme &laquo;&nbsp;convention over configuration&nbsp;&raquo;.</li>
<li>si vous trouvez que le HTML est verbeux, pas vraiment DRY et finalement peu maintenable, la gem <a title="haml" href="http://haml-lang.com/">HAML</a> est faite pour vous. Elle a pour vocations à faire de vos pages web de véritables Haïku ;-)</li>
<li>pour finir <a title="typus" href="http://github.com/fesplugas/typus">typus</a> ou <a title="admin_data" href="http://github.com/neerajdotname/admin_data">admin_data</a> vous aident à générer un back-office d&#8217;administration en deux coups de cuillère à pot.</li>
</ul>
<p>Il y a bien entendu le risque de retomber dans une situation similaire à Java ou l&#8217;on se retrouve à assembler des stacks de gems totalement hétérogènes d&#8217;un projet à l&#8217;autre avec un surcoût d&#8217;intégration important. Mais <em>Rails</em> s&#8217;en sort mieux sur ce point car d&#8217;une part la &laquo;&nbsp;colonne vertébrale&nbsp;&raquo; d&#8217;un projet <em>Rails</em> est standard alors que ce n&#8217;est pas le cas en Java (où l&#8217;on peut être basiquement en  JEE, Spring ou Seam), et d&#8217;autre part les meilleurs innovations sont régulièrement injectées dans le coeur de <em>Rails</em> (tandis que la standardisation d&#8217;un Hibernate en JPA reste une situation exceptionnelle)</p>
<p class="p1">La communauté <em>Rails</em> est extrêmement importante et les contributions sont variées :</p>
<ul>
<li>des foisons de gems et plugins sur <a title="Github" href="https://github.com/">github</a></li>
<li>d&#8217;excellents <a href="http://guides.rubyonrails.org/">guides</a> sur les concepts clés de <em>Rails</em></li>
<li>quelques blogs majeurs ou encore quelques <a href="http://railscasts.com/">screencasts</a></li>
<li>de nombreux services sur le <a href="http://blog.octo.com/platform-as-a-service-avec-ruby-on-rails/">cloud</a></li>
<li>des milliers de questions et réponses sur <a href="http://stackoverflow.com/questions/tagged/ruby-on-rails">stackoverflow</a></li>
</ul>
<p style="text-align: center;"><a href="http://blog.octo.com/wp-content/uploads/2010/09/gems.png"><img class="size-full wp-image-15310  aligncenter" title="gems" src="http://blog.octo.com/wp-content/uploads/2010/09/gems.png" alt="" width="241" height="180" /></a></p>
<h2>Un framework fait par des agilistes, pour des agilistes</h2>
<p class="p1">Un critère devenu extrêmement important ces dernières années lors de l&#8217;évaluation d&#8217;un framework est sa testabilité. Qu&#8217;en est-il avec <em>Rails</em> ?</p>
<p class="p1">Et bien soyez rassurés, il n&#8217;y a aucun doute à avoir : <strong><em>Rails</em></strong><strong> est le framework le plus testable que j&#8217;ai pu utiliser ces dernières années</strong>. La première raison est que par défaut un projet <em>Rails</em> embarque toute la mécanique permettant de mettre en oeuvre <a href="http://guides.rubyonrails.org/testing.html">3 stratégies de test</a> différentes, toutes complémentaires, pour tester votre application :</p>
<ul>
<li>la plus importante, <strong>le test unitaire</strong>, peut être utilisée pour tester n&#8217;importe quel objet de votre application : principalement les modèles mais aussi n&#8217;importe quelle librairie.</li>
<li><strong>les tests fonctionnels </strong>permettent de tester unitairement un controlleur et fournissent le nécessaire pour injecter simplement des requêtes HTTP et vérifier le rendu HTML (ou autre)</li>
<li>pour finir les <strong>tests d&#8217;intégrations</strong> sont des sortes de super tests fonctionnels, permettant de tester un enchainement de pages et de controlleurs.</li>
<pre class="brush:ruby" style="text-align: left;">#exemple de test d'intégration
class UserFlowsTest &lt; ActionController::IntegrationTest
   fixtures :users
   test "login and browse site" do
     https!
     get "/login"
     assert_response :success
     post_via_redirect "/login", :username =&gt; users(:avs).username, :password =&gt; users(:avs).password
    assert_equal '/welcome', path
    assert_equal 'Welcome avs!', flash[:notice]

    https!(false)
    get "/posts/all"
    assert_response :success
    assert assigns(:products)
  end
end</pre>
</ul>
<p class="p1">Et pas la peine de vous demander comment est géré l&#8217;état de la base de donnée pour ces tests : <em>Rails</em> gère pour nous toute cette configuration fastidieuse. Souvenez-vous donc ce que l&#8217;on doit faire en Java : configuration d&#8217;une base de données mémoire, génération automatique du schéma avec JPA, gestion des jeux de données DBUnit &#8230;</p>
<p class="p1">La seconde raison est que la communauté <em>Rails</em> propose des outils de tests bluffants (et pour le coup, bien loin de ce qui existe en Java). Les deux que j&#8217;ai envie de retenir sont:</p>
<ul>
<li><a href="http://github.com/thoughtbot/factory_girl">factory_girl</a>, qui permet de définir des modèles d&#8217;objet et de les réutiliser facilement dans tous ses tests.<strong> Chaque test peut rester &laquo;&nbsp;ciblé&nbsp;&raquo; sur ce qui doit être testé.</strong></li>
<li><a href="http://cukes.info/">cucumber</a>, pour sa part est <strong>un outil de &laquo;&nbsp;spécifications exécutables&nbsp;&raquo; </strong>sur lequel nous avons déjà rédigé <a href="http://blog.octo.com/tag/cucumber/">quelques articles</a>. Il s&#8217;agit tout simplement de l&#8217;outil le plus expressif qui existe pour rédiger des tests (et en français dans le texte !)</li>
</ul>
<p>Sans aucun doute, <em>Ruby on Rails</em> peut donc être utilisé en contexte agile. Et comme l&#8217;agilité ne s&#8217;arrête pas aux tests, <em>Rails</em> va plus loin :</p>
<ul>
<li>le déploiement automatisé est extrêment aisé avec <a href="http://www.capify.org/index.php/Capistrano">Capistrano</a>. Et même encore plus simple si vous utilisez un hébergeur comme <a href="http://heroku.com/">heroku</a> (git push heroku et ça tourne sur le <em>cloud</em> !)</li>
<li>la gestion incrémentale des bases de données, longuement décrite dans <a title="Article Octo Industrialisation des développements : automatisez votre base de données" href="http://blog.octo.com/industrialisation-des-developpements-automatisez-votre-base-de-donnees/">cet article</a>, existe nativement dans <em>Rails</em>. Et par exemple, si l&#8217;un de vos coéquipiers livre du code altérant la base de données il vous suffira de lancer la commande &laquo;&nbsp;rake db:migrate&nbsp;&raquo; pour appliquer ces modifications (bien entendu pas besoin de redémarrer le serveur, même si c&#8217;est un réflexe bien ancré chez les Javaistes ;-) )</li>
</ul>
<div id="_mcePaste">
<h2><strong>Je peux le faire aussi en Java !</strong></h2>
<p class="p1">Alors vous pourriez me rétorquer que des frameworks similaires à <em>Rails</em> ont vu le jour en Java (ils sont nommés &laquo;&nbsp;frameworks productifs&nbsp;&raquo; en Java, le sous-entendu pour le reste de l&#8217;écosystème Java est on ne peut plus clair !) :</p>
<ul>
<li><a href="http://www.playframework.org/"><em>Play Framework</em></a> fait beaucoup parler de lui ces derniers temps. Il s&#8217;agit d&#8217;un clone de <em>Rails</em> très élégant dont la caractéristique première est d&#8217;utiliser Java, langage maitrisé par de très nombreux développeurs. <em>Play</em> séduit mais émerge encore.</li>
<li><a href="http://www.grails.org/"><em>Grails</em></a> (pour <em>Groovy On Rails</em>) s&#8217;inspire en directe ligne de <em>Rails</em>, mais utilise le langage <em>Groovy</em> et met en oeuvre les frameworks standards de Java comme Spring ou Hibernate. Après déjà quelques années, <em>Grails</em> est loin de bénéficier d&#8217;une communauté aussi large que <em>Rails</em>.</li>
<li>Pour finir Spring a récemment créé <a href="http://www.springsource.org/roo">Roo</a>, son framework de productivité. Mais ce dernier peine à séduire et laisse perplexe quant à la stratégie de Spring sur le sujet (car rappelons que <em>Grails</em> est aussi un projet SpringSource).</li>
</ul>
<p class="p1">Ces <em>frameworks productifs</em> sont certes intéressants, mais  vous vous mettriez clairement en retard de quelques années en utilisant un framework qui court derrière <em>Rails</em>. Et d&#8217;autre part vous vous priveriez d&#8217;une communauté extrêmement importante &#8230;  <em>Rails</em> est pour sa part un projet toujours extrêmement actif et la version 3.0.0 du framework vient tout juste de sortir. Un prochain article sera consacré à l&#8217;utilisation de <em>Ruby on Rails </em>en entreprise.</p>
<p class="p1" style="text-align: center;"><a href="http://blog.octo.com/wp-content/uploads/2010/09/duke-ruby.png"><img class="size-medium wp-image-15284  aligncenter" style="border: 0px initial initial;" title="duke-ruby" src="http://blog.octo.com/wp-content/uploads/2010/09/duke-ruby-261x300.png" alt="" width="157" height="180" /></a></p>
<h2>Quelques mots pour conclure</h2>
<p class="p1">Cet article aura pu vous sembler partisan, mais il est difficile de contenir son enthousiasme lorsque l&#8217;on écrit sur une technologie aussi séduisante. Sachez tout de même que les principaux manques que j&#8217;ai pu constater tournent autour de l&#8217;industrialisation (qui pour le coup est un sujet très mature en Java) :</p>
<ul>
<li>le <em>release management</em> (gestion de <em>releases</em> avec dépendances multi-projets) n&#8217;est pas aussi carré qu&#8217;aven Maven. L&#8217;arrivée récente de <a href="http://gembundler.com/">Bundler</a> est bénéfique, mais <em>Rails</em> demeure en retard sur ce sujet.</li>
<li><a href="http://metric-fu.rubyforge.org/">Metric-Fu</a> est une solution de qualimétrie sympathique, mais de même ce n&#8217;est pas aussi agréable à utiliser qu&#8217;un <a href="http://www.sonarsource.org/">Sonar</a>.</li>
<li>Une autre partie de l&#8217;industrialisation concerne le poste de développement : si l&#8217;installation d&#8217;un poste de développeur <em>Rails</em> se déroule sans problème sur Mac, et de manière correcte sous Linux, le processus peut devenir extrêmement laborieux sous Windows !</li>
</ul>
<p class="p1">J&#8217;espère que j&#8217;aurai su vous éveiller votre curiosité au sujet de <em>Ruby on Rails</em>. Pour ma part, je n&#8217;ai pas autant pris plaisir à développer que depuis que j&#8217;ai découvert cet outil !</p>
<p class="p1"><strong>Alors, vous vous y mettez quand ?</strong></p>
<p style="text-align: center;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="360" height="288" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/PQbuyKUaKFo?fs=1&amp;hl=fr_FR" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="360" height="288" src="http://www.youtube.com/v/PQbuyKUaKFo?fs=1&amp;hl=fr_FR" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
</div>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=15045" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/presentation-rails-au-paris-jug/' rel='bookmark' title='Présentation Rails au Paris JUG'>Présentation Rails au Paris JUG</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/confession-javaiste-repenti-rails/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>Transactions et traitement métier en Grails</title>
		<link>http://blog.octo.com/transactions-en-grails/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=transactions-en-grails</link>
		<comments>http://blog.octo.com/transactions-en-grails/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 12:03:32 +0000</pubDate>
		<dc:creator>Cyril Picat</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[développement]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[transaction]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=14174</guid>
		<description><![CDATA[Développer en Groovy et Grails simplifie grandement le développement d&#8217;une application Web. Passée l&#8217;étape du prototype, les simplifications apportées par Grails ne vous épargneront pas de devoir vous plonger dans les frameworks sous-jacents afin de résoudre des problématiques plus complexes. Qu&#8217;en est-il des transactions en Grails ? Sur un sujet aussi sensible, il est important [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/grails-et-fitnesse-au-service-de-l-innovation-metier/' rel='bookmark' title='GRAILS et FitNesse : au service de l&#8217;innovation métier'>GRAILS et FitNesse : au service de l&#8217;innovation métier</a></li>
<li><a href='http://blog.octo.com/analyse-code-groovy-grails/' rel='bookmark' title='Analyser la qualité de votre code Groovy / Grails'>Analyser la qualité de votre code Groovy / Grails</a></li>
<li><a href='http://blog.octo.com/gemfire-et-traitement-distribue/' rel='bookmark' title='GemFire et traitement distribué'>GemFire et traitement distribué</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Ftransactions-en-grails%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Transactions%20et%20traitement%20m%C3%A9tier%20en%20Grails%22%20%7D);"></div>
<p>Développer en Groovy et Grails simplifie grandement le développement d&#8217;une application Web. Passée l&#8217;étape du prototype, les simplifications apportées par Grails ne vous épargneront pas de devoir vous plonger dans les frameworks sous-jacents afin de résoudre des problématiques plus complexes. </p>
<p>Qu&#8217;en est-il des transactions en Grails ? Sur un sujet aussi sensible, il est important de comprendre quel est ce comportement par défaut choisi par Grails. <span id="more-14174"></span></p>
<p>La documentation de Grails est un peu sommaire, ne traitant vraiment que de <span style="font-style: italic;">où et comment les déclarer</span> mais pas vraiment de <span style="font-style: italic;">comment les utiliser</span>. Les premiers points ne seront pas ré-expliqués ici, vous pouvez vous référer à la <a href="http://grails.org/doc/1.2.x/guide/8.%20The%20Service%20Layer.html#8.1%20Declarative%20Transactions">documentation</a>.</p>
<p><a href="http://blog.octo.com/en/transactions-in-grails">L&#8217;article complet</a>, en anglais uniquement, aborde les points suivants :</p>
<ul>
<li>le modèle transactionnel de Grails, par défaut dans la couche de Services</li>
<li>les risques et pièges de ce modèle, à savoir un traitement métier en dehors d&#8217;une transaction ou réparti sur plusieurs transactions</li>
<li>les bonnes pratiques pour gérer et déclarer les transactions en Grails</li>
<li>les interactions parfois étranges entre les transactions et la session Hibernate</li>
<li>une alternative au modèle transactionnel de Grails pour simplifier la gestion des transactions et supprimer les risques identifiés auparavant. L&#8217;article inclus le code nécessaire à cette modification et explique les impacts d&#8217;une telle modification.</li>
</ul>
<p>Vous pouvez retrouver <a href="http://forge.octo.com/svn/blog/transactions-in-grails">le code et les tests</a> mentionnés dans cet article dans notre repo SVN . </p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=14174" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/grails-et-fitnesse-au-service-de-l-innovation-metier/' rel='bookmark' title='GRAILS et FitNesse : au service de l&#8217;innovation métier'>GRAILS et FitNesse : au service de l&#8217;innovation métier</a></li>
<li><a href='http://blog.octo.com/analyse-code-groovy-grails/' rel='bookmark' title='Analyser la qualité de votre code Groovy / Grails'>Analyser la qualité de votre code Groovy / Grails</a></li>
<li><a href='http://blog.octo.com/gemfire-et-traitement-distribue/' rel='bookmark' title='GemFire et traitement distribué'>GemFire et traitement distribué</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/transactions-en-grails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Innover sans technologie</title>
		<link>http://blog.octo.com/innover-sans-technologie/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=innover-sans-technologie</link>
		<comments>http://blog.octo.com/innover-sans-technologie/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 08:52:31 +0000</pubDate>
		<dc:creator>David Alia</dc:creator>
				<category><![CDATA[Brèves de consultants]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[innovation]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=993</guid>
		<description><![CDATA[Dans un article précédent, Yannick prônait l’innovation durable illustrée dans le secteur des Télécom, auquel un commentateur zélé répondait qu’icelle « n’est pas une question de technologie, ni d’architecture de SI », invoquant même le directeur marketing de Coca-Cola (lire). Je suis assez tenté de rejoindre votre position, cher commentateur. D’autant plus que, chez OCTO, [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/la-productivite-des-developpements%e2%80%a6-n%e2%80%99est-pas-qu%e2%80%99une-affaire-de-technologie/' rel='bookmark' title='La productivité des développements… n’est pas qu’une affaire de technologie !'>La productivité des développements… n’est pas qu’une affaire de technologie !</a></li>
<li><a href='http://blog.octo.com/scrum-sans-iterations/' rel='bookmark' title='Scrum sans itérations ?'>Scrum sans itérations ?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Finnover-sans-technologie%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Innover%20sans%20technologie%22%20%7D);"></div>
<p>Dans un article précédent, Yannick prônait l’innovation durable illustrée dans le secteur des Télécom, auquel un commentateur zélé répondait qu’icelle « n’est pas une question de technologie, ni d’architecture de SI », invoquant même le directeur marketing de Coca-Cola (<a href="http://blog.octo.com/index.php/2008/04/24/105-les-nouvelles-plates-formes-de-service" target="_blank">lire</a>).</p>
<p>Je suis assez tenté de rejoindre votre position, cher commentateur. D’autant plus que, chez OCTO, l’innovation que je vais vous présenter a démarré bien loin de l’IT.<br />
<span id="more-993"></span><br />
OCTO, nombre de lecteurs l’auront évidemment compris, est fervent partisan de l’intégration des méthodes Lean dans le SI. Le kaizen (amélioration continue), issu des pratiques industrielles de Toyota, reste un maître mot dans l’accompagnement de nos clients.</p>
<p>Pour tordre le cou au droit proverbial des cordonniers à être mal chaussés, j’avais décidé de mettre en place cette pratique en interne. L’innovation proposée devait amener de la valeur à un public ciblé, sans bousculer les habitudes de travail, avec un investissement initial restreint.</p>
<p>Le sujet était tout trouvé : améliorer la communication commerciale essentielle vers les consultant(e)s. En effet, tous étaient et sont toujours susceptibles d’être intéressés par les propositions commerciales en cours, celles (brillamment !) gagnées et celles (étonnamment !) perdues et ce, au fil de l’eau.</p>
<p>Allais-je lancer une expression des besoins puis une recette auprès de key users habilement sélectionnés ? Allais-je me ruer tête baissée vers une extraction journalière des données de notre ERP pour une diffusion par mail aux abonnés ?  Allais-je tout simplement me lancer dans la technologie pour innover ? Le suspense est insoutenable, vous le sentez aussi.</p>
<p>Pour tester et démontrer la valeur de mon innovation, j’ai plutôt choisi de prototyper éco : économique et écologique.</p>
<ul>
<li>Un tableau en liège grand format installé dans la cafét’ (en face du baby-foot)</li>
</ul>
<ul>
<li>Des post-it de couleurs variées (les couleurs illustreront les secteurs de nos clients sur lesquels est structurée notre organisation)</li>
</ul>
<ul>
<li>Des punaises de qualité irréprochable</li>
</ul>
<ul>
<li>Et… c’est malheureusement tout : je sais, c’est cruel pour les technophiles technocentriques</li>
</ul>
<p><img class="size full wp-image-1004 alignleft" src="http://blog.octo.com/wp-content/uploads/2009/03/octotalks-innover-sans-technologie-11-mini.jpg" alt="Tableau des propositions commerciales OCTO" width="15%" height="15%" /></p>
<p>Le tableau est divisé en trois sections : en cours, gagnées, perdues. Sur les posts-it, le nom du client et l’intitulé de la mission gribouillés au marqueur. La purge est mensuelle.</p>
<p>Mon objectif : susciter l’adhésion des  gestionnaires commerciaux (écrire un post-it à la pause café ne coûte pas), obtenir un feedback de TOUS les utilisateurs sans les assaillir (pendant qu’on discute autour d’un café, on peut commenter les missions affichées) et initier le changement sans rupture (l’information pertinente est accessible sans efforts).</p>
<p>Le projet a été plébiscité, et depuis plus de six mois désormais, le tableau est régulièrement mis à jour et a subi quelques modifications suggérées par les utilisateurs.</p>
<p>Passer à la technologie était l’étape <strong>complémentaire</strong> : quelques modifications de code dans notre ERP maison, l’ajout d’un feed RSS sur les missions et le tour était joué. Modifier le code était relativement aisé puisque notre logiciel (basé sur le framework Grails) était balisé par un harnais de tests automatisés (*). Implémenter un flux RSS était redoutablement facile, mais vous devez achever la lecture de ce billet pour comprendre pourquoi : c’est visiblement l’article de tous les suspenses.</p>
<p>Alors, innover sans technologie c’est non seulement possible mais c’est indispensable lorsque le contexte s’y prête :</p>
<ul>
<li>Les utilisateurs ne sont pas bousculés, au contraire ils sont tacitement incités à participer à l’élaboration du projet par des suggestions immédiates ou du fait de la facilité à modifier soi-même (changer la disposition ou la couleur des posts-it),</li>
<li>L’investissement initial est marginal (chez OCTO, on peut encore se servir de posts-it sans remplir cinq formulaires) et autorise l’échec,</li>
<li>Toutes les castes sont impliquées et valorisées d’emblée : les directeurs, les commerciaux, les consultants, les stagiaires : tous transitent une fois par jour au moins à la salle café (au moins trois fois par jour pour les stagiaires) et constatent l’épanouissement du business de notre société.</li>
</ul>
<h3>La partie technique</h3>
<p>Les articles informatiques, c’est comme les bons yaourts aux fruits : c’est toujours meilleur avec des morceaux dedans.</p>
<p>La plateforme Grails qu’on ne présente plus possède un plug-in spécifique : <a href="http://grails.codehaus.org/Feeds+Plugin" target="_blank">Feeds</a>. Grâce à l’expressivité intrinsèque de Groovy et à l’implémentation masquée des mécaniques de flux (RSS/ATOM), ce plug-in a permis de développer la version technologique du tableau de la salle café en deux heures à peine, tests inclus évidemment.</p>
<p>L’innovation avec Grails est un sujet passionnant, qui sera de nouveau abordé dans une session de l’<a href="http://www.usi2009.com" target="_blank">Université du SI</a> les 1 et 2 juillet prochain. Décidément, le suspense se poursuit…</p>
<p><strong>Extrait du code de génération du flux RSS à partir du plug-in Grails « Feeds »</strong>.</p>

<div class="wp_codebox"><table><tr id="p9932"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
</pre></td><td class="code" id="p993code2"><pre class="groovy" style="font-family:monospace;">render<span style="color: #66cc66;">&#40;</span>feedType:<span style="color: #ff0000;">'rss'</span>, feedVersion:<span style="color: #ff0000;">'2.0'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
title <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;Les propositions commerciales OCTO&quot;</span>
description <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;La mise à jour régulière propositions commerciales d’OCTO&quot;</span>
link <span style="color: #66cc66;">=</span> url <span style="color: #66cc66;">+</span> <span style="color: #ff0000;">&quot;/wS/feedMissions&quot;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// méthode du Core Domain pour récupérer les dernières modifications</span>
<span style="color: #808080; font-style: italic;">// sur les missions. La variable period fournie par l’utilisateur permet de</span>
<span style="color: #808080; font-style: italic;">// remonter les modifications chaque jour (défaut) ou chaque semaine.</span>
<span style="color: #000000; font-weight: bold;">def</span> l <span style="color: #66cc66;">=</span> Project.<span style="color: #006600;">listRecent</span><span style="color: #66cc66;">&#40;</span>period, <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">Date</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
l.<span style="color: #663399;">each</span> <span style="color: #66cc66;">&#123;</span> pr <span style="color: #66cc66;">-&amp;</span>gt<span style="color: #66cc66;">;</span>
  <span style="color: #808080; font-style: italic;">// On filtre sur les projets facturés</span>
  <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>pr.<span style="color: #006600;">isBilledProject</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">def</span> client <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;client non renseigné&quot;</span>
    <span style="color: #000000; font-weight: bold;">def</span> sector <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;secteur inconnu&quot;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>pr.<span style="color: #006600;">client</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
      client <span style="color: #66cc66;">=</span> pr.<span style="color: #006600;">client</span>.<span style="color: #006600;">name</span>
      sector <span style="color: #66cc66;">=</span> pr.<span style="color: #006600;">client</span>.<span style="color: #006600;">sector</span>.<span style="color: #006600;">name</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">// projectStatus.name renseigne sur l’état de la mission :</span>
    <span style="color: #808080; font-style: italic;">// avant-vente, signée, annulée, perdue…</span>
    <span style="color: #000000; font-weight: bold;">def</span> title <span style="color: #66cc66;">=</span> pr.<span style="color: #006600;">projectStatus</span>.<span style="color: #006600;">name</span>.<span style="color: #006600;">toUpperCase</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">+</span> <span style="color: #ff0000;">&quot; : &quot;</span> <span style="color: #66cc66;">+</span> client <span style="color: #66cc66;">+</span> <span style="color: #ff0000;">&quot; (&quot;</span> <span style="color: #66cc66;">+</span> sector <span style="color: #66cc66;">+</span> <span style="color: #ff0000;">&quot;)&quot;</span>
    <span style="color: #000000; font-weight: bold;">def</span> ref <span style="color: #66cc66;">=</span> pr.<span style="color: #006600;">getReferenceAndName</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #000000; font-weight: bold;">def</span> am <span style="color: #66cc66;">=</span> pr.<span style="color: #006600;">accountManager</span> <span style="color: #66cc66;">?</span> pr.<span style="color: #006600;">accountManager</span>.<span style="color: #006600;">trigram</span> : <span style="color: #ff0000;">&quot;N/A&quot;</span>
    <span style="color: #000000; font-weight: bold;">def</span> invoice <span style="color: #66cc66;">=</span> pr.<span style="color: #006600;">invoicingType</span>.<span style="color: #006600;">description</span>
    <span style="color: #000000; font-weight: bold;">def</span> amount <span style="color: #66cc66;">=</span> pr.<span style="color: #006600;">totalAmount</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">?</span> <span style="color: #aaaadd; font-weight: bold;">String</span>.<span style="color: #006600;">format</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'% 6.2f'</span>, pr.<span style="color: #006600;">totalAmount</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">+</span> <span style="color: #ff0000;">&quot; euros&quot;</span>
                                  : <span style="color: #ff0000;">'N/A'</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">// Définition d’une entrée RSS</span>
    entry<span style="color: #66cc66;">&#40;</span>title<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
      publishedDate <span style="color: #66cc66;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">Date</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
      link <span style="color: #66cc66;">=</span> url <span style="color: #66cc66;">+</span> <span style="color: #ff0000;">&quot;/project/edit/&quot;</span> <span style="color: #66cc66;">+</span> pr.<span style="color: #006600;">id</span>
&nbsp;
      <span style="color: #808080; font-style: italic;">// cette méthode met en forme les informations</span>
      <span style="color: #808080; font-style: italic;">// sous forme linéaire ou tabulaire, selon le choix utilisateur</span>
      renderFeed<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>ref, invoice, amount, am, pr.<span style="color: #006600;">comment</span><span style="color: #66cc66;">&#93;</span>, format<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#125;</span>
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>(*) Hmm… Ce n’est pas entièrement vrai, à croire que l’adage sur les cordonniers a la nuque raide</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=993" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/la-productivite-des-developpements%e2%80%a6-n%e2%80%99est-pas-qu%e2%80%99une-affaire-de-technologie/' rel='bookmark' title='La productivité des développements… n’est pas qu’une affaire de technologie !'>La productivité des développements… n’est pas qu’une affaire de technologie !</a></li>
<li><a href='http://blog.octo.com/scrum-sans-iterations/' rel='bookmark' title='Scrum sans itérations ?'>Scrum sans itérations ?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/innover-sans-technologie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Architecture Dynamique basée sur la solution Grails</title>
		<link>http://blog.octo.com/architecture-dynamique/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=architecture-dynamique</link>
		<comments>http://blog.octo.com/architecture-dynamique/#comments</comments>
		<pubDate>Sat, 22 Sep 2007 12:05:51 +0000</pubDate>
		<dc:creator>Ismaël Héry</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[développements]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[productivité]]></category>

		<guid isPermaLink="false">http://new-blog.octo.com/2007/09/22/architecture-dynamique/</guid>
		<description><![CDATA[Tout projet de développement implique des choix d'architecture. Quels patterns de code ? Quels outils de build ? Un projet innovant  place ces question sur un axe temporel : les réponses adaptées ne sont pas les mêmes entre la 1ere itération et la 20ème itération. Une architecture "dynamique" permettra de maximiser la valeur apportée par une architecture applicative à un moment donné d'un projet.
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/architecture-dintegration-basee-sur-un-pattern-mediateur/' rel='bookmark' title='Architecture d’intégration basée sur un pattern Médiateur'>Architecture d’intégration basée sur un pattern Médiateur</a></li>
<li><a href='http://blog.octo.com/paris-jug-groovy-et-grails/' rel='bookmark' title='Paris JUG : Groovy et Grails'>Paris JUG : Groovy et Grails</a></li>
<li><a href='http://blog.octo.com/grails-maven-plugin-03/' rel='bookmark' title='Grails Maven Plugin 0.3'>Grails Maven Plugin 0.3</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Farchitecture-dynamique%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Architecture%20Dynamique%20bas%C3%A9e%20sur%20la%20solution%20Grails%22%20%7D);"></div>
<p>Tout projet de développement implique des choix d&#8217;architecture. Quels patterns de code ? Quels outils de build ? Un projet innovant  place ces question sur un axe temporel : les réponses adaptées ne sont pas les mêmes entre la 1ere itération et la 20ème itération. Une architecture &laquo;&nbsp;dynamique&nbsp;&raquo; permettra de maximiser la valeur apportée par une architecture applicative à un moment donné d&#8217;un projet.<br />
<span id="more-45"></span><br />
<br />D&#8217;abord les bleus et autres hématomes du développeur et de l&#8217;architecte d&#8217;application. Qui n&#8217;a jamais ressenti une certaine gêne  en expliquant au client, au bout d&#8217;une 1ere itération de 2 semaines, que l&#8217;essentiel des stories n&#8217;est pas livré parce que &nbsp;&raquo; la mise en place du build a pris plus de temps que prévu &nbsp;&raquo; ou encore &nbsp;&raquo; le département intégration n&#8217;a pas livré la base Oracle de dev à temps &nbsp;&raquo; ?
<p class="MsoNormal">Plus pernicieux (faut regarder sous le capot), qui n&#8217;a jamais pesté sur le temps perdu à coder des mappings objets métier->DTOs fastidieux et totalement passe plat (même propriétés du model métier au DTO) !</p>
<p class="MsoNormal">Il ne s&#8217;agit pas de remettre en cause les patterns et outils évoqués dans ces exemples mais plutôt de se questionner sur le timing optimal pour leur introduction dans un projet innovant. Entendons-nous un minimum sur les termes : un projet innovant signifie à minima un métier flou, non maîtrisé par <st1 :personname productid="la MOE" w:st="on">la MOE</st1> (et parfois par <st1 :personname productid="la MOA" w:st="on">la MOA</st1>&#8230;) tandis que dynamicité de l&#8217;architecture d&#8217;application recouvre les changements d&#8217;outis, de pratiques et de patterns <strong style="">au cours</strong> du projet.</p>
<p> <span style="font-weight: bold;">Des principes à leur mise en oeuvre</span></p>
<p class="MsoNormal">Les agilistes ont introduit la notion de design incrémental qui reçoit des échos positifs des architectes d&#8217;application. Pourtant la traduction dans les choix d&#8217;architecture et les pratiques de développement sur les plateaux projets, tarde encore à se concrétiser. Les principaux axes de l&#8217;architecture dynamique sont le build, l&#8217;intégration et surtout les formes de code. Je citerai des exemples concrets sur la base du framework <a href="http://grails.codehaus.org/">Grails</a>. Au passage, je suis très preneur d&#8217;exemples équivalents sur des framework de spectre de fonctionnalités équivalents (SEAM, Rails&#8230;).</p>
<p class="MsoNormal"><strong style="">Dynamique de build<o :p></o></strong></p>
<p class="MsoNormal">Configurer 4 projets maven dans la première itération semble parfois inepte, quand dans ces premiers jours les dépendances externes sont minimums, que chaque couche contient quelques classes seulement et qu&#8217;on a pas avancé d&#8217;un iota sur le domaine métier !</p>
<p class="MsoNormal">Dans le cas d&#8217;un développement sur <a href="http://grails.codehaus.org/">Grails</a>, les 1ere itérations peuvent faire l&#8217;impasse sur l&#8217;outil de build &nbsp;&raquo; entreprise &nbsp;&raquo; pour utiliser directement les scripts du framework. Les quelques dépendances de la première itération seront simplement déposées dans le répertoire &nbsp;&raquo; lib &nbsp;&raquo; de l&#8217;application. Si l&#8217;appli <a href="http://grails.codehaus.org/">Grails </a>utilise une approche <a href="http://blog.octo.com/index.php/2007/04/04/20-choisir-grails-pour-ses-projets-web-en-entreprise">&nbsp;&raquo; blended &laquo;&nbsp;</a>, c&#8217;est-à-dire avec des appels à du code java, on mettra en place un seul et unique artifact maven.</p>
<p class="MsoNormal">Quels déclencheurs pour dépasser cette première &nbsp;&raquo; proto-archi &nbsp;&raquo; de build ? Le projet avançant, ce n&#8217;est plus 2 ou 3 dépendances externes mais 10, 20,<span style="">  </span>qui vont s&#8217;ajouter, avec une gestion de version de plus en plus fastidieuse : c&#8217;est là que maven fait sont entrée fracassante, sous les houra de la foule en liesse.</p>
<p class="MsoNormal">Dans le cas des couches (des artifacts buildés) la séparation des responsabilités et la réutilisation seront les principaux facteurs poussant à l&#8217;éclatement d&#8217;une couche applicative en plusieurs.</p>
<p class="MsoNormal"><strong style="">Dynamique d&#8217;intégration<o :p></o></strong></p>
<p class="MsoNormal">Minimiser le coût de l&#8217;intégration des premières phases a été grandement simplifié par l&#8217;outillage récent. Les vieux loups de mer du design incrémental tenterons de nous vendre la quintessence de la simplicité avec une &nbsp;&raquo; persistence fichier &nbsp;&raquo; pour les 1ères itérations : je dis tu bluffes Martoni et je demande à voir.</p>
<p class="MsoNormal">La facilité de mise en place et d&#8217;utilisation des bases in memory permet maintenant de ne pas avaler d&#8217;un seul coup un gros morceau indigeste du nom d&#8217;Oracle ou Sybase. Dans le cas de <a href="http://grails.codehaus.org/">Grails</a>, HSQLDB est bundlé et configuré <strong style="">par défaut</strong> comme datasource : coût de la mise en place = 27 secondes.</p>
<p class="MsoNormal">Un apport plus novateur de <a href="http://grails.codehaus.org/">Grails </a>est le script <a href="http://docs.codehaus.org/display/GRAILS/Quick+Start">BootStrap.groovy</a> qui permet par exemple d&#8217;injecter très rapidement des données métier au démarrage de l&#8217;application, en bénéficiant des raccourcis de <a href="http://grails.codehaus.org/GORM" class="broken_link">GORM </a>et en évitant de mettre en place un import SQL ou DBUNIT.</p>
<p class="MsoNormal">Mon graphe d&#8217;objets se complexifiant, mes volumes de données augmentant, je passerai tôt ou tard sur la techno cible, avec des bons vieux insert sql pour la reprise des données&#8230;</p>
<p class="MsoNormal"><strong style="">Dynamique de pattern de code</strong></p>
<p class="MsoNormal">Cet axe de l&#8217;architecture dynamique est plus excitant encore, car invisible pour qui n&#8217;a jamais mis les yeux sur le code. Les perspectives d&#8217;amélioration de la productivité sont très importantes dans ce domaine.</p>
<p class="MsoNormal">Les <a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/TransferObject.html">DTOs</a><strong style=""><o :p></o></strong></p>
<p class="MsoNormal">Maximiser le feed-back client c&#8217;est aller vite dans la livraison de fonctionnalités, en minimisant notamment l&#8217;entropie, i.e. le volume de code inutile. Dans les premières itérations il s&#8217;agit souvent de remonter jusqu&#8217;à <st1 :personname productid="la GUI" w:st="on">la GUI</st1> les &nbsp;&raquo; proto-objets &nbsp;&raquo; métier pour valider une compréhension du domaine avec le client. Or quoi de plus inutiles (donc coûteux) que des DTOs passe plats, depuis qu&#8217;hibernate permet de remonter jusqu&#8217;à <st1 :personname productid="la GUI" w:st="on">la GUI</st1> des objets métier ? Accessoirement, coder des DTOs passe plat est une des activités de dev les plus déprimante qui soit sur terre.</p>
<p class="MsoNormal">Qu&#8217;on ne me fasse pas de procès d&#8217;intention, le pattern DTO n&#8217;est pas près de disparaître. Le métier et <st1 :personname productid="la GUI" w:st="on">la GUI</st1> allant en se complexifiant au cours du projet, il refera surface au premier formulaire calqué sur plusieurs objets ou alors dès que des composants GUI riches et réutilisables seront nécessaires&#8230;</p>
<p class="MsoNormal">Si vous utilisez <a href="http://grails.codehaus.org/">Grails</a> vous vous contenterez d&#8217;abord d&#8217;afficher les POJOs métiers dans <st1 :personname productid="la GUI" w:st="on">la  GUI</st1>, par exemple ${book.author.name}. Puis petit à petit vous introduirez des &nbsp;&raquo; command objects &nbsp;&raquo; pour les formulaires complexes.</p>
<p class="MsoNormal"><o :p>Les <a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html">DAOs</a><br /></o></p>
<p class="MsoNormal">Hibernate facilite grandement l&#8217;accès à la base, à tel point qu&#8217;on se surprend à voir la base comme un vrai repository d&#8217;objet. L&#8217;écriture d&#8217;un DAO sur des requêtes simples conduit souvent à des classes et des méthodes anémiques, qu&#8217;on hésite à fondre dans le service métier pour limiter le nombre d&#8217;entité. Du coup exit le DAO, on mélange allègrement la persistence et la logique, le code résultant restant propre et testable tant que les requêtes restent simples.</p>
<p class="MsoNormal">Vous avez pigé le truc, tôt ou tard<span style="">  </span>le code d&#8217;accès aux données se complexifiera et son externalisation de la logique métier deviendra inévitable. L&#8217;autre facteur de décorrélation DAO/logique métier sera la testabilité de la logique métier, grandement simplifiée si le service prend en paramètre des POJOs remontés de la base au runtime ou construit manuellement au test time.</p>
<p class="MsoNormal">Dans le cas de <a href="http://grails.codehaus.org/">Grails</a> une évolution typique du code d&#8217;accès aux données est la suivante :</p>
<ol type="1" style="margin-top: 0in;" start="1">
<li class="MsoNormal" style="">Grâce à la puissance de <a href="http://grails.codehaus.org/GORM" class="broken_link">GORM</a> (n&#8217;ayons pas peur des mots), je mets facilement du code d&#8217;accès à la base dans      mes controlleurs Grails.</li>
<li class="MsoNormal" style="">La      logique métier dépasse le CRUD et je l&#8217;externalise dans un service (Java      ou <a href="http://groovy.codehaus.org/">Groovy</a>) qui accède directement aux objets en base.</li>
<li class="MsoNormal" style="">Le      bigniou se complexifie encore et la logique d&#8217;accès à la base et la      testabilité du tout m&#8217;incite à séparer logique métier et DAO.</li>
</ol>
<p class="MsoNormal"><o :p>DTOs et DAOs sont des exemples emblématiques de ces patterns qu&#8217;ils faut savoir embrayer et débrayer au moment opportun, mais d&#8217;autres pattern sont là, à attendre un timing optimal.<br /></o></p>
<p class="MsoNormal"><strong style="">Conclusion<o :p></o></strong></p>
<p class="MsoNormal">Les principes exposés ici (architecture itérative et incrémentale) ne sont pas des scoops, loin de là. En revanches, les frameworks récents permettent de les appliquer concrètement sans trop d&#8217;effort des équipes et surtout sans rupture technologique forte au cours du temps. Le prototype des premiers jours n&#8217;est plus en PHP ou pur HTML mais en MVC, la persistence des premiers jours n&#8217;est plus en &nbsp;&raquo; fichier &nbsp;&raquo; mais en base relationnelle. On ne cassera jamais tout pour jeter un investissement conséquent.</p>
<p class="MsoNormal">La dynamicité de l&#8217;architecture prend en compte le facteur temporel que revendique le pattern zone innovation->zone rationalisation. En revanche le facteur temps des exemples abordés ici situe ces évolutions dans la seule zone d&#8217;innovation : ces nombreux changements doivent intervenir dans les itérations de développement seules, bien avant le passage en TMA !</p>
<p class="MsoNormal">Plusieurs postulats implicites n&#8217;ont pas été explicités en début de post :</p>
<p class="MsoNormal">- la qualité interne (invisible du client) n&#8217;est pas négociable. Les patterns &nbsp;&raquo; légers &nbsp;&raquo; des premières itérations ne doivent pas nuire à la robustesse, la lisibilité et la testabilité du code.</p>
<p class="MsoNormal">- l&#8217;architecture dynamique n&#8217;est pas compatible avec la cascade. Les outils et les patterns calquent leurs évolutions sur le recueil du besoin et les feed-backs client, au fur et à mesure des itérations.</p>
<p class="MsoNormal">- les développeurs et architectes en charge du projet sont compétents, responsabilisés et courageux.</p>
<p class="MsoNormal">Compétents parce qu&#8217;ils connaissent les différentes approches accessibles et la pertinence de chacunes.</p>
<p class="MsoNormal">Responsabilisés parce que les patterns émergent de leur activité quotidienne et qu&#8217;ils n&#8217;attendent pas les 2 heures de support hebdomadaire de l&#8217;expert pour remettre en cause leur archi.</p>
<p class="MsoNormal">Courageux parce qu&#8217;ils challengent en permanence leur architecture applicative en reconnaissant que les décisions d&#8217;hier ne sont plus les bonnes aujourd&#8217;hui ou que l&#8217;archi de demain équivaut à un sur coût aujourd&#8217;hui.</p>
<p>Gilles Laborderie et moi-même présenteront des exemples de dynamicité d&#8217;architecture pendant la conférences <a href="http://www.grails-exchange.com/pcd/1020">Grails eXchange</a>. Voir à ce sujet aussi les <a href="http://blog.octo.com/index.php/2007/09/20/46-octo-a-la-conference-grails-exchange-2007">autres sujets OCTO</a>.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=45" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/architecture-dintegration-basee-sur-un-pattern-mediateur/' rel='bookmark' title='Architecture d’intégration basée sur un pattern Médiateur'>Architecture d’intégration basée sur un pattern Médiateur</a></li>
<li><a href='http://blog.octo.com/paris-jug-groovy-et-grails/' rel='bookmark' title='Paris JUG : Groovy et Grails'>Paris JUG : Groovy et Grails</a></li>
<li><a href='http://blog.octo.com/grails-maven-plugin-03/' rel='bookmark' title='Grails Maven Plugin 0.3'>Grails Maven Plugin 0.3</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/architecture-dynamique/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Choisir Grails pour faire du web: Au menu ou à la carte ?</title>
		<link>http://blog.octo.com/choisir-grails-pour-ses-projets-web-en-entreprise/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=choisir-grails-pour-ses-projets-web-en-entreprise</link>
		<comments>http://blog.octo.com/choisir-grails-pour-ses-projets-web-en-entreprise/#comments</comments>
		<pubDate>Wed, 04 Apr 2007 15:21:00 +0000</pubDate>
		<dc:creator>Eric Pantera</dc:creator>
				<category><![CDATA[Brèves de consultants]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://new-blog.octo.com/2007/04/04/choisir-grails-pour-ses-projets-web-en-entreprise/</guid>
		<description><![CDATA[<p style="font-family: Arial;">Mars 2006. La comète Grails fait son entrée dans la galaxie Java en sortant sa première version publique. Inspiré par le succès du framework Ruby on Rails, Grails propose alors d'en adapter la recette à la sauce Java. Sa promesse ? Fournir une solution simple, rapide et élégante pour développer des applications Web J2EE pour l'entreprise.</p> <p style="font-family: Arial;">Mars 2007. A quelques jours du premier anniversaire du framework, force est de constater que l'engouement autour de Grails reste intact. Chez OCTO comme chez nos clients, de premières références significatives voient le jour en production. On commence à y croire : Avec Grails, ca va vite.</p> <p style="font-family: Arial;">Grails venant enrichir une panoplie de solutions déjà à notre disposition pour nos développements Web, des questions se posent : Choisir Grails, pourquoi pas, mais dans quels cas ? Est-il adapté aux contraintes d'un SI d'entreprise ?</p> <p style="font-family: Arial;">Dans quels contextes et de quelle manière Grails peut-il faire la différence ?</p>
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/transactions-en-grails/' rel='bookmark' title='Transactions et traitement métier en Grails'>Transactions et traitement métier en Grails</a></li>
<li><a href='http://blog.octo.com/grails-maven-plugin-03/' rel='bookmark' title='Grails Maven Plugin 0.3'>Grails Maven Plugin 0.3</a></li>
<li><a href='http://blog.octo.com/octo-a-la-conference-grails-exchange-2007/' rel='bookmark' title='OCTO à la conférence Grails eXchange 2007'>OCTO à la conférence Grails eXchange 2007</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fchoisir-grails-pour-ses-projets-web-en-entreprise%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Choisir%20Grails%20pour%20faire%20du%20web%3A%20Au%20menu%20ou%20%C3%A0%20la%20carte%20%3F%22%20%7D);"></div>
<p style="font-family: Arial;">Mars 2006. La comète Grails fait son entrée dans la galaxie Java en sortant sa première version publique. Inspiré par le succès du framework Ruby on Rails, Grails propose alors d&#8217;en adapter la recette à la sauce Java. Sa promesse ? Fournir une solution simple, rapide et élégante pour développer des applications Web J2EE pour l&#8217;entreprise.</p>
<p style="font-family: Arial;">Mars 2007. A quelques jours du premier anniversaire du framework, force est de constater que l&#8217;engouement autour de Grails reste intact. Chez OCTO comme chez nos clients, de premières références significatives voient le jour en production. On commence à y croire : Avec Grails, ca va vite.</p>
<p style="font-family: Arial;">Grails venant enrichir une panoplie de solutions déjà à notre disposition pour nos développements Web, des questions se posent : Choisir Grails, pourquoi pas, mais dans quels cas ? Est-il adapté aux contraintes d&#8217;un SI d&#8217;entreprise ?</p>
<p style="font-family: Arial;">Dans quels contextes et de quelle manière Grails peut-il faire la différence ?</p>
<p><span id="more-17"></span><br />
</p>
<h4 style="font-family: Arial;">L&#8217;approche &nbsp;&raquo; Grails Intégrale &nbsp;&raquo; pour démarrer rapidement des applications Web</h4>
<p style="font-family: Arial;">Grails nous propose une <span style="font-weight: bold;">solution packagée</span> pour mettre en oeuvre une application Web. De l&#8217;IHM à la donnée, Grails permet à n&#8217;importe quel développeur Java peu expérimenté de délivrer rapidement ses premiers écrans Web. Pour cela le framework s&#8217;appuie sur plusieurs concepts clés d&#8217;amélioration de la productivité ; on retiendra notamment le fameux paradigme &nbsp;&raquo; convention over configuration &nbsp;&raquo; qui permet de minimiser le &nbsp;&raquo; code technique &nbsp;&raquo; au profit du &nbsp;&raquo; code métier &laquo;&nbsp;. Il en résulte une <span style="font-weight: bold;">réduction du ticket d&#8217;entrée</span> généralement constaté au démarrage d&#8217;applications JEE.</p>
<p style="font-family: Arial;">Avec Grails on peut donc développer rapidement des prototypes Web. C&#8217;est bien&#8230; mais avouons que depuis longtemps des technologies comme PHP  répondent très bien au besoin. Enfin, jusqu&#8217;au jour où <span style="font-weight: bold;">la petite application veut devenir grande</span>. Car si aujourd&#8217;hui je veux minimiser les contraintes pour sortir rapidement un prototype isolé, demain je le voudrais maintenable et exploitable par des tiers, interopérable et respectant les contraintes d&#8217;architecture du SI. D&#8217;ici là, on cherchera à minimiser la période et les coûts de transition.</p>
<p style="font-family: Arial;">C&#8217;est ici que Grails prend toute son ampleur. Sa force ? Résister aux deux temps qui composent la vie d&#8217;une application : <span style="font-weight: bold;">L&#8217;innovation et la rationalisation</span>. En choisissant Grails pour mes prototypes, je suis rassuré. Je sais que contrairement à Struts, il me fournira d&#8217;abord toute la <span style="font-weight: bold;">souplesse et la légèreté</span> dont j&#8217;ai besoin pour affiner ma compréhension du métier au fil du projet sans avoir la sensation de courir un 100 mètres dans un champ d&#8217;argile. Au final, peut-être que cette approche légère suffira alors pour répondre parfaitement à mon besoin. Mais je sais aussi qu&#8217;à tout moment je serai capable de faire évoluer couche par couche mon application vers une architecture JEE plus classique. Le framework encapsulant des composants et patterns JEE standards (Hibernate, Spring, JUnit, Sitemesh&#8230;), une simple adaptation du code suffit. Nul besoin de réécriture complète et de transition couteuse. Chez OCTO, on parle alors de &nbsp;&raquo; <span style="font-weight: bold;">cristallisation </span>&nbsp;&raquo; ou de &nbsp;&raquo; refroidissement &nbsp;&raquo; des couches de l&#8217;application.</p>
<p style="font-family: Arial;">Les motivations de cette cristallisation peuvent être de plusieurs natures. Liées à des <span style="font-weight: bold;">contraintes externes</span> au projet telles que la volonté de standardisation des technologies et des architectures applicatives au sein d&#8217;un SI, le besoin d&#8217;intégration avec une application existante ou encore la volonté des équipes de TMA de rester sur du  100% Java. Mais aussi liées à des <span style="font-weight: bold;">besoins propres au projet</span> tels que l&#8217;apparition de besoins techniques très spécifiques, sortant du cadre du &nbsp;&raquo; tout Grails &laquo;&nbsp;, ou encore par l&#8217;agrandissement de l&#8217;équipe projet. Car il faut avouer qu&#8217;à ce jour si l&#8217;approche &nbsp;&raquo; Grails Intégrale &nbsp;&raquo; convient parfaitement aux petites équipes (moins de 4 développeurs) et aux petits projets, il deviendra délicat de se passer d&#8217;un socle Java outillé lorsque le projet prendra de l&#8217;ampleur. Malgré de premiers plugins, le faible support de Grails par les IDE Java tels Eclipse ou IntelliJ IDEA est à l&#8217;heure actuelle pénalisant en termes de refactoring et de contrôle de validité du code. Du coté de la communauté Grails, semble-t-il que ce point ait été fixé comme l&#8217;une des priorités d&#8217;amélioration à court terme ; des travaux sont en cours, à suivre&#8230;</p>
<div style="border: 1pt solid black; padding: 10px; font-family: Arial; background-color: rgb(211, 211, 211);">Dans le cadre du lancement d&#8217;un prototype ou d&#8217;un petit projet Web, Grails propose une solution complète, &nbsp;&raquo; out of the box &nbsp;&raquo; et productive. Il permet de réduire les contraintes et le coût d&#8217;entrée dans un premier temps, et d&#8217;évoluer par la suite facilement vers une application d&#8217;entreprise. Grails encapsulant Java, il est immédiatement accessible aux développeurs et ne nécessite pas de compétence particulières.</div>
<h4 style="font-family: Arial;">L&#8217;approche &nbsp;&raquo; Grails IHM &nbsp;&raquo; pour booster la couche IHM des applications Java JEE</h4>
<p style="font-family: Arial;">Nous avons vu que la modularité de Grails lui permet d&#8217;accompagner le cycle de vie d&#8217;une application, depuis son démarrage en &nbsp;&raquo; Grails Intégrale &laquo;&nbsp;, jusqu&#8217;à sa transformation en une application mixée Grails/Java. Est-il pertinent d&#8217;utiliser cette modularité pour envisager une utilisation de<span style="font-weight: bold;"> Grails &nbsp;&raquo; à la carte &laquo;&nbsp;</span> pour prendre en charge uniquement la couche IHM d&#8217;une application bâtie sur un modèle Java JEE classique ? </p>
<p style="font-family: Arial;">Grails peut être utilisé uniquement comme un framework d&#8217;interfaces WEB au même titre qu&#8217;un Struts, qu&#8217;un JSF ou qu&#8217;un GWT. Dans ce contexte là, seules les couches vue/contrôleur de la bête seront sollicitées, le reste de l&#8217;application s&#8217;appuyant sur un développement Java classique. A quoi bon ? &laquo;&nbsp;Yet Another Web Framework&nbsp;&raquo; diraient nos amis d&#8217;outre-Atlantique&#8230;  Certes. Mais quel framework !</p>
<p style="font-family: Arial;">De manière générale, la productivité de développement d&#8217;un écran est élevée ; la communication entre les couches se fait trivialement, &nbsp;&raquo; convention over configuration &nbsp;&raquo; toujours, le système de &nbsp;&raquo; reloading &nbsp;&raquo; à chaud permet d&#8217;aller très vite dans le processus de développement, la gestion des &nbsp;&raquo; taglibs &nbsp;&raquo; est excellente et favorise la production de code propre et réutilisable. Au delà de cette productivité, le positionnement de Grails vis-à-vis des frameworks concurrents peut être rassurant pour beaucoup. Contrairement à GWT qui introduit un nouveau paradigme maison pour gagner en productivité, Grails conserve un modèle et des concepts bien familiers. Après quelques minutes d&#8217;utilisation on comprend rapidement que <span style="font-weight: bold;">du simple CRUD jusqu&#8217;aux écrans de navigation complexes et sécurisés, </span>Grails ne sera jamais limitant. Au contraire, sa productivité prendra tout son sens avec l&#8217;arrivée d&#8217;écrans complexes.</p>
<p style="font-family: Arial;">Ajax bien sur&#8230; Grails propose une <span style="font-weight: bold;">encapsulation native</span> de certaines fonctionnalités des frameworks Prototype, Dojo et Yahoo!UI. Recharger dynamiquement le contenu d&#8217;une page devient alors aussi facile que de saisir une taglib dans une page JSP. Cependant, ne nous voilons pas la face, l&#8217;application s&#8217;étoffant il devient difficile de se passer de l&#8217;utilisation de JavaScript et de ne pas sortir du cadre Ajax de base proposé par Grails. Malgré tout, cela se fait très bien et encouragé par le confort général de développement lié à l&#8217;utilisation de Grails on se surprend à faire du client Riche ; les écrans sont sexys et gagnent en <span style="font-weight: bold;">expérience utilisateur</span>.</p>
<div style="border: 1pt solid black; padding: 10px; background-color: rgb(211, 211, 211);"><span style="font-family: Arial;">Dans le cadre de développement d&#8217;une application d&#8217;entreprise d&#8217;envergure sur un socle JAVA, l&#8217;utilisation partielle de Grails pour la couche IHM peut s&#8217;avérer pertinente. On appréciera sa productivité et son confort général d&#8217;utilisation. Sa modularité en fait également une très bonne solution pour venir se brancher à un legacy et lui donner la vue&#8230;</span> </div>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=17" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/transactions-en-grails/' rel='bookmark' title='Transactions et traitement métier en Grails'>Transactions et traitement métier en Grails</a></li>
<li><a href='http://blog.octo.com/grails-maven-plugin-03/' rel='bookmark' title='Grails Maven Plugin 0.3'>Grails Maven Plugin 0.3</a></li>
<li><a href='http://blog.octo.com/octo-a-la-conference-grails-exchange-2007/' rel='bookmark' title='OCTO à la conférence Grails eXchange 2007'>OCTO à la conférence Grails eXchange 2007</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/choisir-grails-pour-ses-projets-web-en-entreprise/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

