Vous êtes sur la page 1sur 42

Introduction

Les services et les modules


Les patrons de conception

Les Framework Java


Spring

Claude Duvallet
Universit du Havre
UFR Sciences et Techniques
25 rue Philippe Lebon - BP 540
76058 LE HAVRE CEDEX

Claude.Duvallet@gmail.com
http://litis.univ-lehavre.fr/duvallet/

Claude Duvallet 1/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Spring

Introduction

Les services et les modules

Les patrons de conception

Claude Duvallet 2/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Prsentation de Spring (1/2)


I

SPRING est effectivement un conteneur dit lger , cest--dire


une infrastructure similaire un serveur dapplication J2EE.

Il prend en charge la cration dobjets et la mise en relation


dobjets par lintermdiaire dun fichier de configuration qui dcrit
les objets fabriquer et les relations de dpendances entre ces
objets.

Le gros avantage par rapport aux serveurs dapplication est


quavec SPRING, vos classes nont pas besoin dimplmenter
une quelconque interface pour tre prises en charge par le
framework (au contraire des serveurs dapplications J2EE et des
EJBs).

Cest en ce sens que SPRING est qualifi de conteneur lger .

Claude Duvallet 3/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Prsentation de Spring (2/2)

Outre cette espce de super fabrique dobjets, SPRING propose


tout un ensemble dabstractions permettant de grer entre
autres :
Le mode transactionnel.
Lappel dEJBs.
La cration dEJBs.
La persistance dobjets
La cration dune interface Web.
Lappel et la cration de WebServices.

Pour raliser tout ceci, SPRING sappuie sur les principes du


design pattern IoC et sur la programmation par aspects (AOP).

Spring est disponible sous licence Apache 2.0.

Claude Duvallet 4/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Les services fournis par Spring (1/2)


Spring propose les services suivants (liste non-exhaustive) :
I

Dcouplage des composants. Moins dinterdpendances entre


les diffrents modules.

Rendre plus aiss les tests des applications complexes


cest--dire des applications multicouches.

Diminuer la quantit de code par lintgration de frameworks tiers


directement dans Spring.

Permettre de mettre en oeuvre facilement la programmation


oriente aspect.

Un systme de transactions au niveau mtier qui permet par


exemple de faire du "two-phases-commit".

Claude Duvallet 5/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Les services fournis par Spring (2/2)

Un mcanisme de scurit.

Pas de dpendances dans le code lapi Spring lors lutilisation


de linjection. Ce qui permet de remplacer une couche sans
impacter les autres.

Une implmentation du design pattern MVC

Un support du protocole RMI. Tant au niveau serveur quau


niveau du client.

Dployer et consommer des web-services trs facilement.

Echanger des objets par le protocole http.

Claude Duvallet 6/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Les modules de Spring (1/2)


Le framework est organis en modules, reposant tous sur le module
Spring Core :
Spring Core : implmente notamment le concept dinversion de
contrle (injection de dpendance). Il est galement responsable
de la gestion et de la configuration du conteneur.
I Spring Context : Ce module tend Spring Core. Il fournit une
sorte de base de donnes dobjets, permet de charger des
ressources (telles que des fichiers de configuration) ou encore la
propagation dvnements et la cration de contexte comme par
exemple le support de Spring dans un conteneur de Servlet.
I Spring AOP : Permet dintgrer de la programmation oriente
aspect.
I Spring DAO : Ce module permet dabstraire les accs la base
de donnes, dliminer le code redondant et galement
dabstraire les messages derreur spcifiques chaque vendeur.
Il fournit en outre une gestion des transactions.

Claude Duvallet 7/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Les modules de Spring (2/2)


I

Spring ORM : Cette partie permet dintgrer des frameworks de


mapping Object/Relationnel tel que Hibernate, JDO ou iBatis
avec Spring. La quantit de code conomis par ce package peut
tre trs impressionnante (ouverture, fermeture de session,
gestion des erreurs)

