SlideShare ist ein Scribd-Unternehmen logo
1 von 75
Downloaden Sie, um offline zu lesen
Implanter	
  l'AOP...	
  	
  
Comment	
  par2r	
  du	
  bon	
  pied?	
  
               Confoo	
  2012	
  
       Montréal,	
  Québec,	
  Canada	
  


                 29	
  février	
  2012	
  
Félix-­‐Antoine	
  Bourbonnais	
  
	
  Ing.	
  jr,	
  PSM-­‐I	
  


!   Formateur	
  et	
  Coach	
  Agile	
  
!   Enseignement	
  et	
  forma2ons	
  	
  
           o  TDD,	
  Réusinage,	
  OO	
  avancé,	
  	
  
              AOP,	
  tests,	
  Scrum	
  
!   Recherches	
  	
  
           o  AOP,	
  agilité,	
  tests	
  et	
  mocks	
  
!   Développeur	
  	
  
           o  Java	
  et	
  Python	
  (principalement)	
     @fbourbonnais



                                                             2
Objec2f	
  de	
  la	
  présenta2on	
  




Image: jscreationzs / FreeDigitalPhotos.net   3
Réchauffement…	
  
                                        Quelles	
  sont	
  vos	
  aWentes?	
  


                                 Qui	
  fait	
  ou	
  a	
  fait	
  de	
  l’AOP	
  dans	
  un	
  
                                                            projet?	
  


                                                  En	
  un	
  mot:	
  AOP?	
  


                                Qui	
  a	
  eu	
  une	
  mauvaise	
  expérience	
  
                                                    avec	
  l’AOP?	
  
Image: Nutdanai Apikhomboonwaroot / FreeDigitalPhotos.net                            4
Les	
  

PRÉOCCUPATIONS	
  TRANSVERSES	
  


                          5
Préoccupa2ons	
  transverses	
  
Angl.: Crosscutting concerns.




     Certaines	
  préoccupa2ons	
  secondaires	
  sont	
  
      impossibles	
  à	
  regrouper	
  et	
  contaminent	
  
                     plusieurs	
  classes.	
  




                                               6
Préoccupa2ons	
  transverses	
  



                                Enchevêtrement	
  



            Éparpillement	
  




                                                     7
Préoccupa2ons	
  transverses	
  
Enchevêtrement	
  (cohésion)	
  


                                   Fonc2onnalité	
  
                                     principale	
  


                                    Persistance	
  


                                      Sécurité	
  


                                    Observa2on	
  




                                               8
 




                                                                                                     Enchevêtrement	
  (1)	
  
      
    
      
         
 
         
         
         
       
                 
            
            

            
                 
              
                       
                     
                       
                   
           

       
         
                              
            
                 
           
                        
                

             
                                   
                 
           
           
      


                                                                                                 9
Enchevêtrement	
  (2)	
  
                            10
Enchevêtrement	
  (3)	
  
                            11
Enchevêtrement	
  (4)	
  
                            12
Enchevêtrement	
  
(principale)	
  
                     13
Enchevêtrement	
  
(récapitula2f)	
  
                     14
Préoccupa2ons	
  transverses	
  
Éparpillement	
  (dispersion)	
  

                    Persistance	
  




                                      15
Introduc2on	
  à	
  

L’AOP	
  


                       16
Orienta2on	
  objet	
  et	
  préoccupa2ons	
  

                                   Encapsula2on	
  




          Cohésion	
                                          Modularité	
  




                         SRP	
                        Couplage	
  



                                                                      17
Orienta2on	
  objet	
  et	
  préoccupa2ons	
  




     Théoriquement,	
  chaque	
  classe	
  devrait	
  
     représenter	
  une	
  seule	
  préoccupa2on.	
  




                                            18
Orienta2on	
  aspect	
  
                           C	
                                              A


                                   Classe	
  1	
          Aspect	
  1	
  



                                                                            A
                           C	
  
                                                          Aspect	
  2	
  

                                   Classe	
  2	
                            A
                                                          Aspect	
  3	
  




                                                     19
Rappel	
  rapide	
  de	
  

LA	
  TERMINOLOGIE	
  ET	
  DU	
  
FONCTIONNEMENT	
  

                                     20
Un	
  aspect	
  
!   Un	
  module	
  encapsulant	
  une	
  préoccupa2on	
  
!   Peu	
  gérer	
  les	
  préoccupa2ons	
  transverses	
  
!   Généralement	
  une	
  classe	
  «	
  évoluée	
  »	
  
    o  Capacités	
  supplémentaires	
  afin	
  de	
  permeWre	
  
       l’encapsula2on	
  de	
  préoccupa2ons	
  transverses	
  




                                                             21
Contenu	
  typique	
  d’un	
  aspect	
  



  Code	
  à	
       Indica2on	
  
                                             Aspect	
  
 exécuter	
         des	
  cibles	
  




                                        22
Aspect	
  en	
  AspectJ	
  
public aspect VisitorAspect {          !
!
        /∗ −−−−−−−− Pointcuts −−−−−−−− ∗/ !
  protected pointcut startMethod() : !
             execution( ∗ start∗(..) ); !
    !
  /∗ −−−−−−−− Advices −−−−−−−− ∗/ !
  after() : startMethod() { !
             printHello(); !
        }!
!
} !
!




                                              23
Pourquoi	
  est-­‐ce	
  que	
  

L’AOP	
  N’A	
  PAS	
  AUTANT	
  RAYONNÉ	
  
QUE	
  PRÉVU?	
  

                                  24
Pourquoi	
  est-­‐ce	
  que	
  plusieurs	
  
entreprises	
  délaissent	
  l’AOP?	
  
     Mauvaises	
  raisons	
  et	
  u2lisa2ons	
  

        Complexité	
  ajoutée	
  

          Manque	
  de	
  support	
  et	
  d’intégra2on	
  

        Manque	
  de	
  connaissances	
  et	
  de	
  compétences	
  

     Trop	
  de	
  promesses	
  

                                                     25
Aspect	
  !=	
  AOP	
  




Image: Danilo Rizzuti / FreeDigitalPhotos.net   26
Enquête	
  auprès	
  de	
  débutants	
  (2009)	
  
!   Pas	
  plus	
  difficile	
  à	
  apprendre	
  que	
  l’OO	
  (74%)	
  
