La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Because Good Software Means Business Performance CAST Application Intelligence Platform 7.0.4 Juillet 2011 Résultats de lassessment Qualité de lapplication.

Présentations similaires


Présentation au sujet: "Because Good Software Means Business Performance CAST Application Intelligence Platform 7.0.4 Juillet 2011 Résultats de lassessment Qualité de lapplication."— Transcription de la présentation:

1 Because Good Software Means Business Performance CAST Application Intelligence Platform Juillet 2011 Résultats de lassessment Qualité de lapplication efluid

2 Agenda À propos de CAST Contexte et objectifs Bilan quantitatif et qualitatif (Facteurs de santé ISO) Détail des points améliorables Risque en production : Robustesse - Performance Risque en maintenance : Transférabilité – Évolutivité Conclusion ANNEXES 2 Copyright CAST 2010

3 CAST : Chef de file de la qualité logicielle des SI Une mission ambitieuse Des fondations solides Une technologie innovante « Permettre aux entreprises de gagner en efficacité métier en tirant le meilleur parti de leur système dinformation. » Une présence pérenne en France, en Europe et aux États-Unis Des partenaires investisseurs long terme Un investissement en R&D de plus de 80M$ Une équipe visionnaire menée par déminents acteurs (CMM, SEI, CISQ) Précurseur et chef de file dun nouveau segment de marché depuis 1999 Une expertise unique en qualité et ingénierie logicielle Editors Choice Award: A Top-10 Company to Watch David Stodder | Editorial Director Intelligent Enterprise Magazine (TechWeb)

4 Acteur reconnu, bénéficiant dune forte présence sur le marché Les intégrateurs utilisent CAST Plus de 650 entreprises font confiance à CAST Les analystes et institutions cautionnent CAST

5 5Copyright CAST 2007 Équipes de développements internes et sous-traitées La visibilité sur ces systèmes stratégiques est très limitée Ça fonctionne aujourdhui, mais savez-vous ce qui a réellement été produit? Account Management System Product Pricing Application Est-ce… …ou… Un applicatif de mauvaise qualité… …Conçu selon les règles de lart et de bonne qualité Customer Information System Les tests ne permettent pas toujours didentifier la cause dun problème ou sont trop coûteux et se produisent trop tardivement Product Pricing Application Account Management System Dangereux et source dincidents Difficile à faire évoluer Difficile à comprendre Coûteux à maintenir Fiable et robuste Facile à faire évoluer et à appréhender Facile à maintenir … Et moins coûteux !

6 Arbitrages : Qualité des applications vs. criticité métier 1 Contrôle des tendances : taille et santé des applications 2 Causes dune éventuelle interruption de service 3 Diagnostic et risques majeurs par application CAST : visibilité pour une meilleure performance opérationnelle Principales caractéristiques des applications 5

7 La Plateforme CAST dApplication Intelligence Analyse automatisée de la globalité dune application Bilan Qualité objectif, immédiat et répétable Vision synthétique pour le Management IT Mise en lumière des causes des défauts Aide à la correction via la documentation technique Améliorez la qualité en réduisant les coûts La Transparence, Automatisée!

8 Une analyse en profondeur de la qualité logicielle Transferabilité Evolutivité Robustesse Performance Taille Conventions de Nommage Documentation Architecture Complexité Package naming Class naming Interface naming Package comment Class comment Method comment Package size Class size (methods) Interface size Class complexity (Inh. depth) Class complexity (Inh. width) Artifacts having recursive calls Method complexity (control flow) Maintainabilité Securité Pratiques de Programmation File conformity Dead code Controled data access Structuredness Modularity Encapsulation conformity Empty code Inheritance Impact Immédiat Qualité Applicative Impact à moyen terme Plus de 800 contrôles qualité et darchitecture Facteurs de SantéIndicateurs QualitéMétriques Qualité Qualité Applicative Multiple artifacts inserting data on the same SQL table Coupling Distribution SQL Complexity Distribution