Spring Web : Ensemble dutilitaires pour les applications web.


Par exemple une servlet qui dmarre le contexte (le conteneur)
au dmarrage dune application web. Permet galement dutiliser
des requtes http de type multipart. Cest aussi ici que se fait
lintgration avec le framework Struts.

Spring Web MVC : Implmentation du modle MVC.


Personnellement jutilise plutt Struts mais cest surtout une
question dhabitude, cest l la grande force de Spring, rien ne
vous oblige tout utiliser et vous pouvez tout mlanger. Ce qui
nest pas forcment une bonne ide mais nous en reparlerons.
Claude Duvallet 8/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Les patrons de conception

En anglais, on parle de Design Pattern.

Spring repose sur des concepts prouvs, patrons de conception


et paradigmes, dont les plus connus sont
IoC (Inversion of Control),
le singleton,
la programmation oriente Aspect,
ou encore le modle de programmation dit "par template".

Ces concepts ntant pas propre Spring, ils sappliquent


galement dautres frameworks.

Claude Duvallet 9/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Le modle de conception "fabrique" (factory) (1/3)


I

Cest grce ce modle que Spring peut produire des objets


respectant un contrat mais indpendants de leur implmentation.

En ralit, ce modle est bas sur la notion dinterface et donc de


contrat.

Lide est simplement davoir un point dentre unique qui permet


de produire des instances dobjets.

Tout comme une usine produit plusieurs types de voitures, cette


usine a comme caractristique principale de produire des voitures

De la mme faon une fabrique dobjets produira nimporte quel


type dobjet pour peu quils respectent le postulat de base.

Ce postulat (le contrat) pouvant tre trs vague ou au contraire


trs prcis.

Claude Duvallet 10/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Le modle de conception "fabrique" (factory) (2/3)


I

Voyons le diagramme de classe :

On remarque facilement que le simple fait de changer la mthode


getForm() permet de passer dun formulaire de type swing un
formulaire de type html.

Cela sans avoir le moindre impact sur tout le code qui en dcoule.

Claude Duvallet 11/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Le modle de conception "fabrique" (factory) (3/3)


I

Nous avons vu ci-dessus que Spring encourageait la


programmation par contrat en voici lune des nombreuses
raisons.

Bien entendu aussi longtemps que le programmeur charg de


raliser la classe SwingForm naura pas termin sa tche, la
mthode getForm() pourra renvoyer une instance dune pseudo
implmentation qui renvoie toujours null ou certaines erreurs
remplies en dur pour pouvoir tester et dvelopper les classes
clientes.

Naturellement lui seul ce pattern ne suffit pas, il faudra lui


adjoindre le singleton et des possibilits de configuration ainsi
que le modle "bean".

Ds lors le pattern IoC (Inversion of control) sera ralisable.

Claude Duvallet 12/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Le singleton (1/2)

Il sagit certainement du patron de conception le plus connu.

En effet, il est (trs) utilis dans beaucoup de domaines.

Ce modle revient sassurer quil ny aura toujours quune


instance dune classe donne qui sera instancie dans la
machine virtuelle.

Les objectifs sont simples :


1
2

Eviter le temps dinstanciation de la classe.


Eviter la consommation de mmoire inutile.

Ce modle impose cependant une contrainte dimportance, la


classe qui fournit le service ne doit pas avoir de notion de
session.

Claude Duvallet 13/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Le singleton (2/2)
I

Cest dire quimporte le module appelant, le service ragira


toujours de la mme faon paramtre quivalent, il na pas de
notion dhistorique (ou de session).

Le POJO qui implmentera le service ne doit pas stocker des


informations au niveau de lobjet lui-mme.

Pour faire simple il ne faut pas modifier les variables membres au


sein dune opration (une mthode du service).

Ce concept relativement simple apprhender, est galement


simple mettre en oeuvre. Du moins en thorie.

Lobjectif est de garantir lunicit de linstance, pour cela il faut