!   Il	
  est	
  difficile	
  de	
  tester	
  un	
  aspect	
  (100%)	
  
       o  N’avaient	
  pas	
  une	
  grande	
  expérience	
  avec	
  les	
  tests.	
  
!   Les	
  tests	
  sont	
  simplifiés	
  grâce	
  à	
  l’AOP	
  (67%)	
  
!   Plusieurs	
  autres	
  difficultés	
  sont	
  causées	
  par	
  un	
  
    manque	
  d’expérience	
  
!   100%	
  réu2liseraient	
  l’AOP	
  mais	
  62%	
  avec	
  prudence	
  

[1] Félix-Antoine Bourbonnais and Luc Lamontagne,
Using AOP for an Academic Agile Project: A Pilot Study,
1st International Workshop on Empirical Evaluation of Software Composition Techniques
                                                                                        27
(ESCOT 2010), Rennes, France, 2010.
Enquête	
  auprès	
  de	
  débutants	
  (2009)	
  
Cri2que	
  de	
  la	
  validité	
  

!   Le	
  contexte	
  
     o  Étudiants	
  de	
  bacc.	
  (3e/4e	
  année)	
  
     o  Projet	
  de	
  session	
  (3	
  mois)	
  
     o  Portail	
  financier	
  web	
  avec	
  GWT	
  ou	
  Spring	
  
!   Pour	
  les	
  autres	
  données	
  et	
  le	
  contexte	
  détaillé:	
  
     o  Félix-­‐Antoine	
  Bourbonnais	
  and	
  Luc	
  Lamontagne,	
  	
  
        Using	
  AOP	
  for	
  an	
  Academic	
  Agile	
  Project:	
  A	
  Pilot	
  Study	
  
        ESCOT	
  2012,	
  Renne,	
  France,	
  20120.	
  
     o  hWp://www.comp.lancs.ac.uk/~greenwop/escot10/
        escot10_submission_2.pdf	
  
                                                                                                28
Comment	
  

INTRODUIRE	
  DE	
  L’AOP	
  DANS	
  
VOTRE	
  PROJET	
  

                                  29
1.	
  Avoir	
  un	
  but…	
  




Image: renjith krishnan / FreeDigitalPhotos.net   30
2.	
  Choisir	
  sa	
  technologie	
  




Image: Sura Nualpradid / FreeDigitalPhotos.net   31
Choix	
  technologiques	
  
!   Tisseur	
  /	
  cadre	
  applica2f	
  (framework)	
  
    o  Compilateur	
  spécial	
  
    o  Pur	
  java	
  
!   Mode	
  de	
  2ssage	
  
    o  LTW	
  (au	
  chargement	
  des	
  classes)	
  
    o  CTW	
  (à	
  la	
  compila2on)	
  




                                                            32
Choix	
  technologiques	
  
!   Syntaxe	
  
    o  Java	
  
    o  AspectJ	
  Language	
  (.aj)	
  
    o  @AspectJ	
  
    o  XML	
  
!   Intégra2on	
  
    o  Maven	
  
    o  AJDT	
  


                                          33
3.	
  Considérer	
  la	
  complexité	
  ajoutée	
  

                               Gains	
  




        Complexité	
  

                                      34
4.	
  Considérer	
  l’intégra2on	
  
!   Avec	
  d’autres	
  cadres	
  
    applica2fs	
  (framework)	
  
!   Le	
  système	
  de	
  
    déploiement	
  	
  
!   L’intégrateur	
  con2nu	
  
!   Les	
  technologie	
  de	
  tests	
  
!   Etc.	
  


Image: manostphoto / FreeDigitalPhotos.net   35
5.	
  S’assurer	
  de	
  maîtriser	
  les	
  concepts	
  

Rappelez-­‐vous	
  que	
  vous	
  introduisez	
  un	
  nouveau	
  
    paradigme	
  et	
  non	
  pas	
  simplement	
  une	
  
              technologie	
  «	
  cool	
  »!	
  
!   Prototyper	
  
!   Essayer	
  sur	
  un	
  pe2t	
  projet	
  
!   Bien	
  se	
  documenter	
  
!   Bien	
  former	
  son	
  équipe	
  




Image: renjith krishnan / FreeDigitalPhotos.net   36
6.	
  Se	
  discipliner	
  
!   Résistez	
  au	
  «	
  canon	
  	
  pour	
  tuer	
  une	
  mouche	
  »	
  
!   L’AO	
  tourne	
  généralement	
  mal	
  entre	
  	
  
    les	
  mains	
  de	
  cowboys	
  
!   Balancez	
  toujours	
  la	
  complexité	
  	
  
    versus	
  le	
  gain	
  
!   Tester!	
  




Image: photostock / FreeDigitalPhotos.net                          37
Quelques	
  

    MAUVAISES	
  PRATIQUES	
  

Image: Ambro/ FreeDigitalPhotos.net   38
Trop,	
  c’est	
  comme	
  pas	
  assez…	
  
!   Quand	
  50%	
  du	
  code	
  est	
  
    composé	
  d’aspects…	
  
    	
  
!   Est-­‐ce	
  50%	
  du	
  code	
  est	
  
    composé	
  de	
  
    préoccupa2ons	
  
    transverses?	
  




Image: farconville / FreeDigitalPhotos.net     39
L’AOP	
  n’est	
  pas	
  un	
  pansement	
  
!   Suis-­‐je	
  en	
  train	
  d’u2liser	
  
    l’AOP	
  pour	
  corriger	
  un	
  
    problème	
  de	
  design?	
  
    	
  
!   Ne	
  vous	
  servez	
  pas	
  de	
  
    l’AOP	
  comme	
  parfum	
  
    afin	
  de	
  masquer	
  les	
  
    mauvaises	
  odeurs…	
  



Image: digitalart / FreeDigitalPhotos.net       40
Le	
  «	
  trip	
  techno	
  »	
  

                           L’AOP	
  c’est	
  trop	
  COOL	
  !!	
  
         La	
  chute	
  pourrait	
  être	
  douloureuse!	
  

       •  «	
  AspectJ...	
  WOW	
  trop	
  cool	
  !	
  »	
  
       •  «	
  On	
  peut	
  bidouiller	
  plein	
  de	
  trucs	
  avec	
  ça	
  !	
  »	
  
       •  «	
  Tsé	
  le	
  truc	
  qu’on	
  arrivait	
  pas	
  à	
  faire...	
  on	
  va	
  faire	
  un	
  aspect	
  qui	
  va	
  
          changer	
  ça	
  puis	
  qui	
  va	
  décider	
  si…	
  »	
  	
  




                                                                                                      41
