SlideShare une entreprise Scribd logo
1  sur  27
Télécharger pour lire hors ligne
Traits : de la théorie à la pratique



            Rendez-vous AFUP
            15 décembre 2010
                  Paris
                                 La Cantine




                        Frédéric Hardy
   frederic.hardy@mageekbox.net  http://blog.mageekbox.net  @mageekguy
Traits : de la théorie à la pratique

           À propos du conférencier

●   Frédéric Hardy.
●   35 ans, marié, 3 enfants.
●   Développeur PHP depuis plus de 10 ans.
●   Participe au développement du langage depuis
    plus de 5 ans.
●   Contributeur et développeur de plusieurs
    projets libres.
●   Architecte logiciel chez PMSIpilot à Lyon.
Traits : de la théorie à la pratique

 Déroulement de la conférence
     ●   Prés-requis
     ●   Résumé de la théorie
     ●   Cas pratique
     ●   Performances
     ●   Comment tester un trait ?
     ●   Les inconvénients
     ●   Conclusion
     ●   Questions
Traits : de la théorie à la pratique

                            Pré-requis
    ●   PHP ≥ 5.next
    ●   En attendant la sortie de 5.next, il faut utiliser la
        version de développement de PHP :
#   svn export http://svn.php.net/repository/php/php-src/trunk
#   cd path/to/trunk
#   ./buildconf
#   ./configure
#   make


    ●   Pour installer la version de développement ou
        remplacer la version installée :
# make install
Traits : de la théorie à la pratique

                 Résumé de la théorie

●   Les traits sont :
    –   Une évolution du modèle objet de PHP.
    –   Une alternative à l'héritage multiple et au mixin.
●   Ils permettent d'éviter la duplication de code.
    –   Via le « copier/coller » de méthodes lors de la
        compilation.
●   La résolution des conflits est de la
    responsabilité du développeur.
Traits : de la théorie à la pratique

               Cas pratique
      ●   Atoum
          –   Framework de tests
              unitaires.
          –   Utilise à plein PHP 5.3
               ● Fonctions anonyme.
               ● Fermetures.


          –   Simple et intuitif.
               ● Interface fluide.
               ● Aucune configuration.


               ● Exécution directe.
Traits : de la théorie à la pratique

               Comment tester le code suivant ?
  <?php

  namespace vendorproject;

  class myClass {
     public function readFile($file) {
         $content = file_get_contents($file);

               if ($content === false)      {
                  throw new exception('Unable to read file ' . $file);
               }

               return $content;
        }
  }
  ...
  ?>


Cas pratique
Traits : de la théorie à la pratique

                     Il y a plusieurs solutions

                 ●   Utiliser un système de fichiers :
                     –   réel.
                     –   virtuel.
                 ●   Utiliser un objet :
                     –   Bouchon.
                     –   Adaptateur.



Cas pratique
Traits : de la théorie à la pratique

                    Atoum utilise l'adaptateur

     ●   L'adaptateur est souple :
          –    Les « fonctions » deviennent « programmables ».
          –    Le développeur a le contrôle total.
     ●   L'adaptateur est générique :
          –    Il fonctionne avec toutes les fonctions PHP.
     ●   Il permet de contrôler l'ensemble des fonctions
         PHP sans développement supplémentaire.
     ●   Il est simple à mettre en œuvre.

Cas pratique
Traits : de la théorie à la pratique

                    Le code du test unitaire
  <?php
  ...
  class myClassTest extends atoumtest {
      public function testReadFile() {
         $myClass = new vendorprojectmyclass();
         $myClass->setAdapter($adapter = new atoumadapter());
         $adapter->file_get_contents = false;
         $this->assert
             ->exception(function() use ($myClass, & $file) {
                $myClass->readFile($file = uniqid());
                }
             )
             ->isInstanceOf('runtimeException')
             ->hasMessage('Unable to read file ' . $file)
         ;
      }
  }
  ...
  ?>