interdire la cration de toute instance en dehors du contrle de la
classe.

Dans ce but, le constructeur est rendu priv et une mthode qui


retourne une instance de la classe est mise disposition.
Claude Duvallet 14/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Le diagramme de classe du Singleton (1/2)

Ce diagramme de classe se traduit par la portion de code


suivante :
public class Singleton {
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
private Singleton() {}
private static Singleton instance;
}

Claude Duvallet 15/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Le diagramme de classe du Singleton (2/2)

En fait il manque quelque chose pour que ce soit une


implmentation correcte du singleton.

Il sagit du problme du multithreading, en effet si plusieurs


threads accdent de faon simultane la mthode
getInstance() il se peut que les deux threads dtectent en
mme temps que le membre est null ce qui conduira un
problme.

Pour cela, il faudrait dclarer la mthode synchronized ou tout du


moins la portion de code qui manipule linstance.

Cest justement un des avantages de Spring, vous navez plus


vous soucier de cela, Spring le fait et il le fait trs bien.

Claude Duvallet 16/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Linversion de contrle (1/5)

Linversion de contrle (IoC : Inversion of Control) ou linjection de


dpendances (Dependency Injection) est sans doute le concept
central de Spring.

Il sagit dun "design pattern" qui a pour objectif de faciliter


lintgration de composants entre eux.

Le concept est bas sur le fait dinverser la faon dont sont crs
les objets.
I Dans la plupart des cas, si je souhaite crer un objet qui en utilise
un autre je programmerai quelque chose du type :
I

DBConnexion c=new DBConnexion("jdbc:... ") ;


Pool p=new Pool(c);
//reste du code
SecurityDAO securityDao=new SecurityDao(p);
SecurityBusiness securityBusiness=new securityBusiness(securityDao);

Claude Duvallet 17/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Linversion de contrle (2/5)


prsent votre chef de projet, vous dit : "le client a chang
davis, il souhaite utiliser LDAP et non sa base de donnes pour
lidentification".
I Donc, vous devez changer en :

Properties p=new Properties ("ldap.properties");


LDAPConnexion c=new LDAPConnexion(p) ;
//reste du code
SecurityDAO securityDao=new SecurityDao(c);
SecurityBusiness securityBusiness=new securityBusiness(securityDao);
I

De l, votre chef de projet revient, et vous dit que la direction a


dcid den faire un produit standard compatible avec toutes les
bases de donnes et systmes dauthentification comme Active
Directory.

Bon, prsent pour vous a devient moins drle.

La solution consiste bien sparer les couches et utiliser des


interfaces pour se faire.
Claude Duvallet 18/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Linversion de contrle (3/5)


I

Naturellement, il ne sagit pas de quelque chose de propre


Spring, donc dans un premier temps nous aurons :
IConnexion c=new LDAPConnexionImpl () ;
ISecurityDAO securityDao=new LDAPSecurityDaoImpl(c);
ISecurityBusiness securityBusiness=new SecurityBusinessImpl(securityDao);

Maintenant le problme qui se pose est celui de la configuration,


comment configurer de manire simple les drivers et les objets
ncessaires.

Et surtout comment faire pour que le tout sintgre proprement


dans lapplication.

Entre en jeu de linversion de contrle.


I

Lobjectif nest plus de fournir un objet un autre objet mais au


contraire de faire en sorte que, lobjet dont on a besoin, sache
lui-mme ce dont il a besoin.

Et le cas chant si un des objets ncessaires a lui-mme des


dpendances quil se dbrouille pour les obtenir.
Claude Duvallet 19/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Linversion de contrle (4/5)


I

Ce qui devrait rsulter en :


