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.

TABLEAU 2.1: 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.

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 et libcsfml-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.

Diagramme de classe : AbstractFFI

FIGURE 2.1: Diagramme de classe : AbstractFFI

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.

FIGURE 2.2: Diagramme de classes intéractif accessible à l’adresse https://cutt.ly/phpml-class-diagram

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é.

(Wikipédia, 2020b)

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.

(Wikipédia, 2020a)

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.
  • 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

TABLEAU 2.2: Récapitulatif des dépendances
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/