Quelques	
  

    BONNES	
  PRATIQUES	
  

Image: photostock / FreeDigitalPhotos.net   42
OO	
  encore	
  d’actualité	
  




   Ce	
  qui	
  était	
  vrai	
  en	
  OO	
  l’est	
  encore	
  en	
  AO	
  




                                                           43
Conseils	
  de	
  base	
  habituels	
  
!   Code	
  propre	
  
!   Cohésion	
  dans	
  l’aspect	
  
!   Couplage	
  de	
  l’aspect	
  




                                       44
Un	
  aspect?	
  Vraiment?	
  


       Est-­‐ce	
  une	
  préoccupa2on	
  transverse?	
  
                                   	
  
 Est-­‐ce	
  que	
  je	
  pourrais	
  réusiner	
  mon	
  design	
  OO	
  
             pour	
  aWeindre	
  le	
  même	
  objec2f?	
  



                                                      45
U2liser	
  l’aspect	
  comme	
  «	
  lien	
  »	
  
!   Déléguer	
  à	
  une	
  classe	
  qui	
  con2ent	
  la	
  logique	
  liée	
  à	
  ceWe	
  
    préoccupa2on	
  
!   U2liser	
  l’aspect	
  pour	
  2sser	
  la	
  logique	
  
!   Note:	
  Peut	
  varier	
  en	
  fonc2on	
  du	
  2sseur	
  (ex.:	
  AspectJ)	
  

pointcut inXorY() :
    execution(* *(..))                           X	
  
                                           (classe	
  cible)	
  




                                                                    Aspect	
  
    && within(X || Y);                                                                  Persistance	
  
                                                                                      (classe	
  à	
  2sser)	
  
after() : inXorY {                               Y	
  
                                           (classe	
  cible)	
  
    persistance.clearCache();
}

                                                                                 46
Dépendances	
  et	
  couplage	
  
                                                 !   N’oubliez	
  pas	
  que	
  
                                                     l’aspect	
  est	
  couplé	
  à	
  
                                                     toutes	
  les	
  classes	
  où	
  il	
  
                                                     s’injecte*.	
  	
  
                                                     	
  
                                                     *	
  Où	
  un	
  point	
  de	
  coupure	
  apparie	
  




Image: Salvatore Vuono / FreeDigitalPhotos.net                               47
Limiter	
  le	
  couplage	
  

 Un	
  aspect	
  trop	
  fortement	
  couplé	
  et	
  ayant	
  des	
  
dépendances	
  éloignées	
  augmente	
  la	
  complexité́	
  
    et	
  le	
  rend	
  vulnérable	
  aux	
  changements.	
  
                     «	
  AOSD-­‐Evolu2on	
  Paradox	
  »	
  [1]	
  	
  
                                                            	
  


[1] Dean Wampler, Aspect-Oriented programming and design for java and AspectJ, 2007.
                                                                                       48
http://polyglotprogramming.com/papers/AOPIntroAndPrinciplesTalk.pdf.
Précision	
  du	
  point	
  de	
  coupure	
  
!   Un	
  PC	
  précis	
  est	
  plus	
  à	
  risque	
  d’être	
  impacté	
  par	
  un	
  
    changement	
  
!   Un	
  PC	
  très	
  générique	
  risque	
  d’apparier	
  trop	
  de	
  PJ	
  
!   On	
  appelle	
  cela	
  le	
  «	
  Fragile	
  Pointcut	
  Problem	
  »	
  [1]	
  	
  

pointcut pcPrecis()                           : execution(void C.doX());
pointcut pcGenerique() : execution(* C.doX*(..));
pointcut pcPourEtreCertainAvoirProbleme : execution(* *(..));


-  Si C.doX() est renommé pour C.doXInContext() …
-  Si on ajoute C.doXPasRapportAvecAspect() …

[1] C. Koppen et M. Störzer. PCDiff : attacking the fragile pointcut problem.
                                                                                49
In European Interactive Workshop on Aspects in Software (EIWAS), 2004.
Conscience	
  ou	
  inconscience?	
  

  Est-­‐ce	
  que	
  les	
  classes	
  2ssées	
  devraient	
  avoir	
  
           conscience	
  ou	
  non	
  des	
  aspects?	
  
                                   	
  
                       Débat	
  ouvert	
  	
  
         «	
  obliviousness	
  »	
  vs	
  «	
  awareness	
  »	
  


                                                       50
Bonnes	
  pra2ques	
  de	
  

TESTS	
  D’ASPECTS	
  


                               51
Tests	
  de	
  haut	
  niveau	
  

   Les	
  aspects	
  contribuent	
  aux	
  fonc2onnalités	
  
                   globales	
  du	
  système	
  
                                    	
  
  Rien	
  ne	
  change	
  pour	
  les	
  tests	
  de	
  haut	
  niveau	
  
           (fonc2onnels,	
  accepta2on,	
  etc.)	
  


                                                        52
Tests	
  unitaires	
  




                         53
Tester	
  unitairement	
  un	
  aspect	
  

        La	
  bonne	
  
          chose	
  
          (advice)	
  

                            Test	
  
                          unitaire	
  
         Au	
  bon	
  
                          d’aspect	
  
         moment	
  
         (pointcut)	
  



                                   54
Technique	
  du	
  pot	
  de	
  miel	
  

                                                                                
             1           Pot	
  1	
                        



 UTest	
                                                        
                                                                                
                         Pot	
  2	
     X   Aspect	
                            
                     2                                                  
                                                                                                         
                                                                            
                                                                                   
                                                                                              
                                                                                 
                 3                                                           
                         Pot	
  N	
                         




                                                                           55
                                                        


                                                                              
                                                 
                                                               

                                                          




                                                            





                                                           
                                                                               
                          
                                             
                                                         
                                                                        
                                                        




                                                                 56
Encore	
  faim?	
                                  hWps://joind.in/6005	
  




        Téléchargez	
  les	
  diaposi2ves	
  complètes	
  sur	
  
                developpementagile.com	
  




Image: rajcreationzs / FreeDigitalPhotos.ne        57
Période	
  de	
  

QUESTIONS	
  

                    58
Choisir	
  son	
  

CADRE	
  APPLICATIF	
  (FRAMEWORK)	
  


                             59