ISecurityBusiness securityBusiness=IoCContainer.getBean("ISecurityBean);

La mthode getBean est purement formelle pour lexemple,


lobjectif est de montrer que le code est rduit sa forme la plus
simple, les dpendances tant dclares dans la configuration du
conteneur.

Le rle de cette mthode :


1

2
3

Elle rsout le nom ISecurityBean dans son arbre de dpendances


et trouve la classe qui limplmente.
Elle en cre une instance (cas dune injection pas mutateurs).
Elle cre les objets dpendants et les dfinit dans lobjet
ISecurityBean grce ses accesseurs.
Et enfin, rcursivement elle fait de mme pour toutes les
dpendances des dpendances.

Claude Duvallet 20/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Linversion de contrle (5/5)


I

Sur la figure suivante on remarque que les dpendances entre


les couches sont rduites au minimum et que lon peut facilement
remplacer une implmentation par une autre sans mettre en
danger la stabilit et lintgrit de lensemble.

Claude Duvallet 21/42

Framework

Introduction
Les services et les modules
Les patrons de conception

La notion dinjection de dpendances

Il existe trois types dinjection :


Linjection par constructeurs.
Linjection par mutateurs (setters).
Linjection dinterface.

Claude Duvallet 22/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Linjection par constructeurs

Ce type dinjection se fait sur le constructeur, cest--dire que le


constructeur dispose de paramtres pour directement initialiser
tous les membres de la classe.
Object construitComposant(String pNom){
Class c=rechercheLaClassQuiImplemente(pNom) ;
String[] dep= rechercheLesDependance(pNom) ;
Params[] parametresDeConstructeur;
Pour chaque element (composant) de dep
Faire
Object o= construitComposant(composant) ;
Rajouter o la liste de parametresDeConstructeur ;
Fin Faire
construireClasse( c, parametresDeConstructeur)
}

Claude Duvallet 23/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Linjection par mutateurs (setters)


I

Ce type dinjection se fait aprs une initialisation laide dun


constructeur sans paramtre puis les diffrents champs sont
initialiss grce des mutateurs.

composant.setNomMembre(o) : le nom setNomMembre est


trouv grce la configuration du composant o il est dclar : le
membre initialiser est nomMembre.
Object construitComposant(String pNom){
Class c=rechercheLaClassQuiImplemente(pNom) ;
Object composanr=new c() ;
String[] dep= rechercheLesDependance(pNom) ;
Params[] parametresDeConstructeur;
Pour chaque element (composant) de dep
Faire
Object o= construitComposant(composant) ;
composant.setNomMembre(o) ;
Fin Faire
}

Claude Duvallet 24/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Linjection dinterface (1/2)


I

Cette injection se fait sur la base dune mthode.

Elle est proche de linjection par mutateurs, la diffrence se


rsume pouvoir utiliser un autre nom de mthode que ceux du
"design pattern bean".

Pour cela, il faut utiliser une interface afin de dfinir le nom de la


mthode qui injectera la dpendance.
Object construitComposant(String pNom){
Class c=rechercheLaClassQuiImplemente(pNom) ;
Object composanr=new c() ;
String[] dep= rechercheLesDependance(pNom) ;
Params[] parametresDeConstructeur;
Pour chaque element (composant) de dep
Faire
Object o= construitComposant(composant) ;
composant.mthodeInjection(o) ;
Fin Faire
}

Claude Duvallet 25/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Linjection dinterface (2/2)

composant.mthodeInjection(o) : le nom
mthodeInjection est trouv grce la configuration du
composant o il est dclar.

I
I

La mthode qui injecte lobjet est dfinie par une interface.


Dans notre exemple, linterface serait :
public interface IInjectMethode{
public void mthodeInjection(Object o);
}

Limplmentation du composant se devra alors dimplmenter


cette interface galement.

Claude Duvallet 26/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Programmation orient Aspect (1/4)


I

Comme nous pouvons le voir dans la figure suivante, un module


ou composant mtier est rgulirement pollu par de multiples
appels des composants utilitaires externes.

Claude Duvallet 27/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Programmation orient Aspect (2/4)

De fait, ces appels rendent le code plus complexe et donc moins


lisible.

Comme chacun sait, un code plus court et donc plus clair


amliore la qualit et la rutilisabilit.

Lutilisation de composants externes implique :


1
2
3
4

Enchevtrement du code.
Faible rutilisabilit.
Qualit plus basse due la complexit du code.
Difficult faire voluer.

Claude Duvallet 28/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Programmation orient Aspect (3/4)


I

La solution constituerait donc externaliser tous les traitements


non relatifs la logique mtier en dehors du composant.

Pour ce faire il faut pouvoir dfinir des traitements de faon


dclarative ou programmative sur les points cls de lalgorithme.
Typiquement avant ou aprs une mthode.

Dans la plupart des cas, ce genre de traitements utilitaires se fait


en dbut ou en fin de mthode, comme par exemple journaliser
les appels ou encore effectuer un commit ou un rollback sur une
transaction.

La dmarche est alors la suivante :


1

Dcomposition en aspect : Sparer la partie mtier de la partie


utilitaire.
Programmation de la partie mtier : Se concentrer sur la partie
variante.
Recomposition des aspects : Dfinition des aspects.
Claude Duvallet 29/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Programmation orient Aspect (4/4)

Il existe deux types de programmation oriente aspect, ces deux


techniques ont chacune des avantages et des inconvnients :
lapproche statique, cest--dire que la connexion entre laspect et
la partie mtier se fait au moment de la compilation ou aprs dans
une phase de post-production. Par exemple par manipulation du
bytecode.
Comme toujours cette mthode intrusive nest pas forcment la
plus transparente.
Lapproche dynamique, dans ce cas, la connexion seffectue par la
rflexion donc au moment de lexcution.
Cette mthode bien que plus transparente est naturellement plus
lente, mais prsente lavantage de pouvoir tre reconfigure sans
recompilation.

Claude Duvallet 30/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Programmation par template (1/3)


I

Lobjet de ce design pattern est de sparer linvariant dun


procd de sa partie variante.

Dans Spring les templates sont trs utiliss dans le cadre de


laccs aux donnes et de la gestion des transactions.

Claude Duvallet 31/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Programmation par template (2/3)

La partie invariante du code est place dans la partie abstraite de


la classe, ainsi toute classe qui hritera de cette classe abstraite
naura qu implmenter la partie variante.

Voici un exemple dutilisation du pattern template tir de la


documentation de Spring :
tt.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
updateOperation1();
updateOperation2();
}
});