Cas pratique
Traits : de la théorie à la pratique

                  Le code de la classe testée
  <?php
  ...
  class myClass {
      public function setAdapter(atoumadapter $adapter) {
         $this->adapter = $adapter;
         return $this;
      }

        public function getAdapter() {
           return $adapter;
        }

        public function readFile($file) {
           $content = $this->adapter->file_get_contents($file);
           ...
        }
  }
  ...
  ?>

Cas pratique
Traits : de la théorie à la pratique

         Les conséquences sur le modèle objet

     ●   Il est impossible de prédire les classes qui
         devront recourir à l'adaptateur.
     ●   Il faut donc dupliquer au besoin dans les
         classes qui utilise l'adaptateur le code des
         méthodes :
          –    setAdapter(atoumadapter $adapter).
          –    GetAdapter().



Cas pratique
Traits : de la théorie à la pratique

     Et si on tirait un trait sur la duplication ?


           ●   Via la définition d'un trait « adapter ».
               –   Injectable en fonction des besoins.
                    ●   Il n'y a plus de duplication de code.
                         –   La maintenance est simplifiée.
                         –   Les possibilités d'évolution sont augmentées.




Cas pratique
Traits : de la théorie à la pratique

                         Définition du trait
  <?php

  namespace mageekguyatoumtraits;

  use mageekguyatoum;

  trait adapter {
     public function setAdapter(atoumadapter $adapter) {
         $this->adapter = $adapter;
         return $this;
     }

       public function getAdapter() {
          return $this->adapter;
       }
  }

  ?>


Cas pratique
Traits : de la théorie à la pratique

                       Utilisation du trait
     ●   Suppression dans les classes concernées de
          –    setAdapter().
          –    getAdapter().
     ●   Utilisation du trait dans les classes concernées.
  <?php
  ...
  abstract class test implements observable, countable
  {
      use atoumtraitsadapter;
      ...
  }
  ...
  ?>

Cas pratique
Traits : de la théorie à la pratique

                        Quelques remarques
    ●   Un trait est considéré comme une classe.
         –     L' « autoloading » est donc activé si un trait n'est
               pas défini lorsqu'il est appelé.
    ●   Les traits sont compatibles avec les espaces de
        noms.
    ●   L'appel à un trait via use peut se faire à
        l'endroit de son choix dans une classe.
    ●   Un trait ne peut hériter d'un autre trait.
    ●   Une classe ne peut hériter d'un trait.
Cas pratique
Traits : de la théorie à la pratique

                          Performances

      ●   Sans trait :
  >   Total tests duration: 2.17 seconds.
  >   Total tests memory usage: 25.75 Mb.
  >   Running duration: 10.87 seconds.
  >   Success (63 tests, 264 methods, 3980 assertions) !

      ●   Avec trait :
  >   Total tests duration: 2.15 seconds.
  >   Total tests memory usage: 28.25 Mb.
  >   Running duration: 11.00 seconds.
  >   Success (63 tests, 264 methods, 3980 assertions) !




Cas pratique
Traits : de la théorie à la pratique

                Comment tester un trait ?

●   Un trait ne peut être instancié, il n'est donc pas
    testable par lui-même.
●   Il doit être injecté dans un classe.
    –   Il est donc testable par transitivité.
         ●   Tout comme les méthodes privées et protégées.
●   Le support d'un trait par un classe peut être
    testé à l'aide de l'API d'introspection de PHP.
Traits : de la théorie à la pratique

              Les traits et l'API d'introspection


     ●   reflectionClass::isTrait().
     ●   reflectionClass::getTraits().
     ●   reflectionClass::getTraitNames().
     ●   reflectionClass::getTraitAliases().




Comment tester un trait ?
Traits : de la théorie à la pratique

                            Exemple d'utilisation
   # vi path/to/reflection.php

   <?php

   $class = new reflectionClass('mageekguyatoumtest');

   $traits = $class->getTraits();

   var_dump($traits);

   foreach ($traits as $trait) {
      var_dump($trait->getMethods());
   }

   ?>




