patterns et maintenabilité dans lindustrie : un cas concret christophe saint-marcel silicomp...
TRANSCRIPT
Patterns et maintenabilitédans l’industrie : un cas concret
Christophe Saint-MarcelSilicomp Ingénierie
©Copyright Silicomp - 2
Plan de la présentationPlan de la présentation
Contexte du projet Utilisation des patrons : objectifs Une solution Le cas concret Résultats
©Copyright Silicomp - 3
ContexteContexte
Pour le client Trois ans de développement pour le client Développement d’un produit lié à plusieurs affaires Projet sous-traité à Silicomp
Pour Silicomp 1 an de développement (plusieurs itérations) Une équipe de 5 personnes Processus de développement agile
©Copyright Silicomp - 4
ObjectifsObjectifs
Améliorer la maintenabilité des applications dans l’industrie
Capitaliser le savoir-faire acquis sur le projet
Limiter les risques d’érosion du logiciel
Problème
©Copyright Silicomp - 5
Comprendre les problèmes avant de proposer des solutions : méthode problem-driven.
Tracer les rapports de causalité problème / solutions.
Apprendre à connaître l’application par la description des activités de développement plutôt que par leur résultat.
Comment ?Comment ?
Solution
©Copyright Silicomp - 6
Motivation
Le cas concretLe cas concret
Gérer les clients du client Limiter le couplage entre le produit et les affaires Normaliser les fonctions du produit Homogénéiser le traitement des données
©Copyright Silicomp - 7
Gérer les clients du client=> Optimiser la réutilisation=> Prendre en compte la sous-traitance
Affaire n° 1
Affaire n° 2
Affaire n° i
OrganisationProblème : clients multiplesProblème : clients multiples
Client n°1
Client n°2
Client n°i
©Copyright Silicomp - 8
Développer un produit basé sur des composantsmétier réutilisables par les différentes affaires
SolutionSolution
Client
Silicomp
Produit
Affaire n° 1
Affaire n° 2
Affaire n° i
Client n°1Client n°2
Client n°i
©Copyright Silicomp - 9
Limiter le couplage entre le produit et les affaires
Affaire n° 1Affaire n° 2
Affaire n° iProduit
Problème : réutiliserProblème : réutiliser
Architecture
©Copyright Silicomp - 10
Homogénéiser les interfaces en proposant une façadecommune [Gamma95]
A1
A2An
Produit
A1
A2An
Produit
SolutionSolution
©Copyright Silicomp - 11
• Gestion des composants : librairies UNIX
Solution : composantsSolution : composants
Business1 Business2
Product
Product_Int
©Copyright Silicomp - 12
Assurer la communication bi-directionnelle entrel’affaire et le produit
Affaire n° 1
Produit
L’affaire veut savoir quand leproduit change d’états.
Problème : communicationProblème : communication Architecture
©Copyright Silicomp - 13
Utiliser les mécanismes d’écoute proposés par Gammadans le patron Observer.
1
Product_Controller
state : E_State = E_UNK
Product_Listener_Int(from ProductInterface)
<<Interface>>
Product_Controller_Notify
onOpeningSession()onClosingSession()onStartingSession()onPurgingData()TEVR_Product_Controller_Notify()isListener()
1
#notifier
1
+listener1
UNKNOWN
INIT
READY
purgeData
openSession( sessionNumber )[ 1 <= sessionNumber <= 5 ]
closeSession
startSession( sessionNumber )[ sessionNumber == sessionNumber of openSession ]
closeSession( sessionNumber )[ sessionNumber == sessionNumber of openSession ]
purgeData
Implémentation des machines à états[Idiome C++]
Solution (1)Solution (1)
©Copyright Silicomp - 14
• Gestion des composants : librairies UNIX
Solution (2)Solution (2)
Business1 Business2
Product
Product_Int Product_Listener_Int
<<réalise>> <<fournit>>
Le composant avec ses interfaces
©Copyright Silicomp - 15
Arrêt sur image : traçabilité des problèmes (1)Arrêt sur image : traçabilité des problèmes (1)
Affaire/Produit
Façade
Intégrer le produit avec les affairesProduit + Affaires
Produit indépendant
Produit communicant Etats de
Gamma
Idiome C++
Observer
Gérer les affaires multiples
Assurer la communication produit / affaires
Analyse domaine
Gérer les notificationsGérer les données échangées
Modéliser et implémenter les états
Organisation
Architecture produit
Analyse domaine
Design
Implémentation
©Copyright Silicomp - 16
Factory
Produit communicant
Container
Nommage
Assurer la traçabilité des produits
Gérer de multiples produits
Découpler l'affaire des produits
Coopération (Rose)
Partager les modèles
Produit partageable
Produit réutilisable
Produit traçable
Architecture?
Homogénéiser le traitement des données
Normaliser les fonctions
Client
Affaire
1..n
1
commande
1..n
1
Produit
1..n1..n 1..n1..n
utilise
Domaine
1
1..n
instancie
1
1..n
Design
Design
Organisation
Design
Architecture
Arrêt sur image : traçabilité des problèmes (2)Arrêt sur image : traçabilité des problèmes (2)
©Copyright Silicomp - 17
Normaliser les fonctions du produit
Solution
Séparation en fonction du type de données(MetaData)
IdentityPotato_Xcg
Donnée contextuelleDonnée d’échange
Potato
Objet métier
Méta-niveau
Objet métier
0..n0..n
connaît
Donnée d'échange
1 +image10..n0..n
connaît
Donnée contextuelle
1..n+données 1..n
utilise
1
+image
1
ArchitectureProblème : normalisationProblème : normalisation
©Copyright Silicomp - 18
Homogénéiser le traitement des données
Solution
Gestionnaires de données, le pattern Container pourgérer les fonctions secondaires du produit
Produit
Créer un objet métier à partir d’une donnée d’échange
Supprimer un objet métier (une donnée contextuelle)
Modifier un objet métier (une donnée contextuelle)
Affaire
Obtenir toutes les données d’échange correspondant à un objet métier (…)
Problème : homogénéisationProblème : homogénéisation
Conception
©Copyright Silicomp - 19
T_KeyT_DataT_ObjectT_Context
Objectdata_Xcg : T_Datakey : T_Key
Create()getData()readData_Xcg()setData_key()
T_KeyT_DataT_ObjectT_ContextT_StringConverter
Container
create()getAllData_Xcg()getAllObjectPointers()getData_Xcg()getObject()getObjects()insertObject()isPresent()modify()purge()remove()
0..n
key : T_Key#objects
0..n
key : T_Key
ObjectExistException
ObjectExistException()which()
(from Exceptions)ObjectNoExistException
ObjectNoExistException()which()
(from Exceptions)
BadParametersException
BadParametersException()which()
(from Exceptions)
Anonymous : Container
obj : Object
modify(key : const T_Key&, exchangeData : const T_Data&, context : T_Context*)
obj = getObject(key : T_Key)
readData_Xcg(data : const T_Data&, key : const T_Key&)
Modifier un objet métier (une donnée contextuelle)
Anonymous : Container
obj : Object
getData_Xcg(key : T_Key)
obj = objects_.find(key)
data_Xcg
data_Xcg = getData_Xcg()
TEVR_ObjectNoExistException
If obj != null
Else
End If
Créer un objet métier à partir d’une donné d ’échange
- Instanciation générique du pattern en C++
- Génération et paramétrage à l’aide de scripts Rose
SolutionSolution
©Copyright Silicomp - 20
Améliorer la maintenabilité des applications dans l’industriegrâce à un langage de patrons projet qui:
RésultatRésultat
Limite les risques d’érosion lors de la venue de nouveaux membres dans l’équipe.
Complète les générations automatiques de modèles utilisées pour la correction des bugs.
Permet de contrôler que l’on reste dans le canevas (outils?).
©Copyright Silicomp - 21
Solution? :Approche par méta-modèle pour normaliser les solutions
Variante 1 Variante 2
Objet métier
0..n0..n
connaît
Donnée d'échange
1 +image10..n0..n
connaît
Donnée contextuelle
1..n+données 1..n
utilise
1
+image
1
Pistes (1)Pistes (1)
Problème :
Pas d’outillage qui contrôle que l’on reste dans le canevas.
©Copyright Silicomp - 22
Pistes (2)Pistes (2)
Approche descendante et remontante
Notion de distance entre le problème et la solution
Utiliser les anti-patterns pour décrire la démarche de développement (voir les mauvaises solutions)
©Copyright Silicomp - 23
Comprendre les problèmes avant de proposer des solutions : méthode problem-driven.
Tracer les rapports de causalité problème / solutions.
Apprendre à connaître l’application par la description des activités de développement plutôt que par leur résultat.
FinFin
Solution