Claude Duvallet 32/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Programmation par template (3/3)

Voici comment est dclare cette classe dans Spring :


public abstract class TransactionCallbackWithoutResult
implements TransactionCallback {
public final Object doInTransaction(TransactionStatus status) {
doInTransactionWithoutResult(status);
return null;
}
protected abstract void doInTransactionWithoutResult(
TransactionStatus status);
}

Ce qui satisfait prcisment au schma de classe dclar


ci-dessus.

La partie variante est implmente dans la mthode abstraite, en


loccurrence ce que vous voulez effectuer dans une transaction.

Claude Duvallet 33/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Le modle MVC 1 et 2 (Model View Controller) (1/9)

Ce nest peut-tre pas le concept le plus important dans Spring,


dans la mesure o il a t largement dmocratis par Struts.

Cependant encore trop de programmeurs ont tendance


mlanger toutes les couches, mettre des traitements mtiers
dans la jsp, ou encore des servlets dans lesquelles ils mlangent
allgrement html, javascript, mtier et bien dautres choses.

tant donn que lun des objectifs les plus importants de Spring
est la sparation des couches, la partie MVC et le concept dun
point de vue gnral semblent indispensables.

Comme cit prcdemment lobjectif est de sparer les couches


et les technologies.

Claude Duvallet 34/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Le modle MVC 1 et 2 (Model View Controller) (2/9)

Pour raliser la sparation entre les couches et les technologies,


le paradigme se divise en trois parties :
Le modle (Model).
La vue (View).
Le contrleur (Controller).

La couche daccs aux donnes est ignore ici parce que sous
jacente la couche mtier.

