|
Passer d'un code procédural à la programmation orientée objet (POO)
|
|
Table des matières
Passer d'un code procédural à la programmation orientée objet (POO)
Ce tutorial est grandement basé sur les échanges de ce sujet du forum : PROGRAMMATION / Demande d'aide / Aide pour coder "pro"^^ [special thanks aux participants pour leurs questions et à ceux qui ont pris le temps de répondre] ObjectifsCe tutorial a pour objectifs de :
On ne parlera pas en détail de :
Le but est de motiver à la POO, la technique se trouvera dans d'autres tutoriaux. IntroductionOn entend souvent parler de la POO en termes positifs :
Facile à dire, mais concrêtement , comment on fait ? La première étape est l'utilisation de fonctions. Utiliser des fonctionsC'est quoi une fonction ?Une fonction est un petit bout de programme, avec un nom, que l'on peut utiliser et réutiliser dans un programme. On doit définir la fonction, ensuite on peut l'utiliser. exemple : function direBonjour( $prenom ) { echo "Bonjour, " . $prenom . " ! Content de te voir lire ce tutorial :)"; } // et on l'utilise comme ceci : direBonjour('Corinne'); // et ça affiche le texte : // Bonjour, Corinne ! Content de te voir lire ce tutorial :) // ou comme cela : $prenom = 'Natalia'; direBonjour($prenom); // et ça affiche le texte : // Bonjour, Natalia ! Content de te voir lire ce tutorial :) Pourquoi et quand utiliser une fonction ?On va utiliser les fonctions pour simplifier le code :
DRY ( Don't Repeat Yourself, ne recopie pas ton code ) :
Raccourcir le code : Script sans fonctions, peu lisible car on a du code sur plusieurs écrans : // script qui vérifie l'inscription // code de vérification des données // 100 lignes if( isset($_POST['login'] ) { // etc } // ... // ... // ... // Puis la logique du script : if( $erreur == FALSE ) { // on enregistre l'inscription // 30 lignes }else{ // on indique l'erreur // 50 lignes } Script avec fonctions, lisible car on a le script en quelques lignes, avec des noms de fonctions compréhensibles : // on inclue le fichier où sont définies les fonctions include('fonctions/inscription.php'); // code de vérification des données, renvoie TRUE ou FALSE $erreur = verifierDonnees($login, $mail, $pass, $pass_confirmation); if( $erreur == FALSE ) { // on enregistre l'inscription enregistrerInscription($login, $mail, $pass); }else{ // on indique l'erreur afficherErreur($login, $mail, $pass, $pass_confirmation); } Le code avec des fonctions est plus court et plus lisible que le code sans fonctions. On a une vision globale du script. Pour rentrer dans le détail, il faut consulter le fichier fonctions/inscription.php, qui contient le code technique des fonctions. Le code avec fonctions ressemble fortement au pseudo code, traitant la logique du script :
Avec les fonctions, on obtient 2 niveaux de débuggage :
Plus loin, plus beau que les fonctions : la POOModifier un code avec des fonctions : problèmes...Avec les fonctions, on rend les scripts plus courts, plus lisibles, le code technique est centralisé, on corrige les bugs plus facilement. Un problème se posera lorsqu'on fera évoluer le script.
Continuons sur le script d'inscription :
On a fait des fonctions qui marchent bien, aux noms parlants :
On veut passer à la V2, et ajouter des races, à choisir à l'inscription. On doit modifier les fonctions :
C'est facile, tout est dans le fichier fonctions/inscription.php . Mais on doit aussi modifier le script utilisant les fonctions : on doit ajouter partout $race aux arguments. C'est facile si tout se trouve dans un seul script, mais :
On a un code technique facile à corriger : les bugs sur la fonction sont à un seul endroit. Ca serait pratique de faire disparaitre les arguments des fonctions lorsqu'on les utilise, comme ça on ne devra pas modifier tous les scripts. C'est faisable grâce à la POO & l'encapsulation. Faire "disparaître" les arguments des fonctionsL'idée derrière la POO & l'encapsulation, c'est de relier les données/ les variables et les fonctions. Reprenons les fonctions d'inscription :
Concernant les données, on a :
Ces données constitueront les membres ( ou attributs ) de la classe. Les membres d'une classe sont des variables qui stockent des valeurs. class inscription { // les membres de la classe public $login; public $mail; public $pass; public $pass_confirmation; public $race; }
Les fonctions seront des méthodes dans la classe. Elles utiliseront les valeurs stockées dans les membres à la place des arguments. class inscription { // les membres de la classe public $login; public $mail; public $pass; public $pass_confirmation; public $race; public function verifierDonnees() { // code technique pour vérifier les données ici } public function enregistrerCompte() { // code technique pour enregistrer le compte ici } public function envoyerConfirmationMail() { // code technique pour envoyer la confirmation par mail ici } } // FIN de la classe inscription
Comment les méthodes accèdent-elles aux membres ?
Il manque un point important : l'initialisation des membres. Comment attribuer des valeurs aux membres ? Via une méthode spéciale : le constructeur. Une première approche est : class inscription { // les membres de la classe // ... // le constructeur, 1ere approche public function __construct($login, $mail, $pass, $pass_confirmation, $race) { $this->login = $login; $this->mail = $mail; // etc } // les autres méthodes // ... Mais ça ne va pas : si on doit ajouter encore un membre à la classe, par exemple la date de naissance ou le pays, il faudra modifier les scripts partout où le constructeur est utilisé… on en revient au même qu'avec les fonctions.
La deuxième approche est l'utilisation d'un tableau pour initialiser les membres : class inscription { // les membres de la classe // ... // le constructeur, 2eme approche public function __construct($tableau) { $this->login = $tableau['login']; $this->mail = $tableau['mail']; // etc } // les autres méthodes // ... Cette fois-ci, l'ajout d'un membre ne modifiera pas l'utilisation du script. On a gagné ! :) Pour l'ajout d'une donnée à l'inscription, on aura donc les modifications suivantes à effectuer :
et c'est tout ! Le script de traitement ne changera pas : /* page de traitement du formulaire d'inscription */ // on inclue la classe include('classes/inscription.php'); // on crée un objet à partir des données envoyées en post dans le tableau $_POST $inscription = new inscription($_POST); $erreur = $inscription->verifierDonnees(); if( $erreur == FALSE ) { // on enregistre l'inscription $inscription->enregistrerInscription(); $inscription->envoyerConfirmationMail() }else{ // on indique l'erreur $inscription->afficherErreur(); } Quelques pistes pour débuter en POO
Tout ceci constitue une première approche de la POO. On peut faire des choses plus poussées, des constructions spécifiques permettant de modifier et de faire vivre un code encore mieux que ce qui est présenté ici, mais c'est une autre histoire… Quelques liens utiles
écrit par Pascal, sur la base des éléments proposés par les camarades de jeuphp |
|
tutoprog/passage_a_la_poo.txt · Dernière modification: 2011/04/03 14:06 (édition externe)
|