SlideShare une entreprise Scribd logo
1  sur  26
Télécharger pour lire hors ligne
PROGRAMMATION STUPID VS SOLID
QUI SUIS-JE ?
Arnaud Langlade / @_aRn0D
Développeur Symfony chez Clever Age
Sylius core team member / @Sylius
www.clever-age.com / @CleverAge
STUPID, KÉZAKO ?
Singleton
Tight coupling
Untestability
Premature Optimization
Indescriptive Naming
Duplication
INSTANCES UNIQUES (SINGLETON)
class MyClass
{
    public function __contruct()
    {
        $this­>connexion = Connexion::getInstance([
            'dsn' => 'mysql:host=localhost;dbname=my_db'
        ])
    }
}
Un singleton ne facilite pas la configuration des objets
Les singletons introduisent des couplages forts entre les objets
Pas vue globale sur l'application (les dépendences sont cachées)
COUPLAGE FORT (TIGHT COUPLING)
class MyClass
{
    public function __construct()
    {
        $this­>connexion = new MyConnexion();
    }
}
class MyClass
{
    public function __construct(Connexion $connexion)
    {
        $this­>connexion = $connexion;
    }
}
Difficulté dans la mise en place des tests
Impossible de créer des mocks
Dépendence forte entre composants
NON TESTABILITÉ (UNTESTABILITY)
Eviter les bogues et les régressions
Faciliter la refactorisation
Attention: Un code fortement couplé sera difficilement
testable
OPTIMISATIONS PRÉMATURÉES (PREMATURE OPTIMIZATION)
De simples applications peuvent se transformer en usine à gaz
Rend difficile :
la lecture et compréhension du code
la maintenance de votre application
NOMMAGE INDÉCHIFFRABLE (INDESCRIPTIVE NAMING)
class Quadrilateral
{
    public function getOutline($a, $b)
    {
        return ($a + $b) * 2;
    }
}
class Quadrilateral
{
    public function getPerimeter($with, $height)
    {
        return ($with + $height) * 2;
    }
}
Gain de temps lors de : la relecture, la maintenance et l’évolution
Eviter les abréviations ou d'acronymes est fortement conseillé
DUPLICATIONS (DUPLICATION)
Une modification de code entraîne :
la répercuter le changement à plusieurs endroits
la maintenance de l'application plus difficile
Des outils automatisent la détection des duplications
PHP Copy Paste Detector (PHPC)
SonarSource
SOLID, KÉZAKO ?
Michael Feathers et Robert C. Martin (aka Uncle Bob)
Single Responsibility Principle
Open/Closed Principle
Liskov Substitution Principle
Interface Segregation Principle
Dependency Inversion Principle
PRINCIPE DE RESPONSABILITÉ UNIQUE (SINGLE RESPONSIBILITY PRINCIPLE)
Une classe doit remplir un rôle précis
PRINCIPE DE RESPONSABILITÉ UNIQUE (SINGLE RESPONSIBILITY PRINCIPLE)
class DataImporter
{
    public function import($file)
    {
        $this­>writeData(
            $this­>loadFile($file)
        );
    }
    private function loadData($file) { ... }
    private function writeData(array $data) { ... }
}
PRINCIPE DE RESPONSABILITÉ UNIQUE (SINGLE RESPONSIBILITY PRINCIPLE)
class DataImporter
{
    public function __construct(Loader $loader, Writer $writer)
    {
        $this­>loader = $loader;
        $this­>writer = $writer;
    }
    public function import($file)
    {
        foreach($this­>loader­>load($file) as $item) {
            $this­>writer­>write();
        }
    }
}
PRINCIPE DE RESPONSABILITÉ UNIQUE (SINGLE RESPONSIBILITY PRINCIPLE)
La classe est facilement testable
Facilite l’évolution des implémentations existantes
Facilite l'ajouter de nouvelles implémentations
PRINCIPE OUVERT / FERMÉ (OPEN/CLOSED PRINCIPLE)
Ce principe consiste à rendre les modules ouverts à l'extension et fermés aux
modifications
PRINCIPE OUVERT / FERMÉ (OPEN/CLOSED PRINCIPLE)
$importer = DataImporter(new CsvLoader(), new MysqlWriter());
$importer = DataImporter(new XMLLoader(), new MongoWriter());
PRINCIPE OUVERT / FERMÉ (OPEN/CLOSED PRINCIPLE)
class UserControler
{
    public function createUser()
    {
        // Event pre_create
        // Enregistrement de l'utilisateur
        // Event post_create
    }
}
PRINCIPE DE SUBSTITUTION DE LISKOV (LISKOV SUBSTITUTION PRINCIPLE)
Si la classe T a une dépendance de type S alors on doit pouvoir remplacer
cette dépendance par tous types dérivés de S.
Formulé par Barbara Liskov et Jeannette Wing
PRINCIPE DE SUBSTITUTION DE LISKOV (LISKOV SUBSTITUTION PRINCIPLE)
class CsvLoader implements LoaderInterface
{
    public function load(File $file)
    {
        // ...
    }
}
class XmlLoader implements LoaderInterface
{
    public function load(File $file)
    {
        // ...
    }
}
class DataImporter
{
    public function load(LoaderInterface $loader, /* ... */)
    {
        // ...
    }
}
PRINCIPE DE SUBSTITUTION DE LISKOV (LISKOV SUBSTITUTION PRINCIPLE)
Implique de conserver de la classe parente (surtout en PHP) :
les mêmes signatures des méthodes
la nature des valeurs de retour des méthodes
Diminution du couplage.
PRINCIPE DE SÉGRÉGATION D'INTERFACES (INTERFACE SEGREGATION PRINCIPLE)
Principe de responsabilité unique pour les interfaces
PRINCIPE D'INVERSION DE DÉPENDANCE (DEPENDENCY INVERSION PRINCIPLE)
Il faut dépendre des abstractions, pas des implémentations
PRINCIPE D'INJECTION/INVERSION DE DÉPENDANCE (DEPENDENCY INVERSION PRINCIPLE)
class DataImporter
{
    public function __construct()
    {
        $this­>loader  = new CsvLoader();
        $this­>writer = new MysqlWriter();
    }
}
class DataImporter
{
    public function __construct(CsvLoader $loader, MysqlGateway $writer)
    {
        $this­>loader = $loader;
        $this­>writer = $writer;
    }
}
PRINCIPE D'INVERSION DE DÉPENDANCE (DEPENDENCY INVERSION PRINCIPLE)
class DataImporter
{
    public function __construct(LoaderInterface $loader, WriterInterface $writer)
    {
        $this­>loader = $loader;
        $this­>writer = $writer;
    }
}
PRINCIPE D'INJECTION DE DÉPENDANCE (DEPENDENCY INVERSION PRINCIPLE)
Une nette diminution du couplage
Une meilleure encapsulation
MERCI! QUESTIONS ?
Arnaud Langlade
Twiter @_aRn0D
Sylius : www.sylius.org