Claude Duvallet 35/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Le modle MVC 1 et 2 (Model View Controller) (3/9)

Le modle (Model) :
I

Cest la reprsentation des informations lies spcifiquement au


domaine de lapplication.

Cest un autre nom pour dsigner la couche mtier.

La couche mtier ou plutt la partie qui reprsente linformation


en respectant une structure lie au domaine dactivit, celle qui
effectue des calculs ou des traitements amenant une plus value
sur linformation brute.

Par exemple le calcul du total des taxes sur un prix hors taxe ou
encore des vrifications telles que : Y a t-il encore des articles en
stock avant dautoriser une sortie de stock.

Claude Duvallet 36/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Le modle MVC 1 et 2 (Model View Controller) (4/9)


La vue (View) :
I

Cette couche ou ce module effectue le rendu de la couche mtier


dans une forme qui est comprhensible par lhomme, par
exemple une page html.

Attention souvent le concept MVC est associ une application


web mais ce nest pas obligatoire : en effet le framework Swing
qui permet de produire des interfaces utilisateurs "sous forme de
clients lourds" permet galement dimplmenter MVC.

Le contrleur (Controller) :
I

Ce module organise la communication entre les deux premiers.

Il invoquera une action dans la couche mtier (par exemple


rcuprer les donnes dun client) suite une action de
lutilisateur et passera cette information la vue (jsp qui affiche
les dtails).
Claude Duvallet 37/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Le modle MVC 1 et 2 (Model View Controller) (5/9)

La couche daccs aux donnes est ignore ici parce que sous
jacente la couche mtier.

Tout dabord cela vous permettra de pouvoir debugger et tester


plus facilement le code en lisolant de la partie affichage.

En effet, la plupart des bugs sont des problmes avec linterface


donc ce nest pas la peine de compliquer encore la donne avec
des bugs mtiers ou daccs aux donnes.

De plus, le jour o il vous faudra rendre lapplication compatible


avec les tlphones portables vous naurez qu remplacer la
partie Vue par une vue qui supporte wml par exemple.

Claude Duvallet 38/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Le modle MVC 1 et 2 (Model View Controller) (6/9)


I

Le modle MVC version 1 :

Claude Duvallet 39/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Le modle MVC 1 et 2 (Model View Controller) (7/9)

Le problme de ce design pattern est la partie concernant les


notifications de changement dans le modle.

En effet, si ce point ne pose pas de problme dans le cadre de


swing par exemple, o les composants de la vue sont connects
et capables dintelligence, il nen est pas de mme pour les
applications web.

Dans le cadre dune application web, cest le design pattern


MVC2 qui est utilis car il ne ncessite pas lemploi du design
pattern observer.

Ce dernier permet la notification sur les composants : il observe


le modle et permet la vue de ragir pour se mettre jour.

Claude Duvallet 40/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Le modle MVC 1 et 2 (Model View Controller) (8/9)


I

Le modle MVC version 2 :

Claude Duvallet 41/42

Framework

Introduction
Les services et les modules
Les patrons de conception

Le modle MVC 1 et 2 (Model View Controller) (9/9)


I

On remarque que cest le contrleur qui devient le module central.

De fait, la vue peut prsent se contenter dafficher sans aucune


intelligence.

Cependant, mme si le design MVC permet de mieux sparer les


couches, il ne faut pas oublier quil ne sagit pas de la faon de
procder la plus intuitive.

Elle induit donc dinvestir du temps dans la rflexion sur la faon


de sparer les diffrentes couches et technologies et surtout de
bien rflchir dans quelle couche seffectue quel traitement.

De plus les frameworks gnrent souvent plus de fichiers et


naturellement plus de configuration.

Ce surplus de complexit est cependant bien contrebalanc par


la flexibilit suprieure, la plus grande fiabilit, une plus grande
facilit pour tester et dbugger (puisque que lon peut tester les
bouts un un).
Claude Duvallet 42/42

Framework