Chapitre 2 Développement de la bibliothèque
Impossible de parler du développement de la bibliothèque sans aborder le programme que je me suis fixé pour le faire.
2.1 Programme de la mise en situation professionnelle.
La mise en situation professionnelle s’est déroulé dans le cadre du confinement, il m’était donc obligatoire de le faire en télétravail.
2.1.1 Organisation
Dès le début je me suis fait un programme pour répartir convenablement les 4 semaines qui m’étaient données pour la réalisation de la bibliothèque.
- Semaine 1 : documentation et découverte
- Semaine 2 : Conception de l’architecture de la bibliothèque et template de développement
- Semaine 3 : Développement de la bibliothèque
- Semaine 4 :
- Poursuite de développement et distribution de la bibliothèque
- Finalisation du mémoire
En plus de cette organisation hebdomadaire je me suis fixé un planning journalier.
Horaire | Activité |
---|---|
09h00 - 13h00 | Projet |
Pause | |
15h00 - 17h00 | Projet |
Pause | |
18h00 - 20h00 | Mémoire |
Je me suis également servi de trello qui fut d’une aide précieuse pour mettre en place toute cette organisation.
2.1.2 Impression sur le télétravail
Objectivement j’ai pu respecté ce planning à 70%. Il est évident que travailler de chez soi n’est pas une compétence innée mais bien une compétence qui se pratique et s’améliore avec l’expérience. Il faut bien sûr apprendre à faire l’impasse sur certains divertissement sans pour autant se priver.
2.2 Pré-requis avant le développement de la bibliothèque
Avant de réellement commencer le développement de la bibliothèque il m’a fallu une période de documentation et de découverte qui a durée une semaine. Evidemment j’en avait besoin car avant cette mise en situation professionnel je ne connaissais rien de FFI ou de CSFML. Je vais résumé ce que j’ai pu apprendre en donnant les pré-requis au développement et fonctionnement de la bibliothèque.
2.2.1 PHP FFI
L’extension FFI de PHP, disponible dès la version 7.4, est obligatoire pour développer et faire fonctionner la bibliothèque. Elle est intégrée mais “inactive” par défaut (The PHP Group, 2019) sauf si l’on utilise PHP en ligne de commande ou la fonctionnalité de pré-chargement de PHP en environnement web. Pour activer FFI il faut s’assurer d’avoir la librairie FFI libffi
installée sur sa machine. Sourceware libffi.
2.2.1.1 Installation de libffi
- Sur linux (Debian pour moi) la librairie est accessible via le paquet
libffi-dev
. Donc l’exécution de la commande suivante devrait installer les paquets nécessaires au bon fonctionnement de l’extension FFI de PHP.
- Sur Windows je n’ai pas exploré le processus d’installation mais il est disponible à l’adresse suivante : Goldencode.com : Building and Installing libffi on Windows
2.2.1.2 Configuration/Activation de FFI
Après avoir installé libffi
, il faut désormais l’activer. On peut le faire de plusieurs manières mais je détaillerai uniquement celle que j’utilise pour faire fonctionner la bibliothèque. Voir 3.1.
2.2.2 CSFML et SFML
CSFML est juste un pont vers la bibliothèque graphique SFML il faut donc installer SFML si l’on veut utiliser CSFML.
- Sur Debian, ces bibliothèques sont accessibles respectivement via les paquets
libsfml-dev
etlibcsfml-dev
- Sur Windows on peut les télécharger sur le site officiel de la bibliothèque sfml.org
Après avoir eu ces dépendances sur ma machine, j’ai pu découvrir comment fonctionnait CSFML et SFML d’abord puis j’ai été capable de réaliser un programme en C qui affiche une fenêtre. Par la suite j’ai également réussi à écrire un script qui ouvre une fenêtre en PHP (accessible sur le dépôt git) utilisant CSFML et FFI fraîchement installé. Maintenant que j’étais au point sur les dépendances de ma future bibliothèque j’ai pu commencé la phase de conception.
2.3 Conception
En ce qui concerne la conception, je n’ai pas l’intention de détailler tout mon processus de réflexion mais juste d’éclaircir sur certains points clés de l’architecture de la bibliothèque. Avant tout il me fallait trouver un moyen de m’abstraire du processus de chargement d’une bibliothèque avec FFI. La première tâche que je me suis donnée lors de ma phase de conception fut alors de réaliser une abstraction à la manipulation d’objets FFI.
2.3.1 Ma première classe AbstractFFI
En informatique, le concept d’abstraction identifie et regroupe des caractéristiques et traitements communs applicables à des entités ou concepts variés ; une représentation abstraite commune de tels objets permet d’en simplifier et d’en unifier la manipulation.
— (Wikipédia, 2019)
L’objectif est de ne pas utiliser directement FFI mais plutôt de passer par une classe intermédiaire. Cette abstraction devrait dans sa version la plus simple être capable de me retourner un objet FFI contenant la bibliothèque que je compte utiliser. Je suis passé par différentes idée de conception, et j’ai fini par aboutir à celle-ci.
On y voit plusieurs classes abstraites, la principale étant AbstractFFI
dont hérite LibLoader
, leurs rôles est dans leur nom :
- AbstractFFI : la principale classe qui se charge de s’abstraire du chargement de la bibliothèque et de faire les vérifications nécessaires. Elle a comme attribut un tableau d’objets FFI pour permettre l’utilisation de plusieurs bibliothèques tout au long du programme.
- LibLoader : héritant de AbstractFFI elle a les mêmes fonctionnalités, mais donne en plus la base pour mettre en place un singleton de génération de bibliothèque — une classe limité à une instance dont le seul objectif est de retourner une bibliothèque précise.
Pour ce qui est de MyCData, il s’agit d’un trait
, particularité de PHP, qui est pour faire simple une classe abstraite qui s’utilise comme une interface. Son objectif est d’avoir un ensemble de fonctions et d’attributs prêts à être réutilisé pour définir une donnée C qui serait importée de la bibliothèque chargée avec FFI.
2.3.2 Architecture globale
Le reste de la bibliothèque est un ensemble de classes inspirées de SFML qui s’emboîtent autour de l’abstraction FFI. Effectivement, SFML et pas CSFML comme dit précédemment, car CSFML est juste un pont écrit en C vers SFML, or le C n’est pas un langage orienté objet. Par conséquent SFML qui est écrit en C++ qui lui est bien un langage orienté objet est idéal pour de servir de bases pour l’implémentation de mes classes. Toujours est-il que j’ai du simplifier un maximum l’architecture pour ne pas alourdir la bibliothèque en elle même et son utilisation finale.
2.3.3 Exemple de la classe Window
La classe Window est le deuxième pilier de l’architecture de la bibliothèque, comme la plupart des classes elle utilise MyCData pour bénéficier des méthodes et des attributs lier à l’échange de données entre PHP et la bibliothèque C via FFI. C’est le cas de la méthode toCData()
qui convertit les attributs actuel de la classe en donnée C.
2.3.4 Diagramme de classes
Le résultat de la phase de conception est le diagramme de classe suivant qui a constamment évolué même lors de l’implémentation des fonctionnalités de la bibliothèque.
Le temps passé sur la réflexion de l’architecture de la bibliothèque n’a pas été en vain car il va nous permettre d’en gagner sur la partie principale qui est l’implémentation des fonctionnalités trouvées lors de la phase de conception.
2.4 Implémentation de la bibliothèque
L’implémentation des fonctionnalités se déroule lors de la phase de programmation, elle se déroule sans problèmes particuliers lorsque la phase de conception s’est bien déroulé car il n’y a pas besoin de réfléchir sur la structure de l’application ou de la bibliothèque car elle a déjà été définie. Néanmoins c’est au moment de l’implémentation qu’il faut penser à l’ordre de programmation des composants (bien que cela puisse être également fait lors de la conception) et que certaines faiblesses de conception apparaissent et je vais essayer d’en citer quelques unes.
2.4.1 L’ordre d’implémentation
Si la bibliothèque que l’on souhaite créer a des dépendances il est également probable que les éléments internes soient également interdépendants, cependant il est important de garder le niveau de dépendance le plus bas possible. C’est là que se pose la question de l’ordre l’implémentation. En ce qui me concerne j’ai préféré commencer par la classe principale et redescendre l’arbre de dépendance, ce qui n’est pas forcément la meilleure des solutions mais elle a eu le mérite d’être efficace et de me révéler certaines erreurs de conceptions que j’avais commises.
2.4.2 Erreurs de conception
La plus grande erreur que j’ai pu faire a été au niveau de l’abstraction, car j’utilisais un trait
qui n’était pas vraiment adapté à ce que je concevais à la base, erreur qui m’a été notifié par ma tutrice de projet après consultation. En corrigeant cela j’ai pu aboutir à la version que vous pouvez voir au 2.1.
En plus de diverses erreurs de conception corrigées sur le vif, j’ai été régulièrement confrontés à des erreurs de programmation plus techniques lié soit à FFI soit à CSFML. Celle qui m’a pris le plus de reflexions et de temps à corriger était une erreur de segmentation.
Une erreur de segmentation (en anglais segmentation fault, en abrégé segfault) est un plantage d’une application qui a tenté d’accéder à un emplacement mémoire qui ne lui était pas alloué.
Il faut également noter que je n’ai jamais été confronté à cette erreur en PHP et il est très contraignant de retrouver la trace d’une erreur de segmentation quand on est développeur junior.
Finalement il s’est avéré que retirer l’utilisation de la méthode var_dump()
de mon script résolvait mon erreur.
Une fois l’implémentation finis il faut à présent s’attarder à la distribution de notre bibliothèque.
2.5 Distribution de la bibliothèque
Cette section est purement subjective car il s’agit de choisir comment partager la version finale de la bibliothèque. Evidemment chacun peut avoir son avis, je vais donc plus m’intéresser au “comment” plutôt qu’au “pourquoi” j’ai choisi cette méthode.
2.5.1 Un gestionnaire de paquets : composer
Composer est un logiciel gestionnaire de dépendances libre écrit en PHP. Il permet à ses utilisateurs de déclarer et d’installer les bibliothèques dont le projet principal a besoin.
2.5.2 Installation de composer
Pour installer composer nous avons juste besoin d’avoir php installé sur sa machine, ensuite les étapes d’installation sont détaillées sur la page d’introduction à composer. Mais pour résumer l’une des méthodes d’installation pour avoir composer globalement sur linux :
- Exécuter ces commandes pour télécharger la dernière archive de composer.
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
- Déplacer l’archive téléchargée vers son dossier bin :
Avec composer installé nous pouvons créer intéractivement un fichiercomposer.json
dans n’importe quel dossier ou projet avec la commande composer init
.
2.5.3 Publication de bibliothèque avec composer et packagist
Avec composer il est facile de gérer les dépendances de son projet et de publier ses propres packets/bibliothèques. Les différentes étapes pour faire l’un ou l’autre sont brièvement décrites sur packagist.org. Pour faire court il est nécessaire d’avoir :
- un compte un packagist.org
- un dépôt GIT
- un fichier
composer.json
minimal à la racine de son dépôt :
2.5.4 Maintenabilité
Une fois son packet ou sa bibliothèque publié sur packagist il est désormais possible à n’importe qui de “demander” votre bibliothèque via composer avec la commande composer require vendor-name/package-name
à condition d’avoir également un fichier composer.json
à la racine de son projet.
Ce qu’il nous reste à faire est de maintenir la bibliothèques, c’est à dire :
- aux nouvelles pratiques de notre langage et mises à jour de nos dépendances
- ajouter de nouvelles fonctionnalités si on le souhaite.
- re-publier sur packagist quand cela est fait (ou activer la mise à jour automatique sur son compte).
Nous avons donc terminé le développement y compris la distribution de notre bibliothèque, nous pouvons à présent apprendre à l’utiliser, ce qui n’est pas aussi trivial que nous pourrions le croire.
2.6 Tableau récapitulatif
Dépendances | Commandes |
---|---|
PHP 7.4 | sudo apt install php7.4 |
FFI | sudo apt install libffi-dev |
SFML | sudo apt install libsfml-dev |
CSFML | sudo apt install libcsfml-dev |
Composer | voir le lien https://getcomposer.org/download/ |