SlideShare une entreprise Scribd logo
1  sur  22
Télécharger pour lire hors ligne
Les bonnes pratiques

    de l'architecture en général




Geoffrey Bachelet (@ubermuda)
IL N’Y A PAS DE FORMULE
MAGIQUE, les conseils suivants
ne sont pas à prendre à la lettre,
  et rien ne dispense jamais de
 réfléchir avant d’architecturer
          quelque chose.
Instancier les objets le plus tôt possible

  (+) Meilleur contrôle de l'instanciation (passage de
  paramètres)
  (+) Meilleur contrôle de l'injection
  (+) Moins de magie (pas d'inflection)
  (+) Moins de code (= moins de bugs !)
  Exemple:
      pas bien: $obj->addFoo('fooObject');
      bien: $obj->addFoo(new fooObject());
  Factory / Proxy
      $obj->setFooFactory(new fooFactory());
Utiliser des factory ou des proxy

  Retarder l'instanciation des "vrais" objets jusqu'à ce que ce
  soit nécessaire
  (+) Permet d'éviter de flinguer l'interface d'un objet parce
  qu'on à pas les bonnes données au bon moment
      exemple: injectors
  (-) Plus de code (= plus de bugs)
      (+) mais c'est facile à tester unitairement
  (-) Moins facile de retrouver les utilisations d'un objet dans
  le codebase
Éviter les $this->getFoobar()

  Préferrer le passage d'argument
  Dans les méthodes privées surtout
  (+) Moins d'interactions avec l'environnement = moins
  d'effets de bord
  (+) Plus facile à tester
  (+) Signature plus explicite
  (-) Signature qui tend vers l'illisible
  (-) risque de mélange arguments / accès internes
       moins de lisibilité
Éviter les $this->getFoobar()

exemple: baseSimulation

Interface publique: baseSimulation#getTables()
    Pas d'arguments
    Accès internes
    Facile à utiliser
Toutes les méthodes privées
    Passage d'arguments
La composition, ça existe

  Souvent une bonne alternative à l'héritage
  (+) Permet la réutilisation horizontale
  (+) Permet la "Separation of concerns"
Composition vs Héritage

<?php

class Voiture {}

class VoitureElectrique extends Voiture {}

class VoitureAEssence extends Voiture {}

class VoitureElectriqueVitresElectriques extends
VoitureElectrique {}

class VoitureAEssenceVitresElectriques extends VoitureAEssence {}

// wtf ?
Composition vs Héritage

<?php

class Voiture
{
  public function __construct($moteur, $vitres) { }
}

new Voiture(new MoteurElectrique(), new VitresElectriques());

new Voiture(new MoteurAEssence(), new VitresElectriques());

// o/
Comment savoir ?

  Une poire est un fruit
      class Pear extends Fruit { }
Une voiture a un moteur
      new Voiture(new Moteur());
Limiter les méthodes des interfaces

  "Separation of concerns": une tâche, un objet
  (+) Interfaces plus facile à comprendre
  (+) Plus facile à réutiliser
  (+) Plus facile à maintenir
  (+) Plus facile à tester
Méthodes atomiques

 (+) Plus facile à tester
 (+) Plus facile à surcharger
 (+) Plus facile à comprendre
 (+) Plus facile à maintenir
Faciliter le testing

  Le testing est le premier cas de réutilisation d'un objet
      ergo, pas testable = pas réutilisable
  (+) Un objet intestable est (souvent) un objet mal foutu
  (-) Ne pas tomber dans le travers de "coder pour le test
  unitaire"
Design only what you need

  Si y'en a pas besoin, on le fait pas
      ControleInfosRssCollectionFromObjects
  (+) Moins de code
Éviter de retourner du "mixed"

  "Principle of least astonishment"
      exemple: retourner null au lieu d'un array vide
  Desfois c'est logique
      exemple: null|Object doSelectOne()
Nommer ses variables correctement

  exemple (réels): $a, $soyons_cool, $onsenfiche
  En cas de doute: demandez à un collègue
Appliquer la loi de Demeter

http://en.wikipedia.org/wiki/Law_of_Demeter

Pas bien:
public function doBlah()
{
  $this->getFoobar()->getQuux()->doBlah();
}


Bien:
public function doBlah(Quux $quux)
{
  $quux->doBlah();
}
Plus globalement: be SOLID

http://en.wikipedia.org/wiki/Solid_(object-oriented_design)
    Single responsibility principle
      the notion that an object should have only a single responsibility.

   Open/closed principle
      the notion that “software entities … should be open for extension, but closed for modification”.

   Liskov substitution principle
      the notion that “objects in a program should be replaceable with instances of their subtypes without altering the
      correctness of that program”.

   Interface segregation principle
      the notion that “many client specific interfaces are better than one general purpose interface.”

   Dependency inversion principle
      the notion that one should “Depend upon Abstractions. Do not depend upon concretions.”
Apprenez l'anglais !

    c'est important.
Documentez-vous

 Beaucoup de problèmes ont déjà été résolus (Design
 Patterns)
 Beaucoup de concepts ont déjà été discutés
Nous sommes une équipe

 Deux cerveaux valent mieux qu'un
 Deux mémoires valent mieux qu'une
PMSIpilot recrute !

       wait...

Contenu connexe

Tendances

Uniform Variable Syntax
Uniform Variable SyntaxUniform Variable Syntax
Uniform Variable SyntaxDarkmira
 
Modèle de domaine riche dans une application métier complexe un exemple pratique
Modèle de domaine riche dans une application métier complexe un exemple pratiqueModèle de domaine riche dans une application métier complexe un exemple pratique
Modèle de domaine riche dans une application métier complexe un exemple pratiqueVladyslav Riabchenko
 
Null Coalescing Operator
Null Coalescing OperatorNull Coalescing Operator
Null Coalescing OperatorDarkmira
 
Php 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVCPhp 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVCPierre Faure
 
Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchronesAbdoulaye Dieng
 
[FR] Injection de dépendances, Containers & PHP-DI
[FR] Injection de dépendances, Containers & PHP-DI[FR] Injection de dépendances, Containers & PHP-DI
[FR] Injection de dépendances, Containers & PHP-DImatthieunapoli
 
Coffee script
Coffee scriptCoffee script
Coffee scriptantho1404
 
Php mysql cours
Php mysql coursPhp mysql cours
Php mysql courszan
 
Python For Data Science - French Course
Python For Data Science - French CoursePython For Data Science - French Course
Python For Data Science - French CourseHaytam EL YOUSSFI
 
Ajax (Asynchronous JavaScript and XML)
Ajax (Asynchronous JavaScript and XML)Ajax (Asynchronous JavaScript and XML)
Ajax (Asynchronous JavaScript and XML)Abdelouahed Abdou
 
.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHPAbdoulaye Dieng
 
Mix it 2011 - Clojure
Mix it 2011 - ClojureMix it 2011 - Clojure
Mix it 2011 - Clojurelolopetit
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScriptAbdoulaye Dieng
 

Tendances (18)

Uniform Variable Syntax
Uniform Variable SyntaxUniform Variable Syntax
Uniform Variable Syntax
 
Introduction au Jquery
Introduction au JqueryIntroduction au Jquery
Introduction au Jquery
 
Modèle de domaine riche dans une application métier complexe un exemple pratique
Modèle de domaine riche dans une application métier complexe un exemple pratiqueModèle de domaine riche dans une application métier complexe un exemple pratique
Modèle de domaine riche dans une application métier complexe un exemple pratique
 
Null Coalescing Operator
Null Coalescing OperatorNull Coalescing Operator
Null Coalescing Operator
 
Playing With PHP 5.3
Playing With PHP 5.3Playing With PHP 5.3
Playing With PHP 5.3
 
mix-it 2011
mix-it 2011mix-it 2011
mix-it 2011
 
Php 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVCPhp 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVC
 
Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchrones
 
Introduction à jQuery
Introduction à jQueryIntroduction à jQuery
Introduction à jQuery
 
[FR] Injection de dépendances, Containers & PHP-DI
[FR] Injection de dépendances, Containers & PHP-DI[FR] Injection de dépendances, Containers & PHP-DI
[FR] Injection de dépendances, Containers & PHP-DI
 
Coffee script
Coffee scriptCoffee script
Coffee script
 
Php mysql cours
Php mysql coursPhp mysql cours
Php mysql cours
 
Python For Data Science - French Course
Python For Data Science - French CoursePython For Data Science - French Course
Python For Data Science - French Course
 
Ajax (Asynchronous JavaScript and XML)
Ajax (Asynchronous JavaScript and XML)Ajax (Asynchronous JavaScript and XML)
Ajax (Asynchronous JavaScript and XML)
 
.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP
 
Mix it 2011 - Clojure
Mix it 2011 - ClojureMix it 2011 - Clojure
Mix it 2011 - Clojure
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
Tp-jquery
Tp-jqueryTp-jquery
Tp-jquery
 

Similaire à Les bonnes pratiques de l'architecture en général

Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHPjulien pauli
 
Comment écrire du code testable ?
Comment écrire du code testable ?Comment écrire du code testable ?
Comment écrire du code testable ?Fou Cha
 
Design poo togo_jug_final
Design poo togo_jug_finalDesign poo togo_jug_final
Design poo togo_jug_finalDuchess France
 
Design poo togo_jug_final
Design poo togo_jug_finalDesign poo togo_jug_final
Design poo togo_jug_finalagnes_crepet
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonyVincent Composieux
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
SOLID : les principes à l’origine du succès de Symfony et de vos applications
SOLID : les principes à l’origine du succès de Symfony et de vos applicationsSOLID : les principes à l’origine du succès de Symfony et de vos applications
SOLID : les principes à l’origine du succès de Symfony et de vos applicationsVladyslav Riabchenko
 
Meet up symfony 11 octobre 2016 - Les formulaire
Meet up symfony 11 octobre 2016 - Les formulaireMeet up symfony 11 octobre 2016 - Les formulaire
Meet up symfony 11 octobre 2016 - Les formulaireJulien Vinber
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans DrupalAdyax
 
Void-safe en Eiffel
Void-safe en EiffelVoid-safe en Eiffel
Void-safe en Eiffelbmarchal
 
Utilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expérienceUtilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expériencelouschwartz
 
Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Engineor
 
Intégration continue & Qualité logicielle
Intégration continue & Qualité logicielleIntégration continue & Qualité logicielle
Intégration continue & Qualité logicielleDavid Buros
 
programmation orienté objet c++
programmation orienté objet c++programmation orienté objet c++
programmation orienté objet c++coursuniv
 

Similaire à Les bonnes pratiques de l'architecture en général (20)

De legacy à symfony
De legacy à symfonyDe legacy à symfony
De legacy à symfony
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHP
 
Ce bon vieux propel
Ce bon vieux propelCe bon vieux propel
Ce bon vieux propel
 
Comment écrire du code testable ?
Comment écrire du code testable ?Comment écrire du code testable ?
Comment écrire du code testable ?
 
Design poo togo_jug_final
Design poo togo_jug_finalDesign poo togo_jug_final
Design poo togo_jug_final
 
Design poo togo_jug_final
Design poo togo_jug_finalDesign poo togo_jug_final
Design poo togo_jug_final
 
Jquery : les bases
Jquery : les basesJquery : les bases
Jquery : les bases
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
SOLID : les principes à l’origine du succès de Symfony et de vos applications
SOLID : les principes à l’origine du succès de Symfony et de vos applicationsSOLID : les principes à l’origine du succès de Symfony et de vos applications
SOLID : les principes à l’origine du succès de Symfony et de vos applications
 
POO
POOPOO
POO
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
 
Meet up symfony 11 octobre 2016 - Les formulaire
Meet up symfony 11 octobre 2016 - Les formulaireMeet up symfony 11 octobre 2016 - Les formulaire
Meet up symfony 11 octobre 2016 - Les formulaire
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans Drupal
 
Php1
Php1Php1
Php1
 
Void-safe en Eiffel
Void-safe en EiffelVoid-safe en Eiffel
Void-safe en Eiffel
 
Utilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expérienceUtilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expérience
 
Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !
 
Intégration continue & Qualité logicielle
Intégration continue & Qualité logicielleIntégration continue & Qualité logicielle
Intégration continue & Qualité logicielle
 
programmation orienté objet c++
programmation orienté objet c++programmation orienté objet c++
programmation orienté objet c++
 

Les bonnes pratiques de l'architecture en général

  • 1. Les bonnes pratiques de l'architecture en général Geoffrey Bachelet (@ubermuda)
  • 2. IL N’Y A PAS DE FORMULE MAGIQUE, les conseils suivants ne sont pas à prendre à la lettre, et rien ne dispense jamais de réfléchir avant d’architecturer quelque chose.
  • 3. Instancier les objets le plus tôt possible (+) Meilleur contrôle de l'instanciation (passage de paramètres) (+) Meilleur contrôle de l'injection (+) Moins de magie (pas d'inflection) (+) Moins de code (= moins de bugs !) Exemple: pas bien: $obj->addFoo('fooObject'); bien: $obj->addFoo(new fooObject()); Factory / Proxy $obj->setFooFactory(new fooFactory());
  • 4. Utiliser des factory ou des proxy Retarder l'instanciation des "vrais" objets jusqu'à ce que ce soit nécessaire (+) Permet d'éviter de flinguer l'interface d'un objet parce qu'on à pas les bonnes données au bon moment exemple: injectors (-) Plus de code (= plus de bugs) (+) mais c'est facile à tester unitairement (-) Moins facile de retrouver les utilisations d'un objet dans le codebase
  • 5. Éviter les $this->getFoobar() Préferrer le passage d'argument Dans les méthodes privées surtout (+) Moins d'interactions avec l'environnement = moins d'effets de bord (+) Plus facile à tester (+) Signature plus explicite (-) Signature qui tend vers l'illisible (-) risque de mélange arguments / accès internes moins de lisibilité
  • 6. Éviter les $this->getFoobar() exemple: baseSimulation Interface publique: baseSimulation#getTables() Pas d'arguments Accès internes Facile à utiliser Toutes les méthodes privées Passage d'arguments
  • 7. La composition, ça existe Souvent une bonne alternative à l'héritage (+) Permet la réutilisation horizontale (+) Permet la "Separation of concerns"
  • 8. Composition vs Héritage <?php class Voiture {} class VoitureElectrique extends Voiture {} class VoitureAEssence extends Voiture {} class VoitureElectriqueVitresElectriques extends VoitureElectrique {} class VoitureAEssenceVitresElectriques extends VoitureAEssence {} // wtf ?
  • 9. Composition vs Héritage <?php class Voiture { public function __construct($moteur, $vitres) { } } new Voiture(new MoteurElectrique(), new VitresElectriques()); new Voiture(new MoteurAEssence(), new VitresElectriques()); // o/
  • 10. Comment savoir ? Une poire est un fruit class Pear extends Fruit { } Une voiture a un moteur new Voiture(new Moteur());
  • 11. Limiter les méthodes des interfaces "Separation of concerns": une tâche, un objet (+) Interfaces plus facile à comprendre (+) Plus facile à réutiliser (+) Plus facile à maintenir (+) Plus facile à tester
  • 12. Méthodes atomiques (+) Plus facile à tester (+) Plus facile à surcharger (+) Plus facile à comprendre (+) Plus facile à maintenir
  • 13. Faciliter le testing Le testing est le premier cas de réutilisation d'un objet ergo, pas testable = pas réutilisable (+) Un objet intestable est (souvent) un objet mal foutu (-) Ne pas tomber dans le travers de "coder pour le test unitaire"
  • 14. Design only what you need Si y'en a pas besoin, on le fait pas ControleInfosRssCollectionFromObjects (+) Moins de code
  • 15. Éviter de retourner du "mixed" "Principle of least astonishment" exemple: retourner null au lieu d'un array vide Desfois c'est logique exemple: null|Object doSelectOne()
  • 16. Nommer ses variables correctement exemple (réels): $a, $soyons_cool, $onsenfiche En cas de doute: demandez à un collègue
  • 17. Appliquer la loi de Demeter http://en.wikipedia.org/wiki/Law_of_Demeter Pas bien: public function doBlah() { $this->getFoobar()->getQuux()->doBlah(); } Bien: public function doBlah(Quux $quux) { $quux->doBlah(); }
  • 18. Plus globalement: be SOLID http://en.wikipedia.org/wiki/Solid_(object-oriented_design) Single responsibility principle the notion that an object should have only a single responsibility. Open/closed principle the notion that “software entities … should be open for extension, but closed for modification”. Liskov substitution principle the notion that “objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program”. Interface segregation principle the notion that “many client specific interfaces are better than one general purpose interface.” Dependency inversion principle the notion that one should “Depend upon Abstractions. Do not depend upon concretions.”
  • 19. Apprenez l'anglais ! c'est important.
  • 20. Documentez-vous Beaucoup de problèmes ont déjà été résolus (Design Patterns) Beaucoup de concepts ont déjà été discutés
  • 21. Nous sommes une équipe Deux cerveaux valent mieux qu'un Deux mémoires valent mieux qu'une