9 Qualifier la qualité selon les standards FacteursDescriptionValeur pour lentreprise Transférabilité Mesure de leffort pour transférer lapplication vers une nouvelle équipe interne ou externe ou vers un nouveau membre au sein de léquipe actuelle Une meilleure transférabilité contribue à : Eviter la dépendance vis-à-vis d'une ressource interne ou dun sous-traitant. Améliorer la productivité dune équipe Faciliter le transfert entre un sous-traitant et une structure interne ou vice versa Evolutivité Mesure de leffort pour implémenter une modification (évolution ou correction) au sein dune application Une meilleure capacité d'évolution contribue à : Améliorer la facilité et la rapidité de maintenance Améliorer la prévisibilité des livraisons Accélérer le time to market Robustesse Mesure du risque dintroduire un défaut lors dune modification de lapplication (stabilité) et de leffort de test (testabilité) Une plus grande robustesse réduit le risque danomalie de lapplication en production et améliore la satisfaction des utilisateurs Performance Mesure du risque de non-performance actuelle ou future de lapplication en fonction de sa conception et de son architecture Une meilleure note de performances réduit le risque quune application consomme trop de ressources en production et améliore sa capacité de montée en charges (scalabilité) Sécurité Mesure du risque de faille potentielle de la sécurité dune application De meilleures valeurs de sécurité diminuent les risques d'atteinte à la sécurité de l'application Maintenabilité Détermine le coût et la difficulté / facilité de maintenir une application à lavenir Un meilleur indice de maintenabilité diminue le coût de maintenance des applications

10 Graduation homogène et uniforme du risque qualité Identification simple, immédiate et uniforme du degré de risque dans tout le portail CAST : Pour une application Pour un module Pour un composant 10Copyright CAST Risque très faible Risque faible Risque élevé Risque très élevé La note de 3 est le seuil en dessous duquel le risque devient élevé et les coûts augmentent

11 Agenda À propos de CAST Contexte et objectifs Bilan quantitatif et qualitatif (Facteurs de santé ISO) Détail des points améliorables Risque en production : Robustesse - Performance Risque en maintenance : Transférabilité – Évolutivité Conclusion ANNEXES 11 Copyright CAST 2010

12 Contexte et objectifs UEM est la première régie indépendante française d'électricité. Elle dessert 142 communes dont la principale est la ville de Metz. Elle emploie 500 agents au service de habitants CGI est la quatrième entreprise de services en technologie de l'information en Amérique du Nord plus de professionnels plus de 100 bureaux dans le monde répartis sur 4 continents 24 pays intervenant auprès de plus de clients. ERDF souhaite étudier lextension de lacquisition du progiciel efluid, une application de gestion clientèle et facturation développée par UEM avec la collaboration de son partenaire CGI. Lanalyse de lapplication efluid comprend: efluid : Application intranet de gestion clientèle. AEL : Lagence en ligne accessible via internet. ARCHI et EDK : les frameworks (composants techniques) maison utilisé par efluid.

13 Agenda À propos de CAST Contexte et objectifs Bilan quantitatif et qualitatif (Facteurs de santé ISO) Détail des points améliorables Risque en production : Robustesse - Performance Risque en maintenance : Transférabilité – Évolutivité Conclusion ANNEXES 13 Copyright CAST 2010

14 Le risque qualité est globalement maitrisé. Efluid est une application volumineuse et complexe, (attention aux tests de non régressions aussi bien coté TU / intégrateur quaux tests fonctionnels / intégrations / recettes coté ERDF). Actuellement, le code statique nécessite des points d'amélioration pour l'optimisation des performances Pour assurer une bonne évolutivité et maintenabilité, les erreurs critiques sont à corriger Points Clé

15 Aperçu global : Maintenabilité, Volumétrie et Complexité Le TQI de lapplication efluid est à 3,04. La maintenabilité globale est correcte. Pour une bonne maintenabilité, le TQI doit se situer au dessus de 3. Avec kLoC, efluid est une application J2EE/Oracle de taille considérable. Elle contient en tout Classes Java. La Techniqual Quality Index est un indicateur unique permettant dévaluer la difficulté / facilité de maintenir une application à lavenir La complexité totale de lapplication efluid est de points de décision (équivalent au nombre de cas de test) ce qui en fait une application très difficile à tester.

16 Bilan qualité global (Facteurs de santé ISO) La qualité est globalement bien maitrisée avec un TQI à 3. Les facteurs de santé transférabilité et évolutivité sont tout juste satisfaisants (proches de la limite de 3). La robustesse et la performance sont globalement bien maitrisé, mais certains points clé doivent attirer lattention. La qualité est globalement bien maitrisée avec un TQI à 3. Les facteurs de santé transférabilité et évolutivité sont tout juste satisfaisants (proches de la limite de 3). La robustesse et la performance sont globalement bien maitrisé, mais certains points clé doivent attirer lattention.