Quelques	
  cadres	
  pour	
  Java	
  
! AspectJ	
  
! Spring-­‐AOP	
  
! Guice-­‐AOP	
  
!   …	
  




                                    60
AspectJ	
  
!   Le	
  plus	
  complet	
  
    o  Plusieurs	
  primi2ves	
  
    o  Plusieurs	
  PJ	
  possibles	
  
!   Extension	
  à	
  Java	
  
    o  Requiert	
  un	
  compilateur	
  d’Aspects	
  
    o  Ou	
  de	
  remplacer	
  le	
  chargement	
  des	
  classes	
  	
  
       (CL	
  ou	
  Java	
  Agent)	
  




                                                                      61
Spring	
  supporte	
  deux	
  2sseurs	
  


                 Spring	
  
                  AOP	
  
                              Spring	
  
                                AJ	
  




                        Spring	
  

                                           62
Sprint-­‐AOP	
  
!   Java	
  100%	
  pur	
  
    o  Ne	
  requiert	
  pas	
  de	
  compilateur	
  spécial	
  
    o  Ne	
  requiert	
  pas	
  de	
  Java	
  Agent	
  
    o  U2lise	
  des	
  «	
  Proxies	
  »	
  dynamiques	
  
!   Limita2ons	
  
    o  Tissage	
  possible	
  uniquement	
  dans	
  des	
  Beans	
  Spring	
  
    o  Peu	
  de	
  primi2ves	
  et	
  limitées	
  (ex.:	
  exécu2on	
  de	
  méthodes)	
  
    o  Ne	
  peut	
  intercepter	
  des	
  appels	
  à	
  «	
  this	
  »	
  


                                                                               63
Spring-­‐Aj	
  
! Spring	
  peut	
  se	
  servir	
  d’aspects	
  de	
  Spring	
  pour	
  élargir	
  
  ses	
  fonc2onnalités	
  
! Spring	
  se	
  sert	
  d’AspectJ	
  pour	
  lui-­‐même	
  
!   @Configurable	
  permet	
  d’injecter	
  des	
  dépendances	
  
    dans	
  des	
  objets	
  qui	
  ne	
  sont	
  pas	
  des	
  Beans	
  
                                                              Souvent	
  une	
  mauvaise	
  
                                                              odeur	
  concernant	
  le	
  
 Spring	
                                  Spring	
           design…	
  
                      AspectJ	
  
   AJ	
                                    FW++	
  



                                                              64
Syntaxe	
  ou	
  2sseur?	
  
                    Tissage	
      Syntaxe	
  (langage)	
  

    Spring-­‐AOP	
  (proxy)	
      XML	
  

                   AspectJ	
       @AspectJ	
  

                 Spring-­‐AJ	
     Langage	
  AJ	
  (.aj)	
  




                                                     65
Google	
  Guice	
  
!   Limita2ons	
  similaires	
  à	
  Spring-­‐AOP	
  (par	
  «	
  proxies	
  »)	
  
!   Syntaxe	
  propre	
  
    o  Java	
  
    o  Pas	
  de	
  syntaxe	
  cachée	
  dans	
  les	
  chaînes	
  de	
  caractères	
  des	
  
       annota2ons	
  (comme	
  @AspectJ)	
  




                                                                       66
Choisir	
  son	
  	
  

MODE	
  DE	
  TISSAGE	
  


                            67
Deux	
  grandes	
  approches	
  de	
  2ssage	
  


          À	
  la	
  compila2on	
  (CTW)	
  

          À	
  l’exécu2on	
  (LTW)	
  

                                   68
CTW	
  (Compile-­‐Time	
  Weaving)	
  
!   Tissage	
  à	
  la	
  compila2on	
  
!   Remplace	
  généralement	
  le	
  compilateur	
  de	
  Java	
  
!   Peut	
  2sser	
  uniquement	
  dans	
  le	
  code	
  compilé	
  (pas	
  
    dans	
  une	
  lib.	
  externe)	
  
!   Produit	
  du	
  Bytecode	
  standard	
  2ssé	
  




                                                           69
LTW	
  (Load-­‐Time	
  Weaving)	
  
!   Tissage	
  lors	
  du	
  chargement	
  de	
  la	
  classe	
  
!   Remplace	
  (assiste)	
  le	
  chargeur	
  de	
  classes	
  de	
  Java	
  
    (ClassLoader)	
  
!   Requiert	
  généralement	
  le	
  démarrage	
  de	
  la	
  JVM	
  avec	
  
    un	
  JavaAgent	
  
!   Peut	
  être	
  probléma2que	
  avec	
  des	
  JEE	
  Container	
  ou	
  
    entrer	
  en	
  conflit	
  avec	
  d’autres	
  instrumenta2ons	
  



                                                                70
Considérer	
  

L’INTÉGRATION	
  


                    71
AJDT	
  
!   Plugin	
  Eclipse	
  pour	
  AspectJ	
  
!   Désagrément	
  sub2le:	
  
    o  Force	
  le	
  CTW	
  sur	
  le	
  projet	
  dans	
  Eclipse	
  quand	
  la	
  nature	
  
       «	
  AspectJ	
  »	
  est	
  ac2vée	
  
!   Offre	
  de	
  l’assistance	
  
    o  Complé2on	
  (limitée)	
  
    o  Réusinage	
  (limité)	
  
    o  Colora2on	
  syntaxique	
  et	
  validateur	
  


                                                                          72
Maven	
  
!   Plugin	
  pour	
  AspectJ	
  
!   Si	
  combiné	
  avec	
  AJDT	
  
    o  Compile	
  avec	
  AJC	
  versus	
  JDT-­‐AJ	
  pour	
  Eclipse	
  
    o  Toujours	
  faire	
  «	
  mvn	
  clean	
  »	
  pour	
  éviter	
  les	
  problèmes	
  
!   Pour	
  du	
  LTW	
  u2lisez	
  le	
  Exec	
  Mabven	
  Plugin	
  
    (ou	
  autre)	
  et	
  passez	
  le	
  JavaAgent	
  




                                                                        73
Spring	
  +	
  AJ	
  
!   U2liser	
  le	
  Java	
  Agent	
  de	
  Spring	
  plutôt	
  que	
  celui	
  par	
  
    défaut	
  d’AspectJ	
  
!   AWen2on	
  à	
  la	
  combinaison	
  Spring-­‐AOP	
  (proxy)	
  et	
  
    AJDT	
  




                                                                  74