Comment tester un trait ?
Traits : de la théorie à la pratique

                            Résultat de l'exemple
   # path/to/php5.4 path/to/reflection.php
   array(1) {
     ["mageekguyatoumtraitsadapter"]=>
     &object(ReflectionClass)#57 (1) {
       ["name"]=>
       string(30) "mageekguyatoumtraitsadapter"
     }
   }
   array(2) {
     [0]=>
     &object(ReflectionMethod)#56 (2) {
       ["name"]=>
       string(10) "setAdapter"
       ["class"]=>
       string(30) "mageekguyatoumtraitsadapter"
     }
     ...
   }


Comment tester un trait ?
Traits : de la théorie à la pratique

                      Tester un trait avec Atoum
   <?php
   ...
   class test extends atoumtest {
       public function testClass() {
          $this->assert
              ->class($this->getTestedClassName())
                 ->useTrait('mageekguyatoumtraitsadapter')
              ->trait('mageekguyatoumtraitsadapter')
                 ->hasMethod('setAdapter')
                 ->hasMethod('getAdapter')
          ;
       }
       public function testSetAdapter() {...}
       public function testGetAdapter() {...}
   }
   ...
   ?>



Comment tester un trait ?
Traits : de la théorie à la pratique

               Les inconvénients

●   Les traits augmentent l'empreinte mémoire.
●   L'intégration dans les IDE n'est pas encore
    effective.
●   La relecture du code est plus « laborieuse ».
●   Ils ne sont disponibles qu'à partir de PHP ≥ 5.4
    alors que PHP 5.3 n'est pas encore
    démocratisé.
Traits : de la théorie à la pratique

                          Conclusion
●   Les traits sont une évolution du modèle objet de PHP :
    –   Qui permet de supprimer la duplication de code
    –   Via un mécanisme de « copier/coller » à la compilation
    –   Sous le contrôle du développeur
    –   Simple à mettre en œuvre
    –   Testable via l'instrospection
    –   Mais consommatrice de mémoire
    –   Et qui n'est pas supporté par les IDE.
    –   Ce qui peut compliquer l'audit du code.
    –   Et qui n'est pas encore officiellement disponible.
Traits : de la théorie à la pratique




           Questions ?




                                       25
Traits : de la théorie à la pratique

                           Références
●   http://wiki.php.net/rfc/horizontalreuse
●   http://9elements.com/io/?p=28
●   http://blog.mageekbox.net/?post/2010/05/17/Et-si-on-tirait-des-traits




                                                                            26
Traits : de la théorie à la pratique

                          Remerciements

 ●   Merci à Stephan Marr, pour avoir implémenté
     les traits dans PHP.
 ●   Merci à l'AFUP pour son invitation.
 ●   Merci à PMSIpilot de m'avoir permis de faire
     cette conférence.

Cette conférence est maintenant terminée, vous pouvez reprendre une activité normale.


 frederic.hardy@mageekbox.net  http://blog.mageekbox.net  @mageekguy
                                                                                    27

Contenu connexe

Tendances

JAVA-UIK-CHAP6-POO HERITAGE JAVA
JAVA-UIK-CHAP6-POO HERITAGE JAVAJAVA-UIK-CHAP6-POO HERITAGE JAVA
JAVA-UIK-CHAP6-POO HERITAGE JAVAAymen Bedwivski
 
Programmation orientee aspect 201401 - Ensim
Programmation orientee aspect 201401 - EnsimProgrammation orientee aspect 201401 - Ensim
Programmation orientee aspect 201401 - EnsimLaurent Broudoux
 
Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8Jean-Michel Doudoux
 
Introduction à la programmation fonctionnelle
Introduction à la programmation fonctionnelle Introduction à la programmation fonctionnelle
Introduction à la programmation fonctionnelle Marine Karam
 
PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...
PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...
PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...Cyrille Grandval
 
Java 8 - interfaces
Java 8 - interfacesJava 8 - interfaces
Java 8 - interfacesFranck SIMON
 
Cpp2 : classes et objets
Cpp2 : classes et objetsCpp2 : classes et objets
Cpp2 : classes et objetsAbdoulaye Dieng
 