17 17 Copyright CAST 2010 Où sont mes violations critiques ? Les violations critiques sont les violations les plus importantes trouvées dans le code. Ces violations peuvent avoir un impact important sur le fonctionnement en production de lapplication et sur la maintenance. Vu sa taille, Efluid contient le plus de violations critiques, principalement concentrée en performance. La concentration de violations critiques est faible avec 1,49 v. critique / kLoc Moyenne CAST : 4 v. critiques / kLoc Vu sa taille, Efluid contient le plus de violations critiques, principalement concentrée en performance. La concentration de violations critiques est faible avec 1,49 v. critique / kLoc Moyenne CAST : 4 v. critiques / kLoc Zoom Efluid : ITV_Efluid est le system qui contient le plus de violations critiques. Zoom Efluid : ITV_Efluid est le system qui contient le plus de violations critiques.

18 Lindice de qualité technique pour efluid Modules dominant Techno dominante Lindice de qualité technique du module de Facturation est le plus à risque. Lindice de qualité technique des modules Archivage et Intervention de efluid a risque (légèrement sous la limite de 3). Le module Intervention est celui qui contient le plus grand nombre de lignes de code. Il est talonné par le module Référentiel d efluid qui contient le plus grand nombre dartefacts. La technologie dominante est le J2EE.

19 Lindice de qualité technique pour AEL Module dominant Techno dominante Lindice de qualité technique de la partie Base de données est le plus à risque Le module Référentiel dAEL est celui qui contient le grand nombre de lignes de code et dartefacts. La technologie dominante est le J2EE.

20 Agenda À propos de CAST Contexte et objectifs Bilan quantitatif et qualitatif (Facteurs de santé ISO) Détail des points améliorables Risque en production : Robustesse - Performance Risque en maintenance : Transférabilité – Évolutivité Conclusion ANNEXES 20 Copyright CAST 2010

21 Robustesse : la gestion des exceptions doit être sécurisée. 21Copyright CAST blocs catch vide relevés dans efluid et 1 bloc catch vide dans EDK (aucun catch vide dans EDK et ARCHI) Erreur critique : a corriger en priorité Des exceptions « génériques » sont rattrapées: pour efluid (2,68%), 255 pour ARCHI (2,48%), 230 pour EDK (2,55%) et 57 pour AEL (2,54%) Lalerte réelle nest pas traitée Lhistorique des erreurs est perdu dans 90 cas pour efluid, 33 pour AEL, 26 pour EDK et 8 pour ARCH efluid : AEL: La gestion des exceptions doit être considérée en priorité. Elle augmente le risque derreur non détectée en production. 3 violations liées à la gestion des exceptions sont vérifiées par CAST. Ignorer des exceptions Gérer les exceptions de manière générique Protéger lutilisateur final de messages techniques indésirables lors déventuelles erreurs. Globalement, les exceptions sont bien gérées. Mais des erreurs isolées doivent être corrigées. EDK : ARCHI:

22 Robustesse : Illustration dune erreur mise à la trappe. 22Copyright CAST 2010 Une bonne gestion des exceptions est critique aussi bien pour le maintien opérationnel de la plateforme en production que pour la maintenance et laide à lidentification et la correction de bugs. La plateforme CAST vous permet didentifier les éléments à risque et de visualiser le code source en erreur.

23 Robustesse / Sécurité : Gestion des couches 23 Copyright CAST 2005 Accéder à la base de données par des couches DAO permet de maintenir une couche dabstraction entre le modèle de donnée et le code. Ceci permet davoir une application plus modulaire, de contrôler les modifications faites dans les tables, déviter les injections SQL, et doptimiser les requêtes. Létanchéité des couches est bien respectée dans Efluid efluid ael efluid ael

24 Laccès multiple aux tables du a la gestion de la communication avec la BDD par code généré. Vu que les requêtes sont encore écrites à la main, CAST permet de maitriser les évolutions et connaitre toute les requêtes a faire évoluer lors de changement. Architecture - Accès à la base de données Insertion Modification Suppression