Contenu connexe

En vedette

Guia del practicum grado magisterio-uca-2013
Guia del practicum grado magisterio-uca-2013Guia del practicum grado magisterio-uca-2013
Guia del practicum grado magisterio-uca-2013Consejería de Educación
 
Los graficos
Los graficosLos graficos
Los graficosangelus79
 
Retour d’expérience de clients sur le développement d’applications métiers su...
Retour d’expérience de clients sur le développement d’applications métiers su...Retour d’expérience de clients sur le développement d’applications métiers su...
Retour d’expérience de clients sur le développement d’applications métiers su...Microsoft Ideas
 
El Popular, con Ángel Ron a la cabeza, gana un 4% más que el año pasado
El Popular, con Ángel Ron a la cabeza, gana un 4% más que el año pasadoEl Popular, con Ángel Ron a la cabeza, gana un 4% más que el año pasado
El Popular, con Ángel Ron a la cabeza, gana un 4% más que el año pasadoBanco Popular
 
3. gendreau, christian
3. gendreau, christian3. gendreau, christian
3. gendreau, christianTrudat
 
Data of interest : l’analyse métier par la donnée
Data of interest : l’analyse métier par la donnéeData of interest : l’analyse métier par la donnée
Data of interest : l’analyse métier par la donnéeMicrosoft Ideas
 