Conférence sur les annotations Java par Olivier Croisier (Zenika) au Paris JUG
Conférence sur les annotations Java par Olivier Croisier (Zenika) au Paris JUGConférence sur les annotations Java par Olivier Croisier (Zenika) au Paris JUG
Conférence sur les annotations Java par Olivier Croisier (Zenika) au Paris JUGZenika
 
Objets patterns et genie logiciel , par Julien Pauli
Objets patterns et genie logiciel , par Julien PauliObjets patterns et genie logiciel , par Julien Pauli
Objets patterns et genie logiciel , par Julien PauliALTER WAY
 
c# programmation orientée objet (Classe & Objet)
c# programmation orientée objet (Classe & Objet)c# programmation orientée objet (Classe & Objet)
c# programmation orientée objet (Classe & Objet)Mahfoud EL HOUDAIGUI
 
AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPjulien pauli
 
Annotations Java par Olivier Croisier
Annotations Java par Olivier CroisierAnnotations Java par Olivier Croisier
Annotations Java par Olivier CroisierNormandy JUG
 
Héritage et polymorphisme- Jihen HEDHLI
Héritage et polymorphisme- Jihen HEDHLIHéritage et polymorphisme- Jihen HEDHLI
Héritage et polymorphisme- Jihen HEDHLIJihenHedhli1
 
Javascript pour les Développeurs WEB
Javascript pour les Développeurs WEBJavascript pour les Développeurs WEB
Javascript pour les Développeurs WEBAbbes Rharrab
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Loic Yon
 

Tendances (20)

JAVA-UIK-CHAP6-POO HERITAGE JAVA
JAVA-UIK-CHAP6-POO HERITAGE JAVAJAVA-UIK-CHAP6-POO HERITAGE JAVA
JAVA-UIK-CHAP6-POO HERITAGE JAVA
 
Programmation orientee aspect 201401 - Ensim
Programmation orientee aspect 201401 - EnsimProgrammation orientee aspect 201401 - Ensim
Programmation orientee aspect 201401 - Ensim
 
Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8
 
La programmation fonctionnelle en javascript / PF
La programmation fonctionnelle en javascript / PFLa programmation fonctionnelle en javascript / PF
La programmation fonctionnelle en javascript / PF
 
Introduction à la programmation fonctionnelle
Introduction à la programmation fonctionnelle Introduction à la programmation fonctionnelle
Introduction à la programmation fonctionnelle
 
PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...
PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...
PHPTour Lyon 2014 - Conférence - Tests unitaires Je veux mes 80% de couvertur...
 
Java 8 - interfaces
Java 8 - interfacesJava 8 - interfaces
Java 8 - interfaces
 
Cpp2 : classes et objets
Cpp2 : classes et objetsCpp2 : classes et objets
Cpp2 : classes et objets
 
Conférence sur les annotations Java par Olivier Croisier (Zenika) au Paris JUG
Conférence sur les annotations Java par Olivier Croisier (Zenika) au Paris JUGConférence sur les annotations Java par Olivier Croisier (Zenika) au Paris JUG
Conférence sur les annotations Java par Olivier Croisier (Zenika) au Paris JUG
 
Objets patterns et genie logiciel , par Julien Pauli
Objets patterns et genie logiciel , par Julien PauliObjets patterns et genie logiciel , par Julien Pauli
Objets patterns et genie logiciel , par Julien Pauli
 
Java 8 - lambda
Java 8 - lambdaJava 8 - lambda
Java 8 - lambda
 
c# programmation orientée objet (Classe & Objet)
c# programmation orientée objet (Classe & Objet)c# programmation orientée objet (Classe & Objet)
c# programmation orientée objet (Classe & Objet)
 
AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHP
 
Annotations Java par Olivier Croisier
Annotations Java par Olivier CroisierAnnotations Java par Olivier Croisier
Annotations Java par Olivier Croisier
 
Héritage et polymorphisme- Jihen HEDHLI
Héritage et polymorphisme- Jihen HEDHLIHéritage et polymorphisme- Jihen HEDHLI
Héritage et polymorphisme- Jihen HEDHLI
 