25 25 Copyright CAST 2005 Les packages permettent de découper son application en modules élémentaires et réutilisables. Avoir des dépendances cycliques dans les packages rigidifie lapplication et empêche la réutilisabilité des packages sans tirer une grosse grappe de code. 41% des packages de efluid, 52% des packages de ael sont impliqués dans une dépendance cyclique 38% des packages d archi, 28% des packages dEDK sont aussi impliqués dans une dépendance cyclique Il est conseillé, au fur et à mesure des évolutions, de casser les dépendances cycliques. efluid edk Les dépendances cycliques rigidifient la structure du programme ael archi efluid ael

26 Bonnes pratiques de lorienté objet Fournir des « get/set» pour les variables privées afin de respecter le principe dencapsulation Déclarer des variables comme public expose la classe à des modifications externes Pour des raisons de sécurité, il faudrait typer laccès aux variables déclarées au niveau de la classe Dune manière générale, ces bonnes pratiques sont bien respectées. Les valeurs sont données pour efluid, ael, edk et archi dans lordre ci-dessous : 7,7%, 2,6%, 7,94%, 7,19% des variables privés ne possèdent pas daccesseur/getteur 2,56%, 0%,0,5%, 0,46% des variables sont déclarées public 6,7%, 0%, 0,14%, 6,43% des variables ne sont pas typées efluid edk ael archi

27 Performance: la gestion des boucles doit être optimisée 27Copyright CAST 2010 Instanciation dans les boucles efluid: 1,87% (1 186 / ) des éléments en défaut AEL : 0,94% (21 / 2 274) des éléments en défaut EDK : 0,97% (88 / 9 101) des éléments en défaut ARCHI : 0,69% (71 / ) des éléments en défaut Appel à une méthode dans la condition de terminaison dune boucle efluid: 0,63% (394 / ) des éléments en défaut AEL : 1,47% (33 / 2 242) des éléments en défaut EDK : 0,75% (68 / 9 101) des éléments en défaut ARCHI : 0,69% (71 / ) des éléments en défaut Concaténation de chaine de caractère sans buffer dans une boucle efluid: 0,06% (40 / ) des éléments en défaut AEL : 0,13% (3 / 2 274) des éléments en défaut EDK : 0,04% (4 / 9 101) des éléments en défaut ARCHI : 0,04% (4 / ) des éléments en défaut 3 appels à des requêtes SQL dans des boucles relevées pour lapplication efluid efluid : AEL: Appels couteux dans les boucles : Performance statique provoquent des temps de réponse non optimaux dus à la mauvaise gestion du garbage collector provoquent une utilisation très forte du réseau et de laccès à la base de données Consomment parfois inutilement des ressources Globalement la gestion des boucles pourrait être améliorée. EDK : ARCHI:

28 Performance : utilisation de cursor dans les boucles efluid : Utiliser des cursors dans des boucles indique une double itération de la table. Le temps de traitement devient donc exponentiel. Afin doptimiser les performances, il est déconseillé dutiliser des cursors dans des boucles. 1 seule procédure sur les 14 procédures stockées que compte efluid utilise un cursor dans une boucle.

29 29 Copyright CAST 2005 Bien que la BDD soit de petite taille, les bonnes pratiques SQL ne sont pas toujours respectées, ce qui peut engendrer des goulots détranglement de performance de lapplication lors de manipulation de données. Pour ael : 100 % des tables nont pas de clé étrangère ( 8 tables) Aucune tables nutilisent des index redondants (bien) Pour efluid : 24 % des requêtes Sql nutilisent pas dindex (lecture séquentielle de toute les lignes, a croiser avec les volumétries des tables) 40% des requêtes Sql utilisent des clauses UNION 12% des requêtes Sql utilisent les requêtes imbriqués 3,85 % des tables ne placent pas les attributs null à la dernière position (manque doptimisation) 6% des tables utilisent des index redondants efluidael Performance : Requête SQL

30 Comment construire son plan daction ? Le PRI (Propagated Risk Index) aide à prioriser les violations en fonction de leurs risques, et du risque de propagation de lerreur. Plus le PRI est élevé, plus le risque de déclenchement de lerreur et de propagation de lerreur est fort.