Autres	
  considéra2ons	
  
! Maven	
  
    o  Il	
  est	
  possible	
  que	
  les	
  métriques	
  soient	
  comptées	
  en	
  
       double	
  en	
  CTW.	
  
    o  Ex.:	
  couverture	
  des	
  tests	
  
!   JEE	
  Container	
  et	
  Spring	
  
    o  Des	
  chargeurs	
  de	
  classes	
  spécifiques	
  sont	
  disponibles	
  pour	
  
       plusieurs	
  JEE	
  Container.	
  
    o  Sinon,	
  il	
  faut	
  se	
  rabaWre	
  sur	
  u	
  Java	
  Agent	
  de	
  la	
  JVM	
  



                                                                                75

Weitere ähnliche Inhalte

Andere mochten auch

Speed sharing pour Scrum Masters
Speed sharing pour Scrum MastersSpeed sharing pour Scrum Masters
Speed sharing pour Scrum MastersElapse Technologies
 
Une introduction au lean software developement
Une introduction au lean software developementUne introduction au lean software developement
Une introduction au lean software developementElapse Technologies
 
Tests unitaires éviter les pièges & nouvelles pratiques
Tests unitaires éviter les pièges & nouvelles pratiquesTests unitaires éviter les pièges & nouvelles pratiques
Tests unitaires éviter les pièges & nouvelles pratiquesElapse Technologies
 
Le rôle du charge de projet lors d'un contexte de réalisation en mode Agile
Le rôle du charge de projet lors d'un contexte de réalisation en mode AgileLe rôle du charge de projet lors d'un contexte de réalisation en mode Agile
Le rôle du charge de projet lors d'un contexte de réalisation en mode AgileElapse Technologies
 
Une introduction au lean product development
Une introduction au lean product developmentUne introduction au lean product development
Une introduction au lean product developmentElapse Technologies
 
Nos leçons apprises avec la méthode kanban
Nos leçons apprises avec la méthode kanbanNos leçons apprises avec la méthode kanban
Nos leçons apprises avec la méthode kanbanCGI Québec Formation
 

Andere mochten auch (9)

Speed sharing pour Scrum Masters
Speed sharing pour Scrum MastersSpeed sharing pour Scrum Masters
Speed sharing pour Scrum Masters
 
Une introduction au lean software developement
Une introduction au lean software developementUne introduction au lean software developement
Une introduction au lean software developement
 
Extension Agile du BABOK
Extension Agile du BABOKExtension Agile du BABOK
Extension Agile du BABOK
 
Atelier pour Scrum Master
Atelier pour Scrum MasterAtelier pour Scrum Master
Atelier pour Scrum Master
 
Tests unitaires éviter les pièges & nouvelles pratiques
Tests unitaires éviter les pièges & nouvelles pratiquesTests unitaires éviter les pièges & nouvelles pratiques
Tests unitaires éviter les pièges & nouvelles pratiques
 
Tester pour apprendre
Tester pour apprendreTester pour apprendre
Tester pour apprendre
 
Le rôle du charge de projet lors d'un contexte de réalisation en mode Agile
Le rôle du charge de projet lors d'un contexte de réalisation en mode AgileLe rôle du charge de projet lors d'un contexte de réalisation en mode Agile
Le rôle du charge de projet lors d'un contexte de réalisation en mode Agile
 
Une introduction au lean product development
Une introduction au lean product developmentUne introduction au lean product development
Une introduction au lean product development
 
Nos leçons apprises avec la méthode kanban
Nos leçons apprises avec la méthode kanbanNos leçons apprises avec la méthode kanban
Nos leçons apprises avec la méthode kanban
 

Ähnlich wie Implanter l'AOP... Comment partir du bon pied?

eXtreme Programming [fr]
eXtreme Programming [fr]eXtreme Programming [fr]
eXtreme Programming [fr]Rémy Coutable
 
Introduction AOP
Introduction AOPIntroduction AOP
Introduction AOPKlee Group
 
Kiteco emsi2010 rapport
Kiteco emsi2010 rapportKiteco emsi2010 rapport
Kiteco emsi2010 rapportGreenICTies
 
Développez le management visuel
Développez le management visuelDéveloppez le management visuel
Développez le management visuelThomas Lissajoux
 
Software Craftsmanship : en Pratique - AgileTour
Software Craftsmanship : en Pratique - AgileTourSoftware Craftsmanship : en Pratique - AgileTour
Software Craftsmanship : en Pratique - AgileTourJean-Laurent de Morlhon
 
201001 Agilité
201001 Agilité201001 Agilité
201001 Agilitélyonjug
 
PowerPoint & mon cours. Concevoir un diaporama pour enseigner
PowerPoint & mon cours. Concevoir un diaporama pour enseignerPowerPoint & mon cours. Concevoir un diaporama pour enseigner
PowerPoint & mon cours. Concevoir un diaporama pour enseignerGROLLEAU Anne-Céline
 
Design Patterns Java
Design Patterns JavaDesign Patterns Java
Design Patterns JavaVINOT Bernard
 
Cours de C++, en français, 2002 - Cours 1.1
Cours de C++, en français, 2002 - Cours 1.1Cours de C++, en français, 2002 - Cours 1.1
Cours de C++, en français, 2002 - Cours 1.1Laurent BUNIET
 
Soirée Qualité Logicielle avec Sonar
Soirée Qualité Logicielle avec SonarSoirée Qualité Logicielle avec Sonar
Soirée Qualité Logicielle avec SonarElsassJUG
 
Conception assistée de documents structurés
Conception assistée de documents structurésConception assistée de documents structurés
Conception assistée de documents structurésmlefebvre
 
Le projet Tiger à l'EPITA
Le projet Tiger à l'EPITALe projet Tiger à l'EPITA
Le projet Tiger à l'EPITAhere_and_there
 

Ähnlich wie Implanter l'AOP... Comment partir du bon pied? (18)

Novencia agile
Novencia agileNovencia agile
Novencia agile
 
Initiation à l’AOP
Initiation à l’AOPInitiation à l’AOP
Initiation à l’AOP
 
eXtreme Programming [fr]
eXtreme Programming [fr]eXtreme Programming [fr]
eXtreme Programming [fr]
 
Introduction AOP
Introduction AOPIntroduction AOP
Introduction AOP
 
Presentation Spring
Presentation SpringPresentation Spring
Presentation Spring
 