Ppoint AbsèNcia
Ppoint AbsèNciaPpoint AbsèNcia
Ppoint AbsèNciamlloren5
 
Tipos de Organigramas
Tipos de OrganigramasTipos de Organigramas
Tipos de OrganigramasJose F Guzman
 

En vedette (15)

Sylius en 5 minutes
Sylius en 5 minutesSylius en 5 minutes
Sylius en 5 minutes
 
Guia del practicum grado magisterio-uca-2013
Guia del practicum grado magisterio-uca-2013Guia del practicum grado magisterio-uca-2013
Guia del practicum grado magisterio-uca-2013
 
mon métier
mon métier mon métier
mon métier
 
Grli call for action fr un appel a agir 2009
Grli call for action fr un appel a agir 2009Grli call for action fr un appel a agir 2009
Grli call for action fr un appel a agir 2009
 
Los graficos
Los graficosLos graficos
Los graficos
 
Retour d’expérience de clients sur le développement d’applications métiers su...
Retour d’expérience de clients sur le développement d’applications métiers su...Retour d’expérience de clients sur le développement d’applications métiers su...
Retour d’expérience de clients sur le développement d’applications métiers su...
 
Mon comptable en ligne
Mon comptable en ligneMon comptable en ligne
Mon comptable en ligne
 
El Popular, con Ángel Ron a la cabeza, gana un 4% más que el año pasado
El Popular, con Ángel Ron a la cabeza, gana un 4% más que el año pasadoEl Popular, con Ángel Ron a la cabeza, gana un 4% más que el año pasado
El Popular, con Ángel Ron a la cabeza, gana un 4% más que el año pasado
 
3. gendreau, christian
3. gendreau, christian3. gendreau, christian
3. gendreau, christian
 
Data of interest : l’analyse métier par la donnée
Data of interest : l’analyse métier par la donnéeData of interest : l’analyse métier par la donnée
Data of interest : l’analyse métier par la donnée
 
Servicios de la web 2
Servicios de la web 2Servicios de la web 2
Servicios de la web 2
 
Libro
LibroLibro
Libro
 
Generacion de ideas1
Generacion de ideas1Generacion de ideas1
Generacion de ideas1
 
Ppoint AbsèNcia
Ppoint AbsèNciaPpoint AbsèNcia
Ppoint AbsèNcia
 
Tipos de Organigramas
Tipos de OrganigramasTipos de Organigramas
Tipos de Organigramas
 

Similaire à Programmation STUPID vs SOLID (PHP Meetup)

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
 
PHP 5 pour les développeurs Java
PHP 5 pour les développeurs JavaPHP 5 pour les développeurs Java
PHP 5 pour les développeurs JavaMehdi EL KRARI
 
Présentation de DBAL en PHP (Nantes)
Présentation de DBAL en PHP (Nantes)Présentation de DBAL en PHP (Nantes)
Présentation de DBAL en PHP (Nantes)Mickael Perraud
 
Présentation de DBAL en PHP
Présentation de DBAL en PHPPrésentation de DBAL en PHP
Présentation de DBAL en PHPMickael Perraud
 
Les bonnes pratiques de l'architecture en général
Les bonnes pratiques de l'architecture en généralLes bonnes pratiques de l'architecture en général
Les bonnes pratiques de l'architecture en généralGeoffrey Bachelet
 
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
 
Doctrine en dehors des sentiers battus
Doctrine en dehors des sentiers battusDoctrine en dehors des sentiers battus
Doctrine en dehors des sentiers battusRomaric Drigon
 
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
 
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...Fabien Potencier
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
Function oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech daysFunction   oop - bonnes pratiques ms tech days
Function oop - bonnes pratiques ms tech daysJean-Pierre Vincent
 
Réutilisabilité du code PHP
Réutilisabilité du code PHPRéutilisabilité du code PHP
Réutilisabilité du code PHPNicolas Le Nardou
 

Similaire à Programmation STUPID vs SOLID (PHP Meetup) (20)

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 !
 
De legacy à symfony
De legacy à symfonyDe legacy à symfony
De legacy à symfony
 
PHP 5 pour les développeurs Java
PHP 5 pour les développeurs JavaPHP 5 pour les développeurs Java
PHP 5 pour les développeurs Java
 