31 Agenda À propos de CAST Contexte et objectifs Bilan quantitatif et qualitatif (Facteurs de santé ISO) Détail des points améliorables Risque en production : Robustesse - Performance Risque en maintenance : Transférabilité – Évolutivité Conclusion ANNEXES 31 Copyright CAST 2010

32 Copier-coller et factorisation de code – EFluid et AEL Réutilisation de 18,11 % Réutilisation de 9,53 % Très bon taux de réutilisabilité (>=15%) Maintenir la tendance Beaucoup du copiés collés Il faut noter qu'en règle générale la factorisation des composants tend à réduire les coûts de maintenance applicative EFLUID AEL Taux de réutilisabilité insuffisant (<15%) Attention à la duplication de code Beaucoup du copiés collés

33 Copier-coller et factorisation de code – EDK et Archi EDK Archi Réutilisation de 18,45 % Réutilisation de 11,75% Très bon taux de réutilisabilité (>=15%) Maintenir la tendance Beaucoup du copiés collés Taux de réutilisabilité satisfaisant (proche de 15%) Attention à la duplication de code Beaucoup du copiés collés Il faut factoriser le code

34 Exemple de Copier- Coller - EFLUID La duplication de code est déjà vérifiée dans efluid pour les méthodes de plus de 50 lignes.

35 Complexité applicative On observe une bonne répartition globale de la complexité cyclomatique Il est impératif de maintenir cette maitrise pour éviter la propagation de la complexité et les dérives des coûts de maintenance. On observe une bonne répartition globale de la complexité cyclomatique Il est impératif de maintenir cette maitrise pour éviter la propagation de la complexité et les dérives des coûts de maintenance.

36 Transférabilité: volume de Documentation technique 36Copyright CAST 2010 La documentation dEfluid est principalement gérée dans une documentation externe. Avoir un bon taux de documentation technique améliore la productivité des développeurs, diminue les coûts de maintenance et améliore la transférabilité applicative. Malgré un taux de documentation élevé denviron 30%, la répartition de la documentation nest pas homogène. La répartition de la documentation technique doit être améliorée: 9,56% des JSP de efuild, 18,18% de AEL, 19,3% de EDK et 30,93% de ARCHI ne sont pas documentées 15,96% des Classes de efluid, 6,98% de AEL, 20,17% de EDK et 7,85% de ARCHI ne sont pas suffisamment documentées 27,09% des méthodes de efluid, 24,49% de AEL, 44% de EDK et 54,35% ne sont pas suffisamment documentées 92,26% des fonctions JavaScripts de efluid, 82,35% de AEL, 81,44% de EDK et 70,91% de ARCHI ne sont pas documentéess efluid : AEL: EDK : ARCHI:

37 Agenda À propos de CAST Contexte et objectifs Bilan quantitatif et qualitatif (Facteurs de santé ISO) Détail des points améliorables Risque en production : Robustesse - Performance Risque en maintenance : Transférabilité – Évolutivité Conclusion ANNEXES 37 Copyright CAST 2010

38 A la suite de cet audit, CAST a identifié une bonne qualité globale, avec cependant des points clé a surveiller Vu la globale bonne maitrise de la qualité, un déploiement plus global de efluid peut être envisagé si certaines précautions sont prises iI reste à nettoyer quelques points clé pour assurer un bon niveau de qualité logiciel et éviter que ces violations ne deviennent une cause de dysfonctionnement ou d'incapacité a atteindre les niveaux de performances attendus Il faut corriger les violations critiques en robustesse et performance : le risque est potentiellement décuplé avec la futur montée en charge de lapplication Attention a la gestion des exceptions Mieux respecter les pratiques de programmation objet Optimiser les boucles et la communication avec la base de données Utiliser les outils CAST (PRI) pour construire un plan daction rapide et efficace en les croisant avec des informations de dimensionnement ainsi que le résultats des autres audits. La génération automatique de code, et la gestion externe de la documentation permettent de sécuriser lévolution applicative. Conclusion

39 Agenda À propos de CAST Contexte et objectifs Bilan quantitatif et qualitatif (Facteurs de santé ISO) Détail des points améliorables Risque en production : Robustesse - Performance Risque en maintenance : Transférabilité – Évolutivité Conclusion ANNEXES 39 Copyright CAST 2010

40 Documentation – Javadoc efluid (1/4)