Kiteco emsi2010 rapport
Kiteco emsi2010 rapportKiteco emsi2010 rapport
Kiteco emsi2010 rapport
 
Développez le management visuel
Développez le management visuelDéveloppez le management visuel
Développez le management visuel
 
2012 vallat complexité
2012 vallat complexité2012 vallat complexité
2012 vallat complexité
 
Software Craftsmanship : en Pratique - AgileTour
Software Craftsmanship : en Pratique - AgileTourSoftware Craftsmanship : en Pratique - AgileTour
Software Craftsmanship : en Pratique - AgileTour
 
Apprentissage du java
Apprentissage du javaApprentissage du java
Apprentissage du java
 
Software Craftsmanship: En pratique
Software Craftsmanship: En pratiqueSoftware Craftsmanship: En pratique
Software Craftsmanship: En pratique
 
201001 Agilité
201001 Agilité201001 Agilité
201001 Agilité
 
PowerPoint & mon cours. Concevoir un diaporama pour enseigner
PowerPoint & mon cours. Concevoir un diaporama pour enseignerPowerPoint & mon cours. Concevoir un diaporama pour enseigner
PowerPoint & mon cours. Concevoir un diaporama pour enseigner
 
Design Patterns Java
Design Patterns JavaDesign Patterns Java
Design Patterns Java
 
Cours de C++, en français, 2002 - Cours 1.1
Cours de C++, en français, 2002 - Cours 1.1Cours de C++, en français, 2002 - Cours 1.1
Cours de C++, en français, 2002 - Cours 1.1
 
Soirée Qualité Logicielle avec Sonar
Soirée Qualité Logicielle avec SonarSoirée Qualité Logicielle avec Sonar
Soirée Qualité Logicielle avec Sonar
 
Conception assistée de documents structurés
Conception assistée de documents structurésConception assistée de documents structurés
Conception assistée de documents structurés
 
Le projet Tiger à l'EPITA
Le projet Tiger à l'EPITALe projet Tiger à l'EPITA
Le projet Tiger à l'EPITA
 

