close

Passer d'un script procédural à un script POO

#1 Objectif du tuto open

Je vais reprendre le TD numéro 5 que j'ai fait en procédural et je vais le passer en POO. Ca va me permettre de mettre en évidence essentiellement l'intérêt de l'encapsulation et de l'injection de dépendance 😃. Le TD numéro 5 est un outil pour entraîner la mémoire.

C'est un outil qui vous pose une question. Vous devez essayer de trouver une réponse et la garder en tête. Puis, vous demandez l'affichage de la réponse pour vérifier.

Demo ICI

Cet outil est composé :

  1. D'un fichier data.php qui gère les données qui se trouvent dans un fichier. Ce fichier se nomme data.txt. Vous avez un exemple ci-dessous. Chaque ligne du fichier contient un couple question/réponse. La question et la réponse sont séparées par une virgule.
  2. D'un fichier afficher.php qui gère les affichages.
  3. D'un script principal memo.php qui fait un require des deux fichiers précédents.
Arborescence de l'exemple

Je résume ci-dessous le fonctionnement de memo.php.

  1. On charge les données sous la forme d'un tableau qui contient des couples de questions et réponses. Chaque couple a un numéro dans un tableau à deux dimensions.
  2. S'il n'y a pas la superglobale $_GET['numero'] d'injectée dans le script alors :
    • On va tirer au sort un numéro de couple question/réponse.
    • On va afficher la question. C'est là que vous devez chercher dans votre tête si vous avez la réponse.
    • On prépare un champ caché, qui contient le numéro de ce couple. L'appui sur le bouton Afficher Réponse relance le script memo.php mais cette fois avec $_GET['numero'] qui est affectée avec le numéro du couple question/réponse.
  3. S'il y a la superglobale $_GET['numero'] d'injectée dans le script alors :
    • On affiche la question et sa réponse.
    • Et c'est là que vous pouvez vérifier si vous aviez la bonne réponse.

#2 On passe l'exemple ci-dessus de procédural à POO ? open

  1. Comme je l'ai dit dans le tuto La POO pour quoi faire ?, procédural ou POO, l'analyse fonctionnelle ne change pas. Bien sûr, il va y avoir des différences de conception. Mais souvent, on retrouve grosso modo la même modularité.
  2. Dans un premier temps, ce que l'on va faire, c'est mettre des classes en place dans les fichiers data.php et afficher.php. Ensuite, on construira les objets dans le script principal.
  3. On va s'occuper en premier du fichier data.php, que l'on va renommer en Data.php, car il contient une classe. Ce que je veux, c'est encapsuler la variable $fd et faire en sorte qu'elle ne remonte pas dans le script principal 😃. Le script principal se fiche de l'endroit où l'on va chercher les données. Il ne veut rien connaître de cette complexité. Il veut faire un getQR() et récupérer ses données. C'est tout !
  1. A présent, on s'occupe du fichier Afficher.php. Dans ce fichier, on va se contenter de mettre une classe en place.
  2. Je déclare les méthodes en public. Si je ne mets rien, PHP déclare par défaut les méthodes en public, mais c'est mieux de le mettre.
  1. Maintenant, je reprends le script principal. Il va falloir que je construise les objets.
  2. Il faut se souvenir que le new Data() va déclencher l'appel du __construct(). C'est à ce moment-là que l'on va initialiser la "couche logicielle" Data.php. Remarquez bien que, maintenant, l'initialisation est locale à la classe et encapsulée dans la classe. Cette initialisation va se faire au moment de la création de l'objet $data dans le script principal 😃.

#3 On injecte une dépendance open

A présent, je veux simplifier mon script principal. Le tableau $qr qui contient des données apparait plusieurs fois dans le script principal. Je voudrais cacher ces données. C'est la classe Afficher qui en a besoin. Je vais donc injecter un objet de la classe Data dans le constructeur de la classe Afficher. C'est ce que l'on appelle injecter une dépendance 😃.

Je vais supprimer le $qr = $data->getQR(); (* ligne 27 ci-dessus) et le faire descendre dans la classe Afficher.

Il faudra de ce fait retoucher tous les endroits où figure la variable $qr.

Ci-dessous la classe Afficher avec les modifications.

  1. Vous pouvez constater ci-dessous que toutes les données sont encapsulées dans les objets.
  2. On a encapsulé la gestion du fichier et de son descripteur $fd dans Data.php.
  3. On a encapsulé le tableau de données $qr dans Afficher.php.
  4. Il ne reste dans le script principal memo.php que la fonction essentielle de ce script, à savoir : S'il n'y a pas de numéro d'injecté, il le tire au sort et il affiche la question. S'il y a un numéro d'injecté, il affiche la question et la réponse.
  5. L'initialisation des deux "couches logicielles" que constituent les classes se fait localement dans chaque objet au moment de sa construction. Rien ne traîne dans l'application principale pour initialiser quoi que ce soit. C'est important de le voir. Si vous avez déjà fait de grosses applications qui nécessitent la mise en place de beaucoup de ressources, alors, vous devez bien sentir l'avantage que je mets ici en évidence.
  6. Et tout cela sans avoir mis en place le moindre mécanisme d'héritage !!
Couches de l'application