41 Documentation – Javadoc AEL (2/4)

42 Documentation – Javadoc pour EDK (3/4)

43 Documentation – Javadoc pour ARCHI (4/4)

44 Documentation – Répartition sur efluid (1/4)

45 Documentation – Répartition sur AEL (2/4)

46 Documentation – Répartition sur EDK (3/4)

47 Documentation – Répartition pour ARCHI (4/4)

48 Performance – Gestion des boucles pour efluid et AEL efluid AEL

49 Performance – Gestion des boucles pour EDK et ARCHI EDK ARCHI

50 Architecture – Appel cyclique entre package Eviter les appels cyclique entre packages : Un est inutilisable sans lautre Reconcevoir si nécessaire

51 Bonnes pratiques de lorienté objet Quelques conseils pour le respect des bonnes pratiques de la programmation orientée objet : Fournir un constructeur vide pour les classes utilitaires permet de sassurer que le développeur utilise ces classes correctement (Empêche le développeur dinstancier une classe qui ne doit jamais être instanciée) Fournir des « get/set» pour les variables privées afin de respecter le principe dencapsulation Déclarer des variables comme public expose la classe à des modifications externes Pour des raisons de sécurité, il faudrait typer laccès aux variables déclarées au niveau de la classe

52 Architecture – Factorisation – Application Réutilisation de 18,11 % Réutilisation de 9,53 % Très bon taux de réutilisabilité (>=15%) Maintenir la tendance Il faut noter qu'en règle générale la factorisation des composants tend à réduire les coûts de maintenance applicative EFLUID AEL Taux de réutilisabilité insuffisant (<15%) Attention à la duplication de code

53 Architecture – Factorisation – EDK et Archi EDK Archi Réutilisation de 18,45 % Réutilisation de 11,75% Très bon taux de réutilisabilité (>=15%) Maintenir la tendance Taux de réutilisabilité satisfaisant (proche de 15%) Attention à la duplication de code Il faut factoriser le code

54 Copier- Coller - EFLUID Beaucoup de duplication de code à noter au sein de lapplication Il faut factoriser le code

55 Copier- Coller - AEL Beaucoup de duplication de code à noter au sein de lapplication Il faut factoriser le code

56 Copier-Coller – HermesArchi et EDK

57 Répartition de la complexité cyclomatique - EFLUID Complexité faible Complexité élevée On observe une bonne répartition globale de la complexité cyclomatique Il est impératif de maintenir cette maitrise pour éviter la propagation de la complexité et les dérives des coûts de maintenance. On observe une bonne répartition globale de la complexité cyclomatique Il est impératif de maintenir cette maitrise pour éviter la propagation de la complexité et les dérives des coûts de maintenance. <5% <3%

58 Répartition de la complexité cyclomatique - AEL Complexité faible Complexité élevée <5% <3% On observe une bonne répartition globale de la complexité cyclomatique Il est impératif de maintenir cette maitrise pour éviter la propagation de la complexité et les dérives des coûts de maintenance. On observe une bonne répartition globale de la complexité cyclomatique Il est impératif de maintenir cette maitrise pour éviter la propagation de la complexité et les dérives des coûts de maintenance.

59 Répartition de la complexité cyclomatique - HermesArchi Complexité faible Complexité élevée <5% <3% On observe une bonne répartition globale de la complexité cyclomatique Il est impératif de maintenir cette maitrise pour éviter la propagation de la complexité et les dérives des coûts de maintenance. On observe une bonne répartition globale de la complexité cyclomatique Il est impératif de maintenir cette maitrise pour éviter la propagation de la complexité et les dérives des coûts de maintenance.

60 Répartition de la complexité cyclomatique - EDK Complexité faible Complexité élevée <5% <3% On observe une bonne répartition globale de la complexité cyclomatique Il est impératif de maintenir cette maitrise pour éviter la propagation de la complexité et les dérives des coûts de maintenance. On observe une bonne répartition globale de la complexité cyclomatique Il est impératif de maintenir cette maitrise pour éviter la propagation de la complexité et les dérives des coûts de maintenance.


Télécharger ppt "Because Good Software Means Business Performance CAST Application Intelligence Platform 7.0.4 Juillet 2011 Résultats de lassessment Qualité de lapplication."

Présentations similaires


Annonces Google