Jquery : les bases
Jquery : les basesJquery : les bases
Jquery : les bases
 
Présentation de DBAL en PHP (Nantes)
Présentation de DBAL en PHP (Nantes)Présentation de DBAL en PHP (Nantes)
Présentation de DBAL en PHP (Nantes)
 
Présentation de DBAL en PHP
Présentation de DBAL en PHPPrésentation de DBAL en PHP
Présentation de DBAL en PHP
 
Les bonnes pratiques de l'architecture en général
Les bonnes pratiques de l'architecture en généralLes bonnes pratiques de l'architecture en général
Les bonnes pratiques de l'architecture en général
 
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
 
Doctrine en dehors des sentiers battus
Doctrine en dehors des sentiers battusDoctrine en dehors des sentiers battus
Doctrine en dehors des sentiers battus
 
POO
POOPOO
POO
 
1145709.ppt
1145709.ppt1145709.ppt
1145709.ppt
 
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
 
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
 
Les Activités.pdf
Les Activités.pdfLes Activités.pdf
Les Activités.pdf
 
Android ORMLite
Android   ORMLiteAndroid   ORMLite
Android ORMLite
 
Change mind about JS
Change mind about JSChange mind about JS
Change mind about JS
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
Function oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech daysFunction   oop - bonnes pratiques ms tech days
Function oop - bonnes pratiques ms tech days
 
Réutilisabilité du code PHP
Réutilisabilité du code PHPRéutilisabilité du code PHP
Réutilisabilité du code PHP
 
Springioc
SpringiocSpringioc
Springioc
 