Implanter l'AOP... Comment partir du bon pied?

  • 1. Implanter  l'AOP...     Comment  par2r  du  bon  pied?   Confoo  2012   Montréal,  Québec,  Canada   29  février  2012  
  • 2. Félix-­‐Antoine  Bourbonnais    Ing.  jr,  PSM-­‐I   !   Formateur  et  Coach  Agile   !   Enseignement  et  forma2ons     o  TDD,  Réusinage,  OO  avancé,     AOP,  tests,  Scrum   !   Recherches     o  AOP,  agilité,  tests  et  mocks   !   Développeur     o  Java  et  Python  (principalement)   @fbourbonnais 2
  • 3. Objec2f  de  la  présenta2on   Image: jscreationzs / FreeDigitalPhotos.net 3
  • 4. Réchauffement…   Quelles  sont  vos  aWentes?   Qui  fait  ou  a  fait  de  l’AOP  dans  un   projet?   En  un  mot:  AOP?   Qui  a  eu  une  mauvaise  expérience   avec  l’AOP?   Image: Nutdanai Apikhomboonwaroot / FreeDigitalPhotos.net 4
  • 6. Préoccupa2ons  transverses   Angl.: Crosscutting concerns. Certaines  préoccupa2ons  secondaires  sont   impossibles  à  regrouper  et  contaminent   plusieurs  classes.   6
  • 7. Préoccupa2ons  transverses   Enchevêtrement   Éparpillement   7
  • 8. Préoccupa2ons  transverses   Enchevêtrement  (cohésion)   Fonc2onnalité   principale   Persistance   Sécurité   Observa2on   8
  • 9.   Enchevêtrement  (1)                                                                                                                                                                  9
  • 15. Préoccupa2ons  transverses   Éparpillement  (dispersion)   Persistance   15
  • 17. Orienta2on  objet  et  préoccupa2ons   Encapsula2on   Cohésion   Modularité   SRP   Couplage   17
  • 18. Orienta2on  objet  et  préoccupa2ons   Théoriquement,  chaque  classe  devrait   représenter  une  seule  préoccupa2on.   18
  • 19. Orienta2on  aspect   C   A Classe  1   Aspect  1   A C   Aspect  2   Classe  2   A Aspect  3   19
  • 20. Rappel  rapide  de   LA  TERMINOLOGIE  ET  DU   FONCTIONNEMENT   20
  • 21. Un  aspect   !   Un  module  encapsulant  une  préoccupa2on   !   Peu  gérer  les  préoccupa2ons  transverses   !   Généralement  une  classe  «  évoluée  »   o  Capacités  supplémentaires  afin  de  permeWre   l’encapsula2on  de  préoccupa2ons  transverses   21
  • 22. Contenu  typique  d’un  aspect   Code  à   Indica2on   Aspect   exécuter   des  cibles   22
  • 23. Aspect  en  AspectJ   public aspect VisitorAspect { ! ! /∗ −−−−−−−− Pointcuts −−−−−−−− ∗/ !   protected pointcut startMethod() : !   execution( ∗ start∗(..) ); ! !   /∗ −−−−−−−− Advices −−−−−−−− ∗/ !   after() : startMethod() { !   printHello(); ! }! ! } ! ! 23
  • 24. Pourquoi  est-­‐ce  que   L’AOP  N’A  PAS  AUTANT  RAYONNÉ   QUE  PRÉVU?   24
  • 25. Pourquoi  est-­‐ce  que  plusieurs   entreprises  délaissent  l’AOP?   Mauvaises  raisons  et  u2lisa2ons   Complexité  ajoutée   Manque  de  support  et  d’intégra2on   Manque  de  connaissances  et  de  compétences   Trop  de  promesses   25
  • 26. Aspect  !=  AOP   Image: Danilo Rizzuti / FreeDigitalPhotos.net 26
  • 27. Enquête  auprès  de  débutants  (2009)   !   Pas  plus  difficile  à  apprendre  que  l’OO  (74%)   !   Il  est  difficile  de  tester  un  aspect  (100%)   o  N’avaient  pas  une  grande  expérience  avec  les  tests.   !   Les  tests  sont  simplifiés  grâce  à  l’AOP  (67%)   !   Plusieurs  autres  difficultés  sont  causées  par  un   manque  d’expérience   !   100%  réu2liseraient  l’AOP  mais  62%  avec  prudence   [1] Félix-Antoine Bourbonnais and Luc Lamontagne, Using AOP for an Academic Agile Project: A Pilot Study, 1st International Workshop on Empirical Evaluation of Software Composition Techniques 27 (ESCOT 2010), Rennes, France, 2010.
  • 28. Enquête  auprès  de  débutants  (2009)   Cri2que  de  la  validité   !   Le  contexte   o  Étudiants  de  bacc.  (3e/4e  année)   o  Projet  de  session  (3  mois)   o  Portail  financier  web  avec  GWT  ou  Spring   !   Pour  les  autres  données  et  le  contexte  détaillé:   o  Félix-­‐Antoine  Bourbonnais  and  Luc  Lamontagne,     Using  AOP  for  an  Academic  Agile  Project:  A  Pilot  Study   ESCOT  2012,  Renne,  France,  20120.   o  hWp://www.comp.lancs.ac.uk/~greenwop/escot10/ escot10_submission_2.pdf   28
  • 29. Comment   INTRODUIRE  DE  L’AOP  DANS   VOTRE  PROJET   29
  • 30. 1.  Avoir  un  but…   Image: renjith krishnan / FreeDigitalPhotos.net 30
  • 31. 2.  Choisir  sa  technologie   Image: Sura Nualpradid / FreeDigitalPhotos.net 31
  • 32. Choix  technologiques   !   Tisseur  /  cadre  applica2f  (framework)   o  Compilateur  spécial   o  Pur  java   !   Mode  de  2ssage   o  LTW  (au  chargement  des  classes)   o  CTW  (à  la  compila2on)   32
  • 33. Choix  technologiques   !   Syntaxe   o  Java   o  AspectJ  Language  (.aj)   o  @AspectJ   o  XML   !   Intégra2on   o  Maven   o  AJDT   33
  • 34. 3.  Considérer  la  complexité  ajoutée   Gains   Complexité   34
  • 35. 4.  Considérer  l’intégra2on   !   Avec  d’autres  cadres   applica2fs  (framework)   !   Le  système  de   déploiement     !   L’intégrateur  con2nu   !   Les  technologie  de  tests   !   Etc.   Image: manostphoto / FreeDigitalPhotos.net 35
  • 36. 5.  S’assurer  de  maîtriser  les  concepts   Rappelez-­‐vous  que  vous  introduisez  un  nouveau   paradigme  et  non  pas  simplement  une   technologie  «  cool  »!   !   Prototyper   !   Essayer  sur  un  pe2t  projet   !   Bien  se  documenter   !   Bien  former  son  équipe   Image: renjith krishnan / FreeDigitalPhotos.net 36
  • 37. 6.  Se  discipliner   !   Résistez  au  «  canon    pour  tuer  une  mouche  »   !   L’AO  tourne  généralement  mal  entre     les  mains  de  cowboys   !   Balancez  toujours  la  complexité     versus  le  gain   !   Tester!   Image: photostock / FreeDigitalPhotos.net 37
  • 38. Quelques   MAUVAISES  PRATIQUES   Image: Ambro/ FreeDigitalPhotos.net 38
  • 39. Trop,  c’est  comme  pas  assez…   !   Quand  50%  du  code  est   composé  d’aspects…     !   Est-­‐ce  50%  du  code  est   composé  de   préoccupa2ons   transverses?   Image: farconville / FreeDigitalPhotos.net 39
  • 40. L’AOP  n’est  pas  un  pansement   !   Suis-­‐je  en  train  d’u2liser   l’AOP  pour  corriger  un   problème  de  design?     !   Ne  vous  servez  pas  de   l’AOP  comme  parfum   afin  de  masquer  les   mauvaises  odeurs…   Image: digitalart / FreeDigitalPhotos.net 40
  • 41. Le  «  trip  techno  »   L’AOP  c’est  trop  COOL  !!   La  chute  pourrait  être  douloureuse!   •  «  AspectJ...  WOW  trop  cool  !  »   •  «  On  peut  bidouiller  plein  de  trucs  avec  ça  !  »   •  «  Tsé  le  truc  qu’on  arrivait  pas  à  faire...  on  va  faire  un  aspect  qui  va   changer  ça  puis  qui  va  décider  si…  »     41
  • 42. Quelques   BONNES  PRATIQUES   Image: photostock / FreeDigitalPhotos.net 42
  • 43. OO  encore  d’actualité   Ce  qui  était  vrai  en  OO  l’est  encore  en  AO   43
  • 44. Conseils  de  base  habituels   !   Code  propre   !   Cohésion  dans  l’aspect   !   Couplage  de  l’aspect   44
  • 45. Un  aspect?  Vraiment?   Est-­‐ce  une  préoccupa2on  transverse?     Est-­‐ce  que  je  pourrais  réusiner  mon  design  OO   pour  aWeindre  le  même  objec2f?   45
  • 46. U2liser  l’aspect  comme  «  lien  »   !   Déléguer  à  une  classe  qui  con2ent  la  logique  liée  à  ceWe   préoccupa2on   !   U2liser  l’aspect  pour  2sser  la  logique   !   Note:  Peut  varier  en  fonc2on  du  2sseur  (ex.:  AspectJ)   pointcut inXorY() : execution(* *(..)) X   (classe  cible)   Aspect   && within(X || Y); Persistance   (classe  à  2sser)   after() : inXorY { Y   (classe  cible)   persistance.clearCache(); } 46
  • 47. Dépendances  et  couplage   !   N’oubliez  pas  que   l’aspect  est  couplé  à   toutes  les  classes  où  il   s’injecte*.       *  Où  un  point  de  coupure  apparie   Image: Salvatore Vuono / FreeDigitalPhotos.net 47
  • 48. Limiter  le  couplage   Un  aspect  trop  fortement  couplé  et  ayant  des   dépendances  éloignées  augmente  la  complexité́   et  le  rend  vulnérable  aux  changements.   «  AOSD-­‐Evolu2on  Paradox  »  [1]       [1] Dean Wampler, Aspect-Oriented programming and design for java and AspectJ, 2007. 48 http://polyglotprogramming.com/papers/AOPIntroAndPrinciplesTalk.pdf.
  • 49. Précision  du  point  de  coupure   !   Un  PC  précis  est  plus  à  risque  d’être  impacté  par  un   changement   !   Un  PC  très  générique  risque  d’apparier  trop  de  PJ   !   On  appelle  cela  le  «  Fragile  Pointcut  Problem  »  [1]     pointcut pcPrecis() : execution(void C.doX()); pointcut pcGenerique() : execution(* C.doX*(..)); pointcut pcPourEtreCertainAvoirProbleme : execution(* *(..)); -  Si C.doX() est renommé pour C.doXInContext() … -  Si on ajoute C.doXPasRapportAvecAspect() … [1] C. Koppen et M. Störzer. PCDiff : attacking the fragile pointcut problem. 49 In European Interactive Workshop on Aspects in Software (EIWAS), 2004.
  • 50. Conscience  ou  inconscience?   Est-­‐ce  que  les  classes  2ssées  devraient  avoir   conscience  ou  non  des  aspects?     Débat  ouvert     «  obliviousness  »  vs  «  awareness  »   50
  • 51. Bonnes  pra2ques  de   TESTS  D’ASPECTS   51
  • 52. Tests  de  haut  niveau   Les  aspects  contribuent  aux  fonc2onnalités   globales  du  système     Rien  ne  change  pour  les  tests  de  haut  niveau   (fonc2onnels,  accepta2on,  etc.)   52
  • 54. Tester  unitairement  un  aspect   La  bonne   chose   (advice)   Test   unitaire   Au  bon   d’aspect   moment   (pointcut)   54
  • 55. Technique  du  pot  de  miel    1 Pot  1    UTest     Pot  2   X Aspect     2           3   Pot  N    55
  • 56.                               56
  • 57. Encore  faim?   hWps://joind.in/6005   Téléchargez  les  diaposi2ves  complètes  sur   developpementagile.com   Image: rajcreationzs / FreeDigitalPhotos.ne 57
  • 59. Choisir  son   CADRE  APPLICATIF  (FRAMEWORK)   59
  • 60. Quelques  cadres  pour  Java   ! AspectJ   ! Spring-­‐AOP   ! Guice-­‐AOP   !   …   60
  • 61. AspectJ   !   Le  plus  complet   o  Plusieurs  primi2ves   o  Plusieurs  PJ  possibles   !   Extension  à  Java   o  Requiert  un  compilateur  d’Aspects   o  Ou  de  remplacer  le  chargement  des  classes     (CL  ou  Java  Agent)   61
  • 62. Spring  supporte  deux  2sseurs   Spring   AOP   Spring   AJ   Spring   62
  • 63. Sprint-­‐AOP   !   Java  100%  pur   o  Ne  requiert  pas  de  compilateur  spécial   o  Ne  requiert  pas  de  Java  Agent   o  U2lise  des  «  Proxies  »  dynamiques   !   Limita2ons   o  Tissage  possible  uniquement  dans  des  Beans  Spring   o  Peu  de  primi2ves  et  limitées  (ex.:  exécu2on  de  méthodes)   o  Ne  peut  intercepter  des  appels  à  «  this  »   63
  • 64. Spring-­‐Aj   ! Spring  peut  se  servir  d’aspects  de  Spring  pour  élargir   ses  fonc2onnalités   ! Spring  se  sert  d’AspectJ  pour  lui-­‐même   !   @Configurable  permet  d’injecter  des  dépendances   dans  des  objets  qui  ne  sont  pas  des  Beans   Souvent  une  mauvaise   odeur  concernant  le   Spring   Spring   design…   AspectJ   AJ   FW++   64
  • 65. Syntaxe  ou  2sseur?   Tissage   Syntaxe  (langage)   Spring-­‐AOP  (proxy)   XML   AspectJ   @AspectJ   Spring-­‐AJ   Langage  AJ  (.aj)   65
  • 66. Google  Guice   !   Limita2ons  similaires  à  Spring-­‐AOP  (par  «  proxies  »)   !   Syntaxe  propre   o  Java   o  Pas  de  syntaxe  cachée  dans  les  chaînes  de  caractères  des   annota2ons  (comme  @AspectJ)   66
  • 67. Choisir  son     MODE  DE  TISSAGE   67
  • 68. Deux  grandes  approches  de  2ssage   À  la  compila2on  (CTW)   À  l’exécu2on  (LTW)   68
  • 69. CTW  (Compile-­‐Time  Weaving)   !   Tissage  à  la  compila2on   !   Remplace  généralement  le  compilateur  de  Java   !   Peut  2sser  uniquement  dans  le  code  compilé  (pas   dans  une  lib.  externe)   !   Produit  du  Bytecode  standard  2ssé   69
  • 70. LTW  (Load-­‐Time  Weaving)   !   Tissage  lors  du  chargement  de  la  classe   !   Remplace  (assiste)  le  chargeur  de  classes  de  Java   (ClassLoader)   !   Requiert  généralement  le  démarrage  de  la  JVM  avec   un  JavaAgent   !   Peut  être  probléma2que  avec  des  JEE  Container  ou   entrer  en  conflit  avec  d’autres  instrumenta2ons   70
  • 72. AJDT   !   Plugin  Eclipse  pour  AspectJ   !   Désagrément  sub2le:   o  Force  le  CTW  sur  le  projet  dans  Eclipse  quand  la  nature   «  AspectJ  »  est  ac2vée   !   Offre  de  l’assistance   o  Complé2on  (limitée)   o  Réusinage  (limité)   o  Colora2on  syntaxique  et  validateur   72
  • 73. Maven   !   Plugin  pour  AspectJ   !   Si  combiné  avec  AJDT   o  Compile  avec  AJC  versus  JDT-­‐AJ  pour  Eclipse   o  Toujours  faire  «  mvn  clean  »  pour  éviter  les  problèmes   !   Pour  du  LTW  u2lisez  le  Exec  Mabven  Plugin   (ou  autre)  et  passez  le  JavaAgent   73
  • 74. Spring  +  AJ   !   U2liser  le  Java  Agent  de  Spring  plutôt  que  celui  par   défaut  d’AspectJ   !   AWen2on  à  la  combinaison  Spring-­‐AOP  (proxy)  et   AJDT   74
  • 75. Autres  considéra2ons   ! Maven   o  Il  est  possible  que  les  métriques  soient  comptées  en   double  en  CTW.   o  Ex.:  couverture  des  tests   !   JEE  Container  et  Spring   o  Des  chargeurs  de  classes  spécifiques  sont  disponibles  pour   plusieurs  JEE  Container.   o  Sinon,  il  faut  se  rabaWre  sur  u  Java  Agent  de  la  JVM   75