Javascript pour les Développeurs WEB
Javascript pour les Développeurs WEBJavascript pour les Développeurs WEB
Javascript pour les Développeurs WEB
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
 
Django by mrjmad
Django by mrjmadDjango by mrjmad
Django by mrjmad
 
POO
POOPOO
POO
 
Qualité de code et bonnes pratiques
Qualité de code et bonnes pratiquesQualité de code et bonnes pratiques
Qualité de code et bonnes pratiques
 

Similaire à Traits : de la théorie à la pratique

Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...fdussert
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introductionneuros
 
Automatisation des tests - objectifs et concepts - partie 2
Automatisation des tests  - objectifs et concepts - partie 2Automatisation des tests  - objectifs et concepts - partie 2
Automatisation des tests - objectifs et concepts - partie 2Christophe Rochefolle
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !Paris Salesforce Developer Group
 
DrupalCamp Paris 2013 - Theming
DrupalCamp Paris 2013 - ThemingDrupalCamp Paris 2013 - Theming
DrupalCamp Paris 2013 - ThemingRomain Jarraud
 
Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Ippon
 
Améliorer la qualité du code par restriction du langage
Améliorer la qualité du code par restriction du langageAméliorer la qualité du code par restriction du langage
Améliorer la qualité du code par restriction du langagemercury_wood
 
Tester les applications Zend Framework
Tester les applications Zend FrameworkTester les applications Zend Framework
Tester les applications Zend FrameworkMickael Perraud
 
Effectuer des tests modernes pour drupal
Effectuer des tests modernes pour drupalEffectuer des tests modernes pour drupal
Effectuer des tests modernes pour drupalneuros
 
Effectuer des tests modernes pour drupal
Effectuer des tests modernes pour drupalEffectuer des tests modernes pour drupal
Effectuer des tests modernes pour drupalChristophe Villeneuve
 
Java uik-chap6-poo heritage v2 java
Java uik-chap6-poo heritage v2 javaJava uik-chap6-poo heritage v2 java
Java uik-chap6-poo heritage v2 javaAmel Morchdi
 
Human Talks Jasmine
Human Talks JasmineHuman Talks Jasmine
Human Talks Jasminemanudwarf
 
Cocoaheads Paris Nombembre Test unitaires
Cocoaheads Paris Nombembre Test unitairesCocoaheads Paris Nombembre Test unitaires
Cocoaheads Paris Nombembre Test unitairesCocoaHeads France
 
Introduction à l’orienté objet en Python
Introduction à l’orienté objet en PythonIntroduction à l’orienté objet en Python
Introduction à l’orienté objet en PythonAbdoulaye Dieng
 

Similaire à Traits : de la théorie à la pratique (20)

Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
 
Des tests modernes pour Drupal
Des tests modernes pour DrupalDes tests modernes pour Drupal
Des tests modernes pour Drupal
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introduction
 
Pensez objets avec java
Pensez objets avec javaPensez objets avec java
Pensez objets avec java
 
Automatisation des tests - objectifs et concepts - partie 2
Automatisation des tests  - objectifs et concepts - partie 2Automatisation des tests  - objectifs et concepts - partie 2
Automatisation des tests - objectifs et concepts - partie 2
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
 
DrupalCamp Paris 2013 - Theming
DrupalCamp Paris 2013 - ThemingDrupalCamp Paris 2013 - Theming
DrupalCamp Paris 2013 - Theming
 
Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon
 
Tour d'horizon des tests
Tour d'horizon des testsTour d'horizon des tests
Tour d'horizon des tests
 
Améliorer la qualité du code par restriction du langage
Améliorer la qualité du code par restriction du langageAméliorer la qualité du code par restriction du langage
Améliorer la qualité du code par restriction du langage
 
PHP 5 et la programmation objet
PHP 5 et la programmation objetPHP 5 et la programmation objet
PHP 5 et la programmation objet
 
Tester les applications Zend Framework
Tester les applications Zend FrameworkTester les applications Zend Framework
Tester les applications Zend Framework
 
Effectuer des tests modernes pour drupal
Effectuer des tests modernes pour drupalEffectuer des tests modernes pour drupal
Effectuer des tests modernes pour drupal
 