Programmation STUPID vs SOLID (PHP Meetup)

  • 2. QUI SUIS-JE ? Arnaud Langlade / @_aRn0D Développeur Symfony chez Clever Age Sylius core team member / @Sylius www.clever-age.com / @CleverAge
  • 3. STUPID, KÉZAKO ? Singleton Tight coupling Untestability Premature Optimization Indescriptive Naming Duplication
  • 4. INSTANCES UNIQUES (SINGLETON) class MyClass {     public function __contruct()     {         $this­>connexion = Connexion::getInstance([             'dsn' => 'mysql:host=localhost;dbname=my_db'         ])     } } Un singleton ne facilite pas la configuration des objets Les singletons introduisent des couplages forts entre les objets Pas vue globale sur l'application (les dépendences sont cachées)
  • 5. COUPLAGE FORT (TIGHT COUPLING) class MyClass {     public function __construct()     {         $this­>connexion = new MyConnexion();     } } class MyClass {     public function __construct(Connexion $connexion)     {         $this­>connexion = $connexion;     } } Difficulté dans la mise en place des tests Impossible de créer des mocks Dépendence forte entre composants
  • 6. NON TESTABILITÉ (UNTESTABILITY) Eviter les bogues et les régressions Faciliter la refactorisation Attention: Un code fortement couplé sera difficilement testable
  • 7. OPTIMISATIONS PRÉMATURÉES (PREMATURE OPTIMIZATION) De simples applications peuvent se transformer en usine à gaz Rend difficile : la lecture et compréhension du code la maintenance de votre application
  • 8. NOMMAGE INDÉCHIFFRABLE (INDESCRIPTIVE NAMING) class Quadrilateral {     public function getOutline($a, $b)     {         return ($a + $b) * 2;     } } class Quadrilateral {     public function getPerimeter($with, $height)     {         return ($with + $height) * 2;     } } Gain de temps lors de : la relecture, la maintenance et l’évolution Eviter les abréviations ou d'acronymes est fortement conseillé
  • 9. DUPLICATIONS (DUPLICATION) Une modification de code entraîne : la répercuter le changement à plusieurs endroits la maintenance de l'application plus difficile Des outils automatisent la détection des duplications PHP Copy Paste Detector (PHPC) SonarSource
  • 10. SOLID, KÉZAKO ? Michael Feathers et Robert C. Martin (aka Uncle Bob) Single Responsibility Principle Open/Closed Principle Liskov Substitution Principle Interface Segregation Principle Dependency Inversion Principle
  • 11. PRINCIPE DE RESPONSABILITÉ UNIQUE (SINGLE RESPONSIBILITY PRINCIPLE) Une classe doit remplir un rôle précis
  • 12. PRINCIPE DE RESPONSABILITÉ UNIQUE (SINGLE RESPONSIBILITY PRINCIPLE) class DataImporter {     public function import($file)     {         $this­>writeData(             $this­>loadFile($file)         );     }     private function loadData($file) { ... }     private function writeData(array $data) { ... } }
  • 13. PRINCIPE DE RESPONSABILITÉ UNIQUE (SINGLE RESPONSIBILITY PRINCIPLE) class DataImporter {     public function __construct(Loader $loader, Writer $writer)     {         $this­>loader = $loader;         $this­>writer = $writer;     }     public function import($file)     {         foreach($this­>loader­>load($file) as $item) {             $this­>writer­>write();         }     } }
  • 14. PRINCIPE DE RESPONSABILITÉ UNIQUE (SINGLE RESPONSIBILITY PRINCIPLE) La classe est facilement testable Facilite l’évolution des implémentations existantes Facilite l'ajouter de nouvelles implémentations
  • 15. PRINCIPE OUVERT / FERMÉ (OPEN/CLOSED PRINCIPLE) Ce principe consiste à rendre les modules ouverts à l'extension et fermés aux modifications
  • 16. PRINCIPE OUVERT / FERMÉ (OPEN/CLOSED PRINCIPLE) $importer = DataImporter(new CsvLoader(), new MysqlWriter()); $importer = DataImporter(new XMLLoader(), new MongoWriter());
  • 17. PRINCIPE OUVERT / FERMÉ (OPEN/CLOSED PRINCIPLE) class UserControler {     public function createUser()     {         // Event pre_create         // Enregistrement de l'utilisateur         // Event post_create     } }
  • 18. PRINCIPE DE SUBSTITUTION DE LISKOV (LISKOV SUBSTITUTION PRINCIPLE) Si la classe T a une dépendance de type S alors on doit pouvoir remplacer cette dépendance par tous types dérivés de S. Formulé par Barbara Liskov et Jeannette Wing
  • 19. PRINCIPE DE SUBSTITUTION DE LISKOV (LISKOV SUBSTITUTION PRINCIPLE) class CsvLoader implements LoaderInterface {     public function load(File $file)     {         // ...     } } class XmlLoader implements LoaderInterface {     public function load(File $file)     {         // ...     } } class DataImporter {     public function load(LoaderInterface $loader, /* ... */)     {         // ...     } }
  • 20. PRINCIPE DE SUBSTITUTION DE LISKOV (LISKOV SUBSTITUTION PRINCIPLE) Implique de conserver de la classe parente (surtout en PHP) : les mêmes signatures des méthodes la nature des valeurs de retour des méthodes Diminution du couplage.
  • 21. PRINCIPE DE SÉGRÉGATION D'INTERFACES (INTERFACE SEGREGATION PRINCIPLE) Principe de responsabilité unique pour les interfaces
  • 22. PRINCIPE D'INVERSION DE DÉPENDANCE (DEPENDENCY INVERSION PRINCIPLE) Il faut dépendre des abstractions, pas des implémentations
  • 23. PRINCIPE D'INJECTION/INVERSION DE DÉPENDANCE (DEPENDENCY INVERSION PRINCIPLE) class DataImporter {     public function __construct()     {         $this­>loader  = new CsvLoader();         $this­>writer = new MysqlWriter();     } } class DataImporter {     public function __construct(CsvLoader $loader, MysqlGateway $writer)     {         $this­>loader = $loader;         $this­>writer = $writer;     } }
  • 24. PRINCIPE D'INVERSION DE DÉPENDANCE (DEPENDENCY INVERSION PRINCIPLE) class DataImporter {     public function __construct(LoaderInterface $loader, WriterInterface $writer)     {         $this­>loader = $loader;         $this­>writer = $writer;     } }
  • 25. PRINCIPE D'INJECTION DE DÉPENDANCE (DEPENDENCY INVERSION PRINCIPLE) Une nette diminution du couplage Une meilleure encapsulation
  • 26. MERCI! QUESTIONS ? Arnaud Langlade Twiter @_aRn0D Sylius : www.sylius.org