1
Génie lgiciel Architecture pattern Vue d ensemble Descriptin des sus-systèmes et des cmpsants d un lgiciel et leurs relatins Mtivatins : Les lgiciels snt de plus en plus grands et cmplexes. Certains critères de qualité divent être atteints : fiabilité, efficacité, pssibilité d évlutin, ergnmie,... niveau d abstractin au-dessus des design pattern déjà vu Architecture style 3-TIERS 2
Vue d ensemble Architecture multi-client rienté services A venir (suite du ply) Cmbinaisns de patterns Déjà vu en curs Entity Framewrk 3
Vue d ensemble Organisatin dans VS Ce n est qu un exemple business layer (cuche métier) Nn spécifique à ce prjet (ressurces utilisables au travers tus vs prjets) Ex: interface repsitry générique Data Layer (persistance + éventuellement DataAccesLayer DAL) Tests unitaires 4
Architecture MV* Le classique pattern MVC Prblématique Séparatin des respnsabilités entre les cuches métier, dnnée et présentatin Les bjectifs: maintenance, testabilité, fiabilité Lien avec le style 3-TIERS 3-TIERS est un style d architecture alrs que les MV* snt des implémentatins d architectures Dans le cadre d applicatins large et distribuées MV* peut être limité à la cuche présentatin uniquement. MV* peut être vue aussi cmme un style architecture 3-TIERS 5
Architecture MV* Cde spaghetti Un simulateur de rbt qui fnctinne Oui mais.. Imbricatin des fnctinnalités graphiques et cmprtementales du rbt 6
Classificatin des MV* 7
Bibligraphie Article A Jurney Thrugh the Land f Mdel-View-* Design Patterns Artem Syrmiatnikv Danny Weyns http://martinfwler.cm/eaadev/mdelviewpresenter.html Martin Fwler http://aviadezra.blgspt.fr/search/label/mvc Aviad Ezra http://cdelmas.develppez.cm/articles/cnceptin/variatins-autur-du-mdele-mvc/ Cyril Delmas http://www.cdeprject.cm/articles/66585/cmparisn-f-architecture-presentatinpatterns-m Shivprasad kirala 8
SmallTalk 80 MVC Cncepts Séparatin claire entre mdèle et présentatin basé sur le pattern Observer A l rigine 1 vue= 1 widget La présentatin est cmpsée de cuples View- Cntrller Réutilisatin des widgets dans d autres vues Pas d envirnnement RAD dans les années 70-80 Et maintenant? Les utils générent à la fis la vue du widget et les captures des événements utilisateurs (clic, clavier).. View= widget u écran Cmprmis sur la granularité fnctin de l applicatif Évlutin pssible de l architecture View= une vue dans sn ensemble et 1 Cntrller par View 9
MVC Architecture Le cuplage lâche entre mdule est basé sur le pattern bserver. Cependant de nmbreux exemples sur internet décrivent des vues maintenant des références explicites vers le mdèle. Ce mde de cuplage, effectué par cmmdité, n est pas suhaitable (exceptin Web MVC) 10
IMPLEMENTATION MVC Le mdèle Implémente le pattern Observateur C est le SUJET (Observable) Pas de référence View => décuplage entre mdèle et Vue Ntifie la vue et le cntrleur d un changement d état public class SeuilTemperatureMdele : IObservable<SeuilTemperature> private List<IObserver<SeuilTemperature>> bservers; private SeuilTemperature seuil; public EventHandler<EventArgs> CaptureHandler; public SeuilTemperatureMdele(SeuilTemperature initialvalue) seuil = initialvalue; bservers=new List<IObserver<SeuilTemperature>>(); public vid Incremente() seuil.valuetemp++; Ntify(seuil); public class SeuilTemperature public int ValueTemp get; set; public DateTime TimeStamp get; set; public vid Decremente() seuil.valuetemp--; Ntify(seuil); private vid Ntify(SeuilTemperature temp) freach (var bserver in this.bservers) bserver.onnext(seuil);.. 11
IMPLEMENTATION MVC La vue public partial class SeuilView : Frm, IObserver<SeuilTemperature> OnNext déclenché lrsque le mdèle change d état=> mise à jur de l affichage public SeuilView(SeuilTemperature seuil) InitializeCmpnent(); OnNext(seuil); // Cntrller need t knw abut Buttn t catch event // Others slutins are als pssible public Buttn GetButtnIncremente() return btnincremente; public Buttn GetButtnDecremente() return btndecremente; // implement IObserver // if mdel change then view is ntified and update public vid OnNext(SeuilTemperature valueseuiltemperature) textbxseuiltemperature.text = valueseuiltemperature.valuetemp.tstring(); 12
IMPLEMENTATION MVC Le cntrôleur S abnne au mdèle Dans ntre exemple nus ne faisns rien en cas de changement Capture les événements utilisateurs et agit sur le mdèle On récupère les butns créatin d un délégué anmyme (expressin lambda) crrespndant à l actin sur le mdèle class CntrleurTemperatureSeuil:IObserver<SeuilTemperature> private SeuilTemperatureManager mdeleseuilmanager; public CntrleurTemperatureSeuil(SeuilView view,seuiltemperaturemanager seuil) this. mdeleseuilmanager = seuil; view.getbuttnincremente().click += (bj, arg) => mdeleseuilmanager.incremente(); view.getbuttndecremente().click += (bj, arg) => mdeleseuilmanager.decremente(); public vid OnNext(SeuilTemperature value) //if mdel has changed then Onnext Triggered 13
IMPLEMENTATION MVC Le client Crée le mdèle Crée la vue Crée le Cntrleur Prcède aux abnnements [STAThread] static vid Main() Applicatin.EnableVisualStyles(); Applicatin.SetCmpatibleTextRenderingDefault(false); var seuil=new SeuilTemperature ValueTemp = 20, TimeStamp = DateTime.Nw ; var mdeletemperature = new SeuilTemperatureMdele(seuil); var viewseuiltemperature = new SeuilView(seuil); var cntrler = new CntrleurTemperatureSeuil(viewSeuilTemperature, mdeletemperature); mdeletemperature.subscribe(cntrler); mdeletemperature.subscribe(viewseuiltemperature); Applicatin.Run(viewSeuilTemperature); TP Cder l exemple Changer la vue en plaçant un slider 14
MVC BILAN Plusieurs niveaux de granularité Architecture MVC au niveau widgets (ancien) Architecture MVC au niveau applicatin (un écran) 15
MVC BILAN Très utilisé dans le web Asp.net MVC Variante du MVC classique (pas d bservateur et pas de rémanence du mdèle) Décuplage naturel car la vue, bien que générée sur le serveur, est exécuté par le client (brwser) et le mdèle+ cntrller snt sur le serveur 16
MVC BILAN Limitatins Le mdèle est restreint au dmaine d applicatin Pas d infrmatins de présentatin Prblématique pur des interfaces riches et cmplexes SmallTalk 80 => MVC au niveau widget Prblème pur gérer les inter-dépendances entre widget Exemple: mise en culeur d une partie de l IHM en fnctin de certaines valeurs du mdèle Et MVC «mderne»? Le cntrôleur ne cmmande pas la vue directement! => même prblème Slutin Mdifier l architecture et affecter une respnsabilité supplémentaire Transitin vers un nuveau mdèle: le MVP Applicatin Mdel MVC 17
MVP Evlutin du MVC et AM-MVC Le cntrler est remplacé par un présenter Le présenter s ccupe maintenant de la lgique de présentatin il maintient une référence vers la vue afin de la cmmander en direct Différentes variantes pssibles de MVP en fnctin d bjectifs visés Quelques sit les MV tujurs la même idée Séparer les respnsabilités Amélirer la testabilité (pas de chse cmplexe dans une vue car cmpliqué à tester!) 18
MVP Les différentes MVP Idée: Favriser la testabilité Vue la plus SIMPLE pssible implémentant une abstractin IView Presenter: s ccupe de tut! Idée: Alléger le Présenter Variante du smalltalk plus de respnsabilité SIMPLE sur la vue Cnclusin: Le Presenter est plus léger et s ccupe uniquement des interactins cmplexes 19
MVP: Supervising Presenter Architecture Le Presenter est allégué en délégant à la vue les mises à jur simple du mdèle Ntin de databinding présent dans les framewrk mdernes Pattern à utiliser plutôt pur des client graphiques lurds La vue ne mdifie le mdèle 20
data binding en C# class Emplyee : INtifyPrpertyChanged private string name; public string Name get return name; set name = value; RaisePrpertyChanged(); Lrs de l invcatin du délégué l argument caller, de type string, prend la valeur de la prpriété à l rigine de l appel Ex: l instructin unemplye.name=«tt»; => caller =«Name» private string firstname; public string FirstName get return firstname; set firstname = value; RaisePrpertyChanged(); public event PrpertyChangedEventHandler PrpertyChanged; private vid RaisePrpertyChanged([CallerMemberName] string caller = "") if (PrpertyChanged!= null) PrpertyChanged(this, new PrpertyChangedEventArgs(caller)); 21
MVP: Supervising Presenter data binding en C# public partial class Frm1 : Frm private Emplyee prf; Objet mdèle frmattage public Frm1() InitializeCmpnent(); prf=new Emplyee(); Prpriété destinatin Prpriété surce this.labelname.databindings.add(new Binding("Text", prf, "Name", false, DataSurceUpdateMde.OnValidatin)); this.labelfirstname.databindings.add( new Binding("Text", prf, "FirstName", false, DataSurceUpdateMde.OnValidatin)); prf.name = "Brav"; prf.firstname = "Juan"; Type de liaisn: OneWay (src->dest) private vid btnchangename_click(bject sender, EventArgs e) prf.name="arltt"; private vid btnchangefirstname_click(bject sender, EventArgs e) prf.firstname = "Philippe"; Pas de mdèle MVP u MVC ici Juste une dem de binding! 22
Un exemple Aviad Ezra http://aviadezra.blgspt.fr/ 23
MVP: Passive View Architecture But recherché: la testabilité Les tests autmatiques des interfaces graphiques snt cmpliqués La vue est réduite au minimum: aucune lgique Le presenter s ccupe de tute la présentatin Peut être utiliser dans un cntexte Web u WinFrm 24