Effectuer des tests modernes pour drupal
Effectuer des tests modernes pour drupalEffectuer des tests modernes pour drupal
Effectuer des tests modernes pour drupal
 
Java uik-chap6-poo heritage v2 java
Java uik-chap6-poo heritage v2 javaJava uik-chap6-poo heritage v2 java
Java uik-chap6-poo heritage v2 java
 
Human Talks Jasmine
Human Talks JasmineHuman Talks Jasmine
Human Talks Jasmine
 
Flex Unit Testing
Flex Unit TestingFlex Unit Testing
Flex Unit Testing
 
Programmation Java
Programmation JavaProgrammation Java
Programmation Java
 
Cocoaheads Paris Nombembre Test unitaires
Cocoaheads Paris Nombembre Test unitairesCocoaheads Paris Nombembre Test unitaires
Cocoaheads Paris Nombembre Test unitaires
 
Introduction à l’orienté objet en Python
Introduction à l’orienté objet en PythonIntroduction à l’orienté objet en Python
Introduction à l’orienté objet en Python
 

Plus de Frederic Hardy

Comment tester des services web ?
Comment tester des services web ?Comment tester des services web ?
Comment tester des services web ?Frederic Hardy
 
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Frederic Hardy
 
PHP : retour vers le futur !
PHP : retour vers le futur !PHP : retour vers le futur !
PHP : retour vers le futur !Frederic Hardy
 
VIM puissance PHP = VI Improved !
VIM puissance PHP = VI Improved !VIM puissance PHP = VI Improved !
VIM puissance PHP = VI Improved !Frederic Hardy
 

Plus de Frederic Hardy (11)

Comment tester des services web ?
Comment tester des services web ?Comment tester des services web ?
Comment tester des services web ?
 
TDD avec atoum
TDD avec atoumTDD avec atoum
TDD avec atoum
 
TDD avec atoum
TDD avec atoumTDD avec atoum
TDD avec atoum
 
Anatomie du test
Anatomie du testAnatomie du test
Anatomie du test
 
Atoum
AtoumAtoum
Atoum
 
Plein PHAR !
Plein PHAR !Plein PHAR !
Plein PHAR !
 
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
 
Plein phar !
Plein phar !Plein phar !
Plein phar !
 
Plein phar
Plein pharPlein phar
Plein phar
 
PHP : retour vers le futur !
PHP : retour vers le futur !PHP : retour vers le futur !
PHP : retour vers le futur !
 
VIM puissance PHP = VI Improved !
VIM puissance PHP = VI Improved !VIM puissance PHP = VI Improved !
VIM puissance PHP = VI Improved !
 

