Architecture logicielle et
conception avancée
Abdou Maiga
Revision
Filtre
canal de synchro
communication
Architecture pipeline
Système de traitement du son
Encodeur pour
sortie de microphone
Égaliser les
Filtrer Filtrer Retirer les
les intervalles
l’écho le bruit fréquences non vocales
dynamiques
Encodeur de
bruit ambiant
Encoder la sortie
des haut-parleurs
Architecture pipeline
Avantages D’un point de vue conception
Bon pour traitement en lot (batch) Diviser pour régner : les filtres
Très flexible peuvent être conçus séparément
Analyse facilitée : performance, Cohésion : les filtres sont un type de
synchronisation, goulot cohésion fonctionnelle
d’étranglement, etc. Couplage : les filtres n’ont qu’une
Se prête bien à la décomposition entrée et une sortie en général
fonctionnelle d’un système Abstraction : les filtres cachent
Inconvénients généralement bien leurs détails
internes
Mauvais pour le traitement interactif
Réutilisabilité : les filtres peuvent
très souvent être réutilisés dans
d’autres contextes
Réutilisation : il est souvent possible
d’utiliser des filtres déjà existants
pour les insérer dans le pipeline
Architecture avec référentiel
Architecture avec référentiel de données (shared data)
Utilisée dans le cas où des données sont partagées et
fréquemment échangées entre les composants
Deux types de composants : référentiel de données et accesseur de
données
• Les référentiels constituent le medium de communication entre les
accesseurs
Connecteur : relie un accesseur à un référentiel
• Rôle de communication, mais aussi possiblement de coordination, de
conversion et de facilitation
Référentiel1 Référentiel2
A A A A A
Architecture avec référentiel
Variantes
Style tableau noir : les référentiels sont des agents actifs.
Lorsqu’ils reçoivent une données, ils informent tous les
accesseurs concernés
Style référentiel : les référentiels sont passifs. Simple
vocation de stockage. Les composants accède aux référentiels
comme ils le désirent
Exemples : application de bases de données, systèmes Web,
systèmes centrés sur les données (e.g. système bancaire,
système de facturation ,etc.), environnement de
programmation
Architecture avec référentiel
Avantages
Avantageux pour les applications impliquant des tâches
complexes sur les données, nombreuses et changeant souvent.
Une fois le référentiel bien défini, de nouveaux services
peuvent facilement être ajoutés
Inconvénients
Le référentiel peut facilement constituer un goulot
d’étranglement, tant du point de vue de sa performance que
du changement
Architecture Modèle-Vue-Contrôleur (MVC)
Séparer la couche interface utilisateur des autres parties du
système (car les interfaces utilisateurs sont beaucoup plus
susceptibles de changer que la base de connaissances du
système)
Composé de trois types de composants
Modèle : rassemble des données du domaine, des connaissances du
système. Contient les classes dont les instances doivent être vues et
manipulées
Vue : utilisé pour présenter/afficher les données du modèle dans
l’interface utilisateur
Contrôleur : contient les fonctionnalités nécessaires pour gérer et contrôler
les interactions de l’utilisateur avec la vue et le modèle
Architecture Modèle-Vue-Contrôleur ()
Consulter l’état
(i.e. les données) notifier changements Contrôleur
Modèle modifier
Le sous-système
gérant l’information.
Architecture Modèle-Vue-Contrôleur
Modèle : noyau de l’application
Enregistre les vues et les contrôleurs qui en dépendent
Notifie les composants dépendants des modifications aux données
Vue : interface (graphique) de l’application
Crée et initialise ses contrôleurs
Affiche les informations destinées aux utilisateurs
Implante les procédure de mise à jour nécessaires pour demeurer cohérente
Consulte les données du modèle
Contrôleur : partie de l’application qui prend les décisions
Accepte les événement correspondant aux entrées de l’utilisateur
Traduit un événements (1) en demande de service adressée au modèle ou bien (2)
en demande d’affichage adressée à la vue
Implémente les procédures indirectes de mise à jour des vues si nécessaire
Architecture Modèle-Vue-Contrôleur ()
Avantages :
D’un point de vue conception
approprié pour les systèmes
interactifs, particulièrement ceux Diviser pour régner : les composants
impliquant plusieurs vues du même peuvent être conçus
modèle de données. indépendamment
Peut être utilisé pour faciliter la Cohésion : meilleure cohésion que si
maintenance de la cohérence entre les couches vue et contrôle étaient
les données distribuées dans l’interface utilisateur.
Couplage : le nombre de canaux de
Inconvénient : communication entre les 3
composants est minimal
goulot d’étranglement
Réutilisabilité : la vue et le contrôle
possible peuvent être conçus à partir de
composants déjà existants
Flexibilité : il est facile de changer
l’interface utilisateur
Testabilité : il est possible de tester
l’application indépendamment de
l’interface
Architecture multi-couches
Composants : chaque composant réalise un service
Une couche offre un service (serveur) aux couches externes (client)
Service créé indépendamment du logiciel ou spécifiquement
Met à profit la notion d’abstraction, les couches externes sont plus
abstraites (haut niveau) que les couches internes
Connecteurs : dépendent du protocole d’interaction souhaité
entre couches
Système fermé : une couche n’a accès qu’aux couches adjacentes. Les
connecteurs ne relient que les couches adjacentes
Système ouvert : toutes les couches ont accès à toutes les autres. Les
connecteurs peuvent relier deux couches quelconques
Exemples : souvent utilisé pour les systèmes implémentant des
protocoles de communication (TCP/IP)
Architecture multi-couches
Système fermé
Reference Model of Open Systems Interconnection (OSI
model)
Application
Transformation des données
Présentation (encryption,etc.)
Identifier et authentifier
Session une connexion
Transmission (point à point)
Transport fiable des données
Transmission des
Réseau
routing packets
Client Serveur
requête de service
Serveur
Client1
<<communication>>
Échanger msg
<<communication>> <<communication>>
Échanger msg chercher adresse
Client3
netscape:WebBrowser diro:WebServer
iexplo:WebBrowser
www.cmu.edu:WebServer
lynx:WebBrowser
Architecture n-niveaux
Architecture 3-niveaux
Organisation en trois couches
• Couche interface: Composé d’objets interfaces (boundary
objects) pour interagir avec l’utilisateur (fenêtres, formulaires,
pages Web, etc.)
• Couche logique applicative : Comporte tous les objets de
contrôle et d’entités nécessaire pour faire les traitements, la
vérification des règles et les notifications requises par
l’application
• Couche de stockage : réalise le stockage, la récupération et la
recherche des objets persistants
Avantage sur l’architecture client-serveur
• Permet le développement et la modification de différentes
interfaces utilisateurs pour la même logique applicative
Architecture n-niveaux
Architecture 3-parties
Réseau
Client X
Base de
Serveur de données
B.D. Unix corporative
Marché de
données
Base de
données clients
Architecture n-niveaux
Architecture 4-niveaux
Architecture dont la couche logique applicative est décomposée en
• Couche Présentation (JSP, servlets)
– Présentation du contenu statique: Contenu HTML ou XML affiché par le
client
– Présentation du contenu dynamique : contenu organisé et créé
dynamiquement par le serveur web (pour ensuite être affiché en
HTML/XML par le client)
• Couche Logique applicative (calculs purs) : réalise le cœur des
traitements de l’application
Avantage sur l’architecture 3-niveaux
• Permet de supporter un grand nombre de formats de présentation
différents (propres à chaque client), tout en réutilisant certains des
objets de présentation entre les clients. Réduction des redondances…
• Bien adaptée pour les applications Web devant supporter plusieurs
types de clients
Architecture n-niveaux Java Server Pages
- Partie cliente
- Partie serveur
Architecture 4-niveaux
Serveur de base
Clients Serveur de données
Accès base de
<<submit>>
Interface <<build>> données comptes clients
Web
Gestion
<<submit>> opérations bancaires
Interface
<<build>>
employé
de la banque <<submit>>
Architecture n-niveaux
D’un point de vue conception Flexibilité : il est assez facile
Diviser pour régner : de façon d’ajouter de nouveaux clients et
évidente, client et serveur peuvent serveurs
être développées séparément Portabilité : on peut développer de
Cohésion : le serveur peut offrir des nouveaux clients pour de nouvelles
services cohésifs au client plateformes sans devoir porter le
Couplage : un seul canal de serveur
communication existe souvent entre Testabilité : on peut tester le client
client et serveur et le serveur indépendamment
Réutilisation : il est possible de Conception défensive : on peut
trouver une bibliothèque de introduire des opérations de
composants, interfaces, etc. pour vérification dans le code traitant les
construire les systèmes messages reçus de part et d’autre
• Toutefois, les systèmes client-
serveur dépendent très souvent de
nombreuses considérations liées
intimement à l’application
5. Développer un modèle architectural
Commencer par faire une esquisse de l’architecture
En se basant sur les principaux requis des cas d’utilisation ; décomposition en
sous-systèmes
Déterminer les principaux composants requis
Sélectionner un style architectural
Raffiner l’architecture
Identifier les principales interactions entre les composants et les interfaces
requises
Décider comment chaque donnée et chaque fonctionnalité sera distribuée parmi
les différents composants
Déterminer si on peut réutiliser un cadriciel existant (réutilisation) ou si on peut en
construire un (réutilisabilité).
Considérer chacun des cas d’utilisation et ajuster l’architecture pour qu’il soit
réalisable
Détailler l’architecture et la faire évoluer
Décrire l’architecture avec UML
5. Développer un modèle architectural
Les composants et le principe de séparation des préoccupations
La séparation des préoccupation est le principe qui assure l’intégrité
fonctionnelle d’un composant
• Chaque composant réalise une, et seulement une fonction au sein du
système, mais peut néanmoins exposer plusieurs méthodes.
Typiquement, chaque composant est défini par une interface qui
constitue son seul moyen d’interagir avec les autres composants
• L’utilisation d’une interface pour communiquer avec les autres
composants du système facilite la maintenance puisqu’on peut alors
en changer l’implémentation sans affecter les autres composants
(induit un couplage plus faible du composant avec le reste du
système)
• Les classes d’un composant devrait être vues comme un patron
cohésif qui implémente la fonctionnalité du composant
2.Bibliothèques et le chargement de
composants dynamiques
2.1. Introduction
Aucun logiciel de grande taille n’est développé depuis
zéro aujourd’hui
Sauf dans le cas de développement en « salle blanche »
Utilisation de
« Bouts de code »
Structures + fonctions / Classes + méthodes
Bibliothèques
2.2. Bibliothèques et cadriciels
« Bibliothèque [library] logicielle est un ensemble de fonctions utilitaires,
regroupées et mises à disposition afin de pouvoir être utilisées sans avoir à les
réécrire » [Wikipedia]
Plutôt que de coder une procédure courante dans chaque programme en ayant
besoin, on rassemble ces procédures dans des bibliothèques.
Exemples
La bibliothèque de classes Java (!)
La STL de C++ (!!)
2.2. Bibliothèques et cadriciels
« Un cadriciel [framework] est un espace de travail
modulaire. C'est un ensemble de bibliothèques, d'outils
et de conventions permettant le développement de
programmes. » [Wikipedia]
Un framework fournit:
un ensemble de fonctions facilitant la création de tout ou
d'une partie d'un système logiciel
un guide architectural en divisant le domaine visé en
modules.
2.2. Bibliothèques et cadriciels
Types d’interconnexions
Chainage des liens (linking)
Duplication de processus (fork)
Protocole de communication (IPC)
Sous-classage
Chargement dynamique
3. Cadres de référence et plugiciels
3.1. Introduction
Aujourd’hui (et demain), les programmes
Sont de plus en plus complexes
Doivent être livrés de plus en plus rapidement
Doivent fonctionner avec un minimum d’arrêt
Les programmes nécessitent donc
Une plateforme de programmation favorisant l’indépendance
des composants
Un format de livraison « standardisé »
Une plateforme d’exécution permettant le remplacement à
chaud
Les programmes doivent donc être formés de
composants réutilisables et interchangeables en cours
d’exécution
3.2. Definition: plugiciel
« Un [plugiciel] est un programme qui interagit avec un
logiciel principal, appelé programme hôte, pour lui
apporter de nouvelles fonctionnalités » [Wikipedia]
[http://aneeshkumarkb.blogspot.com/]
3.3. OSGi
La spécification de OSGi définit comment les bundles
(composants) doivent être implémentés afin d’être
intégrés à la plateforme OSGi. Elle se structure de la
manière suivante:
Un ensemble de services qu’un conteneur OSGi doit
implémenter (Exple de conteneur: Equinox d’Eclipse)
Un contrat entre le conteneur et les application
3.3. OSGi
Cycle de vie d’un bundle OSGi
4.Composition et architectures par
composants
4.1. Introduction
Limitations des architecture à objets
Complexité du chargement dynamique
Ad hoc
Solution partielle des cadre de références et autres
plugiciels
4.1. Introduction
Contexte : ingénierie du système/intergiciel
(middleware)
Maintenant des systèmes globaux intégrant des applications jusqu'ici
indépendantes + développements nouveaux.
Historique
fin 2000 : premières réflexions autour de Fractal
06/2002
1ère version stable API
implémentation de référence (Julia)
1ère version de l’ADL
01/2004
définition de l’ADL v2 (ADL extensible)
implémentation disponible 03/2004
4.3. Le modèle Fractal
ingénierie des systèmes et du middleware
suffisamment général pour être appliqué à tout autre
domaine
grain fin (wrt EJB ou CCM) proche d’un modèle de classe
léger (surcoût faible par rapport aux objets)
indépendant des langages de programmation
Création Comportementaux
Fabrique abstraite (Abstract Chaîne de responsabilité (Chain
Factory) of responsibility)
Monteur (Builder) Commande (Command)
Fabrique (Factory Method) Interpréteur (Interpreter)
Prototype (Prototype) Itérateur (Iterator)
Singleton (Singleton) Médiateur (Mediator)
Mémento (Memento)
Structuraux Observateur (Observer)
Adaptateur (Adapter) État (State)
Pont (Bridge) Stratégie (Strategy)
Objet composite (Composite) Patron de méthode (Template
Décorateur (Decorator) Method)
Façade (Facade) Visiteur (Visitor)
Poids-mouche ou poids-plume
(Flyweight)
Proxy (Proxy)
Quand utiliser un patron de conception?
Lorsque le problème est complexe?
Plusieurs patrons de conception existent
Granularité
• Requis, analyses, architecture
• Conception, implémentation (idioms)
• Refactoring, testing
• …