<?xml version="1.0" encoding="UTF-8"?><rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
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:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:media="http://search.yahoo.com/mrss/"
> <channel><title>Commentaires sur : Le pattern Specification pour la gestion de vos règles métier</title> <atom:link href="http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/feed/" rel="self" type="application/rss+xml" /><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/</link> <description>J2EE, Agilité et SOA</description> <lastBuildDate>Fri, 10 Feb 2012 09:50:25 +0000</lastBuildDate> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=</generator> <item><title>Par : Specification pattern by Scala &#124; Ouertani</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-44187</link> <dc:creator>Specification pattern by Scala &#124; Ouertani</dc:creator> <pubDate>Thu, 17 Mar 2011 10:57:35 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-44187</guid> <description>[...] this blog, We will not explain how this pattern works, but you can refers to wikipedia and Xebia&#160; for more details. But, we try here to translate specification pattern using scala [...]</description> <content:encoded><![CDATA[<p>[...] this blog, We will not explain how this pattern works, but you can refers to wikipedia and Xebia&nbsp; for more details. But, we try here to translate specification pattern using scala [...]</p> ]]></content:encoded> </item> <item><title>Par : Manu F.</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-42923</link> <dc:creator>Manu F.</dc:creator> <pubDate>Fri, 04 Mar 2011 12:32:31 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-42923</guid> <description>Merci Nico.
Alors t ou maintenant ? (coachC si tu te rappel ...)</description> <content:encoded><![CDATA[<p>Merci Nico.</p><p>Alors t ou maintenant ? (coachC si tu te rappel &#8230;)</p> ]]></content:encoded> </item> <item><title>Par : Nicolas Le Coz</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-38683</link> <dc:creator>Nicolas Le Coz</dc:creator> <pubDate>Wed, 05 Jan 2011 11:48:54 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-38683</guid> <description>Bonjour,
sur le diagramme UML il n&#039;y a pas les informations de visibilités.
Le constructeur AbstractCompositeSpecification est en visibilité &quot;protected&quot;.
Pour plus d&#039;informations voici mon implémentation de cette classe : http://nicolaslecoz-dev-sandbox.googlecode.com/svn/trunk/nlc-java-sandbox/src/main/java/patternSpecification/regleMetier/util/AbstractCompositeSpecification.java
Bon courage.</description> <content:encoded><![CDATA[<p>Bonjour,</p><p>sur le diagramme UML il n&#8217;y a pas les informations de visibilités.</p><p>Le constructeur AbstractCompositeSpecification est en visibilité &laquo;&nbsp;protected&nbsp;&raquo;.</p><p>Pour plus d&#8217;informations voici mon implémentation de cette classe : <a
href="http://nicolaslecoz-dev-sandbox.googlecode.com/svn/trunk/nlc-java-sandbox/src/main/java/patternSpecification/regleMetier/util/AbstractCompositeSpecification.java" rel="nofollow">http://nicolaslecoz-dev-sandbox.googlecode.com/svn/trunk/nlc-java-sandbox/src/main/java/patternSpecification/regleMetier/util/AbstractCompositeSpecification.java</a></p><p>Bon courage.</p> ]]></content:encoded> </item> <item><title>Par : SPE</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-38678</link> <dc:creator>SPE</dc:creator> <pubDate>Wed, 05 Jan 2011 09:46:40 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-38678</guid> <description>Bonjour,
Je démarre la mise en place de pattern pour l&#039;implémentation de règles de gestion. Ce tuto m&#039;a bien éclairé. J&#039;ai néanmoins une question sur le contenu de la classe composite. Pourquoi contient elle un constructeur alors qu&#039;elle est abstraite ?
Pouvez vous publier son contenu ? (car j&#039;ai un doute sur mon implémentation, actuellement ma classe composite implémente les méthodes and(), or().. de la manière suivante :
public Specification and(Specification specification) {
return new AndSpecification(this, specification);
}
Mais je n&#039;ai pas de constructeur :)
Merci !!</description> <content:encoded><![CDATA[<p>Bonjour,</p><p>Je démarre la mise en place de pattern pour l&#8217;implémentation de règles de gestion. Ce tuto m&#8217;a bien éclairé. J&#8217;ai néanmoins une question sur le contenu de la classe composite. Pourquoi contient elle un constructeur alors qu&#8217;elle est abstraite ?</p><p>Pouvez vous publier son contenu ? (car j&#8217;ai un doute sur mon implémentation, actuellement ma classe composite implémente les méthodes and(), or().. de la manière suivante :</p><p>public Specification and(Specification specification) {<br
/> return new AndSpecification(this, specification);<br
/> }</p><p>Mais je n&#8217;ai pas de constructeur <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p>Merci !!</p> ]]></content:encoded> </item> <item><title>Par : Nicolas Lecoz</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-32020</link> <dc:creator>Nicolas Lecoz</dc:creator> <pubDate>Fri, 24 Sep 2010 14:57:47 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-32020</guid> <description>Bonjour Mickaël,
Je n&#039;ose pas dire que Martin Fowler à tord et que j&#039;ai raison ;). Voici mon explication :
Il n&#039;y a pas d&#039;erreur dans mon diagramme de classe. J&#039;ai sciemment fait hériter ma classe &quot;LeafSpecification&quot; de la classe parente &quot;...CompositeSpecification&quot;.
Pour la simple est bonne raison que je voulais faire un DSL de toutes mes règles métiers (NB : ce n&#039;est pas une obligation).
Ainsi avec n&#039;importe quelle règle métier je peux faire :
regle1.and(regle2.or(regle3. ... ))).and(...).or(...);
J&#039;aurais pû me contenter d&#039;utiliser les opérateurs java mais on perd rapidement en lisibilité du code (surtout quand on veut gérer des règles prioritaires par rapport aux autres grâce au parenthèsage).
En d&#039;autres mots, je me suis permis d&#039;apporter un petit gravion dans l&#039;immense édifice qu&#039;à réaliser maître Martin Fowler B-).
Nicolas LC (Xebia)</description> <content:encoded><![CDATA[<p>Bonjour Mickaël,</p><p>Je n&#8217;ose pas dire que Martin Fowler à tord et que j&#8217;ai raison <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Voici mon explication :</p><p>Il n&#8217;y a pas d&#8217;erreur dans mon diagramme de classe. J&#8217;ai sciemment fait hériter ma classe &laquo;&nbsp;LeafSpecification&nbsp;&raquo; de la classe parente &laquo;&nbsp;&#8230;CompositeSpecification&nbsp;&raquo;.</p><p>Pour la simple est bonne raison que je voulais faire un DSL de toutes mes règles métiers (NB : ce n&#8217;est pas une obligation).</p><p>Ainsi avec n&#8217;importe quelle règle métier je peux faire :</p><p>regle1.and(regle2.or(regle3. &#8230; ))).and(&#8230;).or(&#8230;);</p><p>J&#8217;aurais pû me contenter d&#8217;utiliser les opérateurs java mais on perd rapidement en lisibilité du code (surtout quand on veut gérer des règles prioritaires par rapport aux autres grâce au parenthèsage).</p><p>En d&#8217;autres mots, je me suis permis d&#8217;apporter un petit gravion dans l&#8217;immense édifice qu&#8217;à réaliser maître Martin Fowler B-).</p><p>Nicolas LC (Xebia)</p> ]]></content:encoded> </item> <item><title>Par : Mickaël</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-32012</link> <dc:creator>Mickaël</dc:creator> <pubDate>Fri, 24 Sep 2010 12:32:06 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-32012</guid> <description>Bonjour,
Dîtes moi si je me trompe mais n&#039;y a-t-il pas une erreur dans votre diagramme de classe ? J&#039;ai lu le PDF de Mr Fowler et il se trouve qu&#039;une LeafSpecification n&#039;est pas censée être une CompositeSpecification (cf. p12) Idem pour la NotSpecification.
Cordialement,
Mickaël.</description> <content:encoded><![CDATA[<p>Bonjour,</p><p>Dîtes moi si je me trompe mais n&#8217;y a-t-il pas une erreur dans votre diagramme de classe ? J&#8217;ai lu le PDF de Mr Fowler et il se trouve qu&#8217;une LeafSpecification n&#8217;est pas censée être une CompositeSpecification (cf. p12) Idem pour la NotSpecification.</p><p>Cordialement,</p><p>Mickaël.</p> ]]></content:encoded> </item> <item><title>Par : Thomas Tourlourat</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-23759</link> <dc:creator>Thomas Tourlourat</dc:creator> <pubDate>Wed, 07 Apr 2010 09:51:53 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-23759</guid> <description>Bonjour,
Merci pour cet article très intéressant qui permet de mettre un nom et une spécification sur une conception que nous utilisons souvent sans le savoir.
J&#039;aurai une petite question à vous posez.
Ce pattern - comme de nombreux autres - s&#039;applique sur la couche métier de nos architectures.
Comment peut-on l&#039;utiliser au niveau de la couche de persistance ?
Au sein de mon entreprise, nous avons des règles métier qui vont surement évoluées dans le temps.
Ces règles nous permettent de savoir quelles données nous devons remonter de la base de données vers la présentation utilisateur.
Par exemple, nous avons une contrainte sur l&#039;appartenance à un pays. Nous effectuons donc une requête SQL en ajoutant une condition sur une jointure.
Sachant que nous utilisons cette condition sur l&#039;ensemble des requêtes, si les règles métiers changent, nous devrons repasser sur l&#039;ensemble de ces requêtes pour ajouter/enlever des conditions.
On retrouve le pourquoi du comment du pattern Specification au niveau métier.
Il est possible d&#039;implémenter ce pattern pour l&#039;accès aux données persistantes. Le soucis, c&#039;est que chaque règle supplémentaire a un cout important car il s&#039;agit d&#039;un aller/retour vers la base de données. 3 milles produits x 4 règles, on explose le compteur rapidement avec 200 demandes simultanées.
Avez-vous une solution implémentation du pattern Specification pour l&#039;accès aux données ?
Cordialement,
Thomas Tourlourat - Armetiz.info</description> <content:encoded><![CDATA[<p>Bonjour,<br
/> Merci pour cet article très intéressant qui permet de mettre un nom et une spécification sur une conception que nous utilisons souvent sans le savoir.</p><p>J&#8217;aurai une petite question à vous posez.<br
/> Ce pattern &#8211; comme de nombreux autres &#8211; s&#8217;applique sur la couche métier de nos architectures.<br
/> Comment peut-on l&#8217;utiliser au niveau de la couche de persistance ?</p><p>Au sein de mon entreprise, nous avons des règles métier qui vont surement évoluées dans le temps.<br
/> Ces règles nous permettent de savoir quelles données nous devons remonter de la base de données vers la présentation utilisateur.<br
/> Par exemple, nous avons une contrainte sur l&#8217;appartenance à un pays. Nous effectuons donc une requête SQL en ajoutant une condition sur une jointure.<br
/> Sachant que nous utilisons cette condition sur l&#8217;ensemble des requêtes, si les règles métiers changent, nous devrons repasser sur l&#8217;ensemble de ces requêtes pour ajouter/enlever des conditions.<br
/> On retrouve le pourquoi du comment du pattern Specification au niveau métier.</p><p>Il est possible d&#8217;implémenter ce pattern pour l&#8217;accès aux données persistantes. Le soucis, c&#8217;est que chaque règle supplémentaire a un cout important car il s&#8217;agit d&#8217;un aller/retour vers la base de données. 3 milles produits x 4 règles, on explose le compteur rapidement avec 200 demandes simultanées.</p><p>Avez-vous une solution implémentation du pattern Specification pour l&#8217;accès aux données ?</p><p>Cordialement,<br
/> Thomas Tourlourat &#8211; Armetiz.info</p> ]]></content:encoded> </item> <item><title>Par : Cyril Lakech</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-19471</link> <dc:creator>Cyril Lakech</dc:creator> <pubDate>Sat, 09 Jan 2010 13:23:42 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-19471</guid> <description>Le 21 janvier à Lille au Ch’ti JUG nous avons l’honneur de recevoir Mark Proctor et Geoffrey De Smeet de JBoss. Mark est le projet leader du projet drools. Il vient d’être nommé directeur de RuleML. Geoffrey est le créateur de drools planner.
Plus d’informations : http://chtijug.org/rendez-vous-le-21-janvier-drools-avec-cylande-et-luniversite-de-lille-1/</description> <content:encoded><![CDATA[<p>Le 21 janvier à Lille au Ch’ti JUG nous avons l’honneur de recevoir Mark Proctor et Geoffrey De Smeet de JBoss. Mark est le projet leader du projet drools. Il vient d’être nommé directeur de RuleML. Geoffrey est le créateur de drools planner.</p><p>Plus d’informations : <a
href="http://chtijug.org/rendez-vous-le-21-janvier-drools-avec-cylande-et-luniversite-de-lille-1/" rel="nofollow">http://chtijug.org/rendez-vous-le-21-janvier-drools-avec-cylande-et-luniversite-de-lille-1/</a></p> ]]></content:encoded> </item> <item><title>Par : Nicolas Lecoz</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-19372</link> <dc:creator>Nicolas Lecoz</dc:creator> <pubDate>Wed, 06 Jan 2010 13:20:47 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-19372</guid> <description>- Contexte -
@Dun, pour gérer un contexte il y a deux possibilités. 1 - soit tu gardes le modèle de l&#039;article avec les règles qui prennent en argument des objets du modèle. Tu géres le &quot;ALORS&quot; en dehors des règles.
2 - Sinon tu peux te rapprocher d&#039;un modèle à la Drools. Tu as des règles fines qui utilisent les objets du domaine. Tu as un (ou des) règle de plus haut niveau qui eux utilisent un objet contexte. Dans cet objet contexte on peut injecter un service à appeler dans le &quot;ALORS&quot;,
@Herve A. ce contexte peut aussi servir avoir une trace de l&#039;information ou un état d&#039;exécution.
Par exemple je prends un cas concret. Prenons un algorithme métier pour l&#039;éligibilité des moyens de livraison en fonction du panier. Il faut donc créer un objet contexte à cet algorithme qui va contenir les données d&#039;entrée (le panier, ou autre) et les données de sortis, les moyens de livraison et le prix associé. On a donc maintenant des règles qui sont capables de calculer un resultat plus évolué que &quot;oui&quot; / &quot;non&quot;.</description> <content:encoded><![CDATA[<p>- Contexte -</p><p>@Dun, pour gérer un contexte il y a deux possibilités. 1 &#8211; soit tu gardes le modèle de l&#8217;article avec les règles qui prennent en argument des objets du modèle. Tu géres le &laquo;&nbsp;ALORS&nbsp;&raquo; en dehors des règles.<br
/> 2 &#8211; Sinon tu peux te rapprocher d&#8217;un modèle à la Drools. Tu as des règles fines qui utilisent les objets du domaine. Tu as un (ou des) règle de plus haut niveau qui eux utilisent un objet contexte. Dans cet objet contexte on peut injecter un service à appeler dans le &laquo;&nbsp;ALORS&nbsp;&raquo;,<br
/> @Herve A. ce contexte peut aussi servir avoir une trace de l&#8217;information ou un état d&#8217;exécution.</p><p>Par exemple je prends un cas concret. Prenons un algorithme métier pour l&#8217;éligibilité des moyens de livraison en fonction du panier. Il faut donc créer un objet contexte à cet algorithme qui va contenir les données d&#8217;entrée (le panier, ou autre) et les données de sortis, les moyens de livraison et le prix associé. On a donc maintenant des règles qui sont capables de calculer un resultat plus évolué que &laquo;&nbsp;oui&nbsp;&raquo; / &laquo;&nbsp;non&nbsp;&raquo;.</p> ]]></content:encoded> </item> <item><title>Par : Jackie Brown</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-19368</link> <dc:creator>Jackie Brown</dc:creator> <pubDate>Wed, 06 Jan 2010 11:47:35 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-19368</guid> <description>Ca n&#039;existerait pas déjà sous le nom de Closures et Predicates tout ça ? hmm ?
Merci pour le travail de rédaction.</description> <content:encoded><![CDATA[<p>Ca n&#8217;existerait pas déjà sous le nom de Closures et Predicates tout ça ? hmm ?</p><p>Merci pour le travail de rédaction.</p> ]]></content:encoded> </item> <item><title>Par : Dun</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-19123</link> <dc:creator>Dun</dc:creator> <pubDate>Fri, 01 Jan 2010 20:04:15 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-19123</guid> <description>Le pattern me semble plutôt intéressant. Il permet de formaliser les règles et de les isoler.
Par contre je ne suis pas sûr de comprendre tout : Dans l&#039;exemple cité, hormis le fait de savoir si le client est en France métropolitaine, en Ile de France ou pas, il faut aussi gérer les conséquence des ces règles càd la limite de poids de 10 kg de 100kg ou de 25kg.
Le pattern semble gérer le &quot;SI&quot; mais pas le &quot;ALORS&quot; contrairement à ce que ferait un Drools. Comment gérer de façon propre et isolé ces &quot;constantes&quot; de poids qui finalement risque de changer plus rapidement que les règles définissant si le client et de France métropolitaine ou pas ?</description> <content:encoded><![CDATA[<p>Le pattern me semble plutôt intéressant. Il permet de formaliser les règles et de les isoler.<br
/> Par contre je ne suis pas sûr de comprendre tout : Dans l&#8217;exemple cité, hormis le fait de savoir si le client est en France métropolitaine, en Ile de France ou pas, il faut aussi gérer les conséquence des ces règles càd la limite de poids de 10 kg de 100kg ou de 25kg.</p><p>Le pattern semble gérer le &laquo;&nbsp;SI&nbsp;&raquo; mais pas le &laquo;&nbsp;ALORS&nbsp;&raquo; contrairement à ce que ferait un Drools. Comment gérer de façon propre et isolé ces &laquo;&nbsp;constantes&nbsp;&raquo; de poids qui finalement risque de changer plus rapidement que les règles définissant si le client et de France métropolitaine ou pas ?</p> ]]></content:encoded> </item> <item><title>Par : Nicolas Lecoz</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-19035</link> <dc:creator>Nicolas Lecoz</dc:creator> <pubDate>Wed, 30 Dec 2009 17:03:41 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-19035</guid> <description>@ym
Merci tu as détecté un bug :). J&#039;ai corrigé mais je suis par forcement satisfait du résultat :
&lt;code&gt;
public class RegleProduitsDuPanierSontOranges extends LeafSpecification&lt;Panier&gt; {
public boolean isSatisfiedBy(Panier panier) {
for (Produit produit : panier.getProduits()) {
if ( ! (produit instanceof Abricot
&#124;&#124; produit instanceof Carotte
&#124;&#124; produit instanceof Citrouille
&#124;&#124; produit instanceof Mandarine
&#124;&#124; produit instanceof Orange)) {
return false;
}
}
return true;
}
}
&lt;/code&gt;
Je ne voulais pas en parler dans l&#039;article mais on peut aussi utiliser une sorte de pattern visiteur, par exemple un parcours en &quot;et&quot; sur les produits d&#039;un panier.
Par exemple la classe qui s&#039;occupe du parcours :
&lt;code&gt;
public abstract class ParcoursEnEtSurProduitsDuPanier extends LeafSpecification&lt;Panier&gt; {
abstract protected boolean isProduitSatisfiedBy(Produit produit);
public boolean isSatisfiedBy(Panier panier) {
for (Produit produit : panier.getProduits()) {
if ( ! isProduitSatisfiedBy(produit)) {
return false;
}
}
return true;
}
}
&lt;/code&gt;
La classe qui implémente la règle sur un produit :
&lt;code&gt;
public class RegleProduitEstOrange extends ParcoursEnEtSurProduitsDuPanier {
protected boolean isProduitSatisfiedBy(Produit produit) {
if (produit instanceof Abricot
&#124;&#124; produit instanceof Carotte
&#124;&#124; produit instanceof Citrouille
&#124;&#124; produit instanceof Mandarine
&#124;&#124; produit instanceof Orange) {
return true;
}
return false;
}
}
&lt;/code&gt;
Voila je pense que c&#039;est un peu plus lisible.</description> <content:encoded><![CDATA[<p>@ym</p><p>Merci tu as détecté un bug <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . J&#8217;ai corrigé mais je suis par forcement satisfait du résultat :<br
/> <code><br
/> public class RegleProduitsDuPanierSontOranges extends LeafSpecification <panier> {<br
/> public boolean isSatisfiedBy(Panier panier) {<br
/> for (Produit produit : panier.getProduits()) {<br
/> if ( ! (produit instanceof Abricot<br
/> || produit instanceof Carotte<br
/> || produit instanceof Citrouille<br
/> || produit instanceof Mandarine<br
/> || produit instanceof Orange)) {<br
/> return false;<br
/> }<br
/> }<br
/> return true;<br
/> }<br
/> } </panier></code><br
/> Je ne voulais pas en parler dans l&#8217;article mais on peut aussi utiliser une sorte de pattern visiteur, par exemple un parcours en &laquo;&nbsp;et&nbsp;&raquo; sur les produits d&#8217;un panier.</p><p>Par exemple la classe qui s&#8217;occupe du parcours :<br
/> <code><br
/> public abstract class ParcoursEnEtSurProduitsDuPanier extends LeafSpecification <panier> {<br
/> abstract protected boolean isProduitSatisfiedBy(Produit produit);<br
/> public boolean isSatisfiedBy(Panier panier) {<br
/> for (Produit produit : panier.getProduits()) {<br
/> if ( ! isProduitSatisfiedBy(produit)) {<br
/> return false;<br
/> }<br
/> }<br
/> return true;<br
/> }<br
/> } </panier></code><br
/> La classe qui implémente la règle sur un produit :</p><p><code><br
/> public class RegleProduitEstOrange extends ParcoursEnEtSurProduitsDuPanier {<br
/> protected boolean isProduitSatisfiedBy(Produit produit) {<br
/> if (produit instanceof Abricot<br
/> || produit instanceof Carotte<br
/> || produit instanceof Citrouille<br
/> || produit instanceof Mandarine<br
/> || produit instanceof Orange) {<br
/> return true;<br
/> }<br
/> return false;<br
/> }<br
/> }<br
/> </code><br
/> Voila je pense que c&#8217;est un peu plus lisible.</p> ]]></content:encoded> </item> <item><title>Par : Nicolas Lecoz</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-19034</link> <dc:creator>Nicolas Lecoz</dc:creator> <pubDate>Wed, 30 Dec 2009 16:47:52 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-19034</guid> <description>- Drools -
Petite exclusivité, la semaine prochaine, il y aura un prochain article sur Drools ;). Selon moi ce pattern peut rapidement être mis en place avec un cout et temps minimum dans les équipes de développement, contrairement à Drools. Drools est un framework assez complexe mais pas insurmontable. Ce framework a de nombreux avantages, mais les fonctionnalités doivent bien être maitrisées afin de se lancer (DSL, table de décision via fichier Excel, IHM, langage MVEL (drools), ... ).
Drools demande de former les développeurs et de faire idéalement un prototype. Cependant Drools est relativement facilement intégrable dans un projet existant. On peut envisager d&#039;intégrer en douceur Drools c&#039;est à dire algorithme par algorithme.</description> <content:encoded><![CDATA[<p>- Drools -</p><p>Petite exclusivité, la semaine prochaine, il y aura un prochain article sur Drools <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Selon moi ce pattern peut rapidement être mis en place avec un cout et temps minimum dans les équipes de développement, contrairement à Drools. Drools est un framework assez complexe mais pas insurmontable. Ce framework a de nombreux avantages, mais les fonctionnalités doivent bien être maitrisées afin de se lancer (DSL, table de décision via fichier Excel, IHM, langage MVEL (drools), &#8230; ).</p><p>Drools demande de former les développeurs et de faire idéalement un prototype. Cependant Drools est relativement facilement intégrable dans un projet existant. On peut envisager d&#8217;intégrer en douceur Drools c&#8217;est à dire algorithme par algorithme.</p> ]]></content:encoded> </item> <item><title>Par : Nicolas Lecoz</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-19033</link> <dc:creator>Nicolas Lecoz</dc:creator> <pubDate>Wed, 30 Dec 2009 16:39:32 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-19033</guid> <description>Bonjour, merci pour vos commentaires
- gestion de règle à chaud -
@Ga.K
Concernant la gestion de règle à chaud c&#039;est assez simple, en fait notre solution finale combine une solution Java avec ce pattern et du Groovy, pour sa syntaxe puissante. De plus on utilise le module Spring pour le support dynamique de langage : http://static.springsource.org/spring/docs/2.0.x/reference/dynamic-language.html.
Donc la modification de certaines règles se résume à un redéploiement des fichiers Groovy, après Spring fait le reste ;). Après il faut trouver un bon compris entre développement en Java et Groovy.</description> <content:encoded><![CDATA[<p>Bonjour, merci pour vos commentaires</p><p>- gestion de règle à chaud -</p><p>@Ga.K</p><p>Concernant la gestion de règle à chaud c&#8217;est assez simple, en fait notre solution finale combine une solution Java avec ce pattern et du Groovy, pour sa syntaxe puissante. De plus on utilise le module Spring pour le support dynamique de langage : <a
href="http://static.springsource.org/spring/docs/2.0.x/reference/dynamic-language.html" rel="nofollow">http://static.springsource.org/spring/docs/2.0.x/reference/dynamic-language.html</a>.<br
/> Donc la modification de certaines règles se résume à un redéploiement des fichiers Groovy, après Spring fait le reste <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Après il faut trouver un bon compris entre développement en Java et Groovy.</p> ]]></content:encoded> </item> <item><title>Par : Hervé A.</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-19028</link> <dc:creator>Hervé A.</dc:creator> <pubDate>Wed, 30 Dec 2009 14:02:54 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-19028</guid> <description>Moi ça me fait penser au pattern décorateur (un café crème, un café crème sucré, un café sucré...), avec des règles de composition mieux précisées, et un test d&#039;accord.
Je trouve ça pas mal, peut être faudrait-il y adjoindre un contexte d&#039;opération ? Les règles sont souvent intitulées xxxDuPanierYyy, cela ne serait pas mieux que de formaliser ce DuPanier, histoire de ne pas appliquer des règles DuPanier à des objets DeLivraison, par exemple ?
Moi aussi j&#039;ai beaucoup lorgné du coté de drools, toujours pour conclure avec grand regret que c&#039;était trop compliqué pour moi. Si quelqu&#039;un peut me démontrer que je me suis trompé, j&#039;en serais fort content. J&#039;en suis arrivé à penser qu&#039;on pouvait peut être traiter les règles par un jeu de routes à la mode Camel, mais j&#039;en suis aux supputations des considérations.</description> <content:encoded><![CDATA[<p>Moi ça me fait penser au pattern décorateur (un café crème, un café crème sucré, un café sucré&#8230;), avec des règles de composition mieux précisées, et un test d&#8217;accord.</p><p>Je trouve ça pas mal, peut être faudrait-il y adjoindre un contexte d&#8217;opération ? Les règles sont souvent intitulées xxxDuPanierYyy, cela ne serait pas mieux que de formaliser ce DuPanier, histoire de ne pas appliquer des règles DuPanier à des objets DeLivraison, par exemple ?</p><p>Moi aussi j&#8217;ai beaucoup lorgné du coté de drools, toujours pour conclure avec grand regret que c&#8217;était trop compliqué pour moi. Si quelqu&#8217;un peut me démontrer que je me suis trompé, j&#8217;en serais fort content. J&#8217;en suis arrivé à penser qu&#8217;on pouvait peut être traiter les règles par un jeu de routes à la mode Camel, mais j&#8217;en suis aux supputations des considérations.</p> ]]></content:encoded> </item> <item><title>Par : olivier</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-19011</link> <dc:creator>olivier</dc:creator> <pubDate>Wed, 30 Dec 2009 01:30:06 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-19011</guid> <description>Pattern très simple, souple pour vérifier des règles métiers ou les invariants d&#039;un objet.
Cependant je voudrais aller plus loin et retourner la ou les raisons de l&#039;échec de l&#039;application d&#039;une règle métier afin que l&#039;utilisateur sache où corriger son erreur. J&#039;ai fait en sorte que la spécification retourne une paire contenant le boolean classique et la raison de l&#039;échec si false.
Là, j&#039;ai un problème...
En effet les combinaisons de spécifications peuvent être complexes, et par conséquent la raison de l&#039;échec est difficilement exprimable. Peut être est-ce normal; ou alors je m&#039;y prends mal.
Quelqu&#039;un aurait une idée?</description> <content:encoded><![CDATA[<p>Pattern très simple, souple pour vérifier des règles métiers ou les invariants d&#8217;un objet.</p><p>Cependant je voudrais aller plus loin et retourner la ou les raisons de l&#8217;échec de l&#8217;application d&#8217;une règle métier afin que l&#8217;utilisateur sache où corriger son erreur. J&#8217;ai fait en sorte que la spécification retourne une paire contenant le boolean classique et la raison de l&#8217;échec si false.<br
/> Là, j&#8217;ai un problème&#8230;<br
/> En effet les combinaisons de spécifications peuvent être complexes, et par conséquent la raison de l&#8217;échec est difficilement exprimable. Peut être est-ce normal; ou alors je m&#8217;y prends mal.</p><p>Quelqu&#8217;un aurait une idée?</p> ]]></content:encoded> </item> <item><title>Par : Team42</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-18996</link> <dc:creator>Team42</dc:creator> <pubDate>Tue, 29 Dec 2009 20:01:19 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-18996</guid> <description>Nous utilisons ce pattern depuis plusieurs années pour vérifier les &quot;invariants&quot; d’une classe. C&#039;est simple et efficace.
Nos classes métier encapsulent bien sûr tous ces &quot;invariants&quot; (qui sont une partie des règles métier), et exposent uniquement la méthode estCoherent() au reste du monde. Ainsi on peut à tout moment vérifier la cohérence d’un objet ou d’un aggregat (Aggregate). Vive le DDD!!!
Par contre, comment remonter -simplement- la bonne information en cas d’échec d’une des spécifications? Ceci est encore plus important si vous enchaînez plusieurs spécifications. C’est, à ce jour, la seule limite que nous avons trouvée à ce pattern...
Au final, le plus important est de ce concentrer sur votre modèle Objet (anémique ou riche?). Le pattern Specification convient à un certain type de &quot;règles métier&quot;, mais peut-être pas pour toutes (attention au marteau...).
Merci pour vos articles et bonne année 2010!</description> <content:encoded><![CDATA[<p>Nous utilisons ce pattern depuis plusieurs années pour vérifier les &laquo;&nbsp;invariants&nbsp;&raquo; d’une classe. C&#8217;est simple et efficace.<br
/> Nos classes métier encapsulent bien sûr tous ces &laquo;&nbsp;invariants&nbsp;&raquo; (qui sont une partie des règles métier), et exposent uniquement la méthode estCoherent() au reste du monde. Ainsi on peut à tout moment vérifier la cohérence d’un objet ou d’un aggregat (Aggregate). Vive le DDD!!!</p><p>Par contre, comment remonter -simplement- la bonne information en cas d’échec d’une des spécifications? Ceci est encore plus important si vous enchaînez plusieurs spécifications. C’est, à ce jour, la seule limite que nous avons trouvée à ce pattern&#8230;</p><p>Au final, le plus important est de ce concentrer sur votre modèle Objet (anémique ou riche?). Le pattern Specification convient à un certain type de &laquo;&nbsp;règles métier&nbsp;&raquo;, mais peut-être pas pour toutes (attention au marteau&#8230;).</p><p>Merci pour vos articles et bonne année 2010!</p> ]]></content:encoded> </item> <item><title>Par : David Andrianavalontsalama</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-18985</link> <dc:creator>David Andrianavalontsalama</dc:creator> <pubDate>Tue, 29 Dec 2009 11:26:18 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-18985</guid> <description>Très intéressant.</description> <content:encoded><![CDATA[<p>Très intéressant.</p> ]]></content:encoded> </item> <item><title>Par : Dominique De Vito</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-18984</link> <dc:creator>Dominique De Vito</dc:creator> <pubDate>Tue, 29 Dec 2009 11:01:18 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-18984</guid> <description>Le pattern Specification semble le mix des patterns Command et Composite.
Je suis curieux de savoir pourquoi Drools semblait trop complexe...
Sinon, à mi-chemin, comme mentionné dans un commentaire précédent, l&#039;usage d&#039;un DSL semble effectivement une option.</description> <content:encoded><![CDATA[<p>Le pattern Specification semble le mix des patterns Command et Composite.</p><p>Je suis curieux de savoir pourquoi Drools semblait trop complexe&#8230;</p><p>Sinon, à mi-chemin, comme mentionné dans un commentaire précédent, l&#8217;usage d&#8217;un DSL semble effectivement une option.</p> ]]></content:encoded> </item> <item><title>Par : rlemaire</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-18983</link> <dc:creator>rlemaire</dc:creator> <pubDate>Tue, 29 Dec 2009 10:56:59 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-18983</guid> <description>Très bon article et très bonne idée de pattern. Le résultat fait assez DSL.</description> <content:encoded><![CDATA[<p>Très bon article et très bonne idée de pattern. Le résultat fait assez DSL.</p> ]]></content:encoded> </item> <item><title>Par : ym</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-18981</link> <dc:creator>ym</dc:creator> <pubDate>Tue, 29 Dec 2009 09:37:37 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-18981</guid> <description>Juste pour pinailler, il semble bien que la règle RegleProduitsDuPanierSontOranges qui &quot;permet de déterminer si tous les produits du panier sont oranges&quot;, ne détermine plutôt que la couleur du premier produit du panier.</description> <content:encoded><![CDATA[<p>Juste pour pinailler, il semble bien que la règle RegleProduitsDuPanierSontOranges qui &laquo;&nbsp;permet de déterminer si tous les produits du panier sont oranges&nbsp;&raquo;, ne détermine plutôt que la couleur du premier produit du panier.</p> ]]></content:encoded> </item> <item><title>Par : Ga.K.</title><link>http://blog.xebia.fr/2009/12/29/le-pattern-specification-pour-la-gestion-de-vos-regles-metier/#comment-18979</link> <dc:creator>Ga.K.</dc:creator> <pubDate>Tue, 29 Dec 2009 09:03:18 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3674#comment-18979</guid> <description>Bon article sur un pattern intéressant - et que l&#039;on applique parfois sans le savoir. Ne va pas assez loin sur le rechargement à chaud mais bon, pas de souci particulier.
Drools n&#039;est pas si compliqué que cela, en tout cas ce sont des gens qui le maîtrisent bien qui m&#039;ont dit ça. Une belle solution, mais ajouter encore un outil? A chacun de juger selon ses besoins et ses contraintes.
Autre solution, que j&#039;ai vu appliquée : au lieu d&#039;avoir des des gens qui veulent n&#039;importe quoi et qui oublient d&#039;un jour sur l&#039;autre ce qu&#039;ils voulaient - Et oui.... ça peut amener à ça aussi, de donner la main sur les règles métier à des gens pas totalement férus de logique... - avoir une cellule archi/développement stable qui est garante des règles métier.
Autre solution, le dsl. Sorte de sur-mesure de la gestion des règles métier. La création d&#039;objets qui obéissent à un pattern aidera tout de même pas mal à la création d&#039;un dsl. On le voit, dans le code présenté ici en exemple
Bonne année, les xebia boys!</description> <content:encoded><![CDATA[<p>Bon article sur un pattern intéressant &#8211; et que l&#8217;on applique parfois sans le savoir. Ne va pas assez loin sur le rechargement à chaud mais bon, pas de souci particulier.<br
/> Drools n&#8217;est pas si compliqué que cela, en tout cas ce sont des gens qui le maîtrisent bien qui m&#8217;ont dit ça. Une belle solution, mais ajouter encore un outil? A chacun de juger selon ses besoins et ses contraintes.</p><p>Autre solution, que j&#8217;ai vu appliquée : au lieu d&#8217;avoir des des gens qui veulent n&#8217;importe quoi et qui oublient d&#8217;un jour sur l&#8217;autre ce qu&#8217;ils voulaient &#8211; Et oui&#8230;. ça peut amener à ça aussi, de donner la main sur les règles métier à des gens pas totalement férus de logique&#8230; &#8211; avoir une cellule archi/développement stable qui est garante des règles métier.</p><p>Autre solution, le dsl. Sorte de sur-mesure de la gestion des règles métier. La création d&#8217;objets qui obéissent à un pattern aidera tout de même pas mal à la création d&#8217;un dsl. On le voit, dans le code présenté ici en exemple</p><p>Bonne année, les xebia boys!</p> ]]></content:encoded> </item> </channel> </rss>