Traits : de la théorie à la pratique

  • 1. Traits : de la théorie à la pratique Rendez-vous AFUP 15 décembre 2010 Paris La Cantine Frédéric Hardy frederic.hardy@mageekbox.net http://blog.mageekbox.net @mageekguy
  • 2. Traits : de la théorie à la pratique À propos du conférencier ● Frédéric Hardy. ● 35 ans, marié, 3 enfants. ● Développeur PHP depuis plus de 10 ans. ● Participe au développement du langage depuis plus de 5 ans. ● Contributeur et développeur de plusieurs projets libres. ● Architecte logiciel chez PMSIpilot à Lyon.
  • 3. Traits : de la théorie à la pratique Déroulement de la conférence ● Prés-requis ● Résumé de la théorie ● Cas pratique ● Performances ● Comment tester un trait ? ● Les inconvénients ● Conclusion ● Questions
  • 4. Traits : de la théorie à la pratique Pré-requis ● PHP ≥ 5.next ● En attendant la sortie de 5.next, il faut utiliser la version de développement de PHP : # svn export http://svn.php.net/repository/php/php-src/trunk # cd path/to/trunk # ./buildconf # ./configure # make ● Pour installer la version de développement ou remplacer la version installée : # make install
  • 5. Traits : de la théorie à la pratique Résumé de la théorie ● Les traits sont : – Une évolution du modèle objet de PHP. – Une alternative à l'héritage multiple et au mixin. ● Ils permettent d'éviter la duplication de code. – Via le « copier/coller » de méthodes lors de la compilation. ● La résolution des conflits est de la responsabilité du développeur.
  • 6. Traits : de la théorie à la pratique Cas pratique ● Atoum – Framework de tests unitaires. – Utilise à plein PHP 5.3 ● Fonctions anonyme. ● Fermetures. – Simple et intuitif. ● Interface fluide. ● Aucune configuration. ● Exécution directe.
  • 7. Traits : de la théorie à la pratique Comment tester le code suivant ? <?php namespace vendorproject; class myClass { public function readFile($file) { $content = file_get_contents($file); if ($content === false) { throw new exception('Unable to read file ' . $file); } return $content; } } ... ?> Cas pratique
  • 8. Traits : de la théorie à la pratique Il y a plusieurs solutions ● Utiliser un système de fichiers : – réel. – virtuel. ● Utiliser un objet : – Bouchon. – Adaptateur. Cas pratique
  • 9. Traits : de la théorie à la pratique Atoum utilise l'adaptateur ● L'adaptateur est souple : – Les « fonctions » deviennent « programmables ». – Le développeur a le contrôle total. ● L'adaptateur est générique : – Il fonctionne avec toutes les fonctions PHP. ● Il permet de contrôler l'ensemble des fonctions PHP sans développement supplémentaire. ● Il est simple à mettre en œuvre. Cas pratique
  • 10. Traits : de la théorie à la pratique Le code du test unitaire <?php ... class myClassTest extends atoumtest { public function testReadFile() { $myClass = new vendorprojectmyclass(); $myClass->setAdapter($adapter = new atoumadapter()); $adapter->file_get_contents = false; $this->assert ->exception(function() use ($myClass, & $file) { $myClass->readFile($file = uniqid()); } ) ->isInstanceOf('runtimeException') ->hasMessage('Unable to read file ' . $file) ; } } ... ?> Cas pratique
  • 11. Traits : de la théorie à la pratique Le code de la classe testée <?php ... class myClass { public function setAdapter(atoumadapter $adapter) { $this->adapter = $adapter; return $this; } public function getAdapter() { return $adapter; } public function readFile($file) { $content = $this->adapter->file_get_contents($file); ... } } ... ?> Cas pratique
  • 12. Traits : de la théorie à la pratique Les conséquences sur le modèle objet ● Il est impossible de prédire les classes qui devront recourir à l'adaptateur. ● Il faut donc dupliquer au besoin dans les classes qui utilise l'adaptateur le code des méthodes : – setAdapter(atoumadapter $adapter). – GetAdapter(). Cas pratique
  • 13. Traits : de la théorie à la pratique Et si on tirait un trait sur la duplication ? ● Via la définition d'un trait « adapter ». – Injectable en fonction des besoins. ● Il n'y a plus de duplication de code. – La maintenance est simplifiée. – Les possibilités d'évolution sont augmentées. Cas pratique
  • 14. Traits : de la théorie à la pratique Définition du trait <?php namespace mageekguyatoumtraits; use mageekguyatoum; trait adapter { public function setAdapter(atoumadapter $adapter) { $this->adapter = $adapter; return $this; } public function getAdapter() { return $this->adapter; } } ?> Cas pratique
  • 15. Traits : de la théorie à la pratique Utilisation du trait ● Suppression dans les classes concernées de – setAdapter(). – getAdapter(). ● Utilisation du trait dans les classes concernées. <?php ... abstract class test implements observable, countable { use atoumtraitsadapter; ... } ... ?> Cas pratique
  • 16. Traits : de la théorie à la pratique Quelques remarques ● Un trait est considéré comme une classe. – L' « autoloading » est donc activé si un trait n'est pas défini lorsqu'il est appelé. ● Les traits sont compatibles avec les espaces de noms. ● L'appel à un trait via use peut se faire à l'endroit de son choix dans une classe. ● Un trait ne peut hériter d'un autre trait. ● Une classe ne peut hériter d'un trait. Cas pratique
  • 17. Traits : de la théorie à la pratique Performances ● Sans trait : > Total tests duration: 2.17 seconds. > Total tests memory usage: 25.75 Mb. > Running duration: 10.87 seconds. > Success (63 tests, 264 methods, 3980 assertions) ! ● Avec trait : > Total tests duration: 2.15 seconds. > Total tests memory usage: 28.25 Mb. > Running duration: 11.00 seconds. > Success (63 tests, 264 methods, 3980 assertions) ! Cas pratique
  • 18. Traits : de la théorie à la pratique Comment tester un trait ? ● Un trait ne peut être instancié, il n'est donc pas testable par lui-même. ● Il doit être injecté dans un classe. – Il est donc testable par transitivité. ● Tout comme les méthodes privées et protégées. ● Le support d'un trait par un classe peut être testé à l'aide de l'API d'introspection de PHP.
  • 19. Traits : de la théorie à la pratique Les traits et l'API d'introspection ● reflectionClass::isTrait(). ● reflectionClass::getTraits(). ● reflectionClass::getTraitNames(). ● reflectionClass::getTraitAliases(). Comment tester un trait ?
  • 20. Traits : de la théorie à la pratique Exemple d'utilisation # vi path/to/reflection.php <?php $class = new reflectionClass('mageekguyatoumtest'); $traits = $class->getTraits(); var_dump($traits); foreach ($traits as $trait) { var_dump($trait->getMethods()); } ?> Comment tester un trait ?
  • 21. Traits : de la théorie à la pratique Résultat de l'exemple # path/to/php5.4 path/to/reflection.php array(1) { ["mageekguyatoumtraitsadapter"]=> &object(ReflectionClass)#57 (1) { ["name"]=> string(30) "mageekguyatoumtraitsadapter" } } array(2) { [0]=> &object(ReflectionMethod)#56 (2) { ["name"]=> string(10) "setAdapter" ["class"]=> string(30) "mageekguyatoumtraitsadapter" } ... } Comment tester un trait ?
  • 22. Traits : de la théorie à la pratique Tester un trait avec Atoum <?php ... class test extends atoumtest { public function testClass() { $this->assert ->class($this->getTestedClassName()) ->useTrait('mageekguyatoumtraitsadapter') ->trait('mageekguyatoumtraitsadapter') ->hasMethod('setAdapter') ->hasMethod('getAdapter') ; } public function testSetAdapter() {...} public function testGetAdapter() {...} } ... ?> Comment tester un trait ?
  • 23. Traits : de la théorie à la pratique Les inconvénients ● Les traits augmentent l'empreinte mémoire. ● L'intégration dans les IDE n'est pas encore effective. ● La relecture du code est plus « laborieuse ». ● Ils ne sont disponibles qu'à partir de PHP ≥ 5.4 alors que PHP 5.3 n'est pas encore démocratisé.
  • 24. Traits : de la théorie à la pratique Conclusion ● Les traits sont une évolution du modèle objet de PHP : – Qui permet de supprimer la duplication de code – Via un mécanisme de « copier/coller » à la compilation – Sous le contrôle du développeur – Simple à mettre en œuvre – Testable via l'instrospection – Mais consommatrice de mémoire – Et qui n'est pas supporté par les IDE. – Ce qui peut compliquer l'audit du code. – Et qui n'est pas encore officiellement disponible.
  • 25. Traits : de la théorie à la pratique Questions ? 25
  • 26. Traits : de la théorie à la pratique Références ● http://wiki.php.net/rfc/horizontalreuse ● http://9elements.com/io/?p=28 ● http://blog.mageekbox.net/?post/2010/05/17/Et-si-on-tirait-des-traits 26
  • 27. Traits : de la théorie à la pratique Remerciements ● Merci à Stephan Marr, pour avoir implémenté les traits dans PHP. ● Merci à l'AFUP pour son invitation. ● Merci à PMSIpilot de m'avoir permis de faire cette conférence. Cette conférence est maintenant terminée, vous pouvez reprendre une activité normale. frederic.hardy@mageekbox.net http://blog.mageekbox.net @mageekguy 27