Modularité des programmes
Introduction :
Ce cours porte sur la modularité en développement logiciel. Le découpage des programmes en composants ou modules logiciels favorise leur maintenance et leur réutilisation dans différents contextes.
Ces modules ou bibliothèques permettent d'enrichir les fonctionnalités d'un langage de programmation selon les besoins. Nous présenterons dans un premier temps l'utilisation et la création de modules au niveau local. Puis, nous nous intéresserons ensuite à l'accès à des modules à distance sur le web par l'intermédiaire d'interfaces applicatives de programmation appelées « API ».
Bibliothèques logicielles
Bibliothèques logicielles
Dans cette première partie, nous aborderons l'utilisation de modules logiciels préexistants ; puis dans un second temps nous étudierons la création d'un nouveau module.
Les langages informatiques disposent d'un certain nombre de fonctionnalités natives. Ainsi le langage Python nous permet d'effectuer des calculs usuels et de traiter plusieurs types de données. Ces fonctionnalités natives permettent de répondre aux besoins courants et récurrents des développeur·se·s.
Intérêt des bibliothèques logicielles
Intérêt des bibliothèques logicielles
Les fonctionnalités natives des langages peuvent être étendues en cas de besoin par le recours à des modules complémentaires, appelés de manière générique bibliothèques logicielles.
En langage informatique, une bibliothèque est un ensemble de modules regroupés et mis à disposition, afin de ne pas les réécrire à chaque fois.
Ces modules spécialisés permettent d'enrichir le langage en fournissant des outils logiciels dédiés à toutes sortes de problématiques : calcul mathématique, accès au système d'exploitation, cryptographie, communication réseau, protocoles Internet, pour ne citer que quelques familles de bibliothèques.
La bibliothèque standard de Python comporte des centaines de composants logiciels. Leur longue liste est consultable à cette adresse.
Cette riche bibliothèque standard peut, en outre, être complétée si nécessaire par le recours à des modules supplémentaires externes, comme nous allons le voir à présent.
Utilisation d'une bibliothèque
Utilisation d'une bibliothèque
Afin d'illustrer de manière concrète l'utilisation d'une bibliothèque, nous choisissons comme exemple le module externe nommé « Requests ».
C'est une bibliothèque HTTP très utilisée et très appréciée par les développeur·se·s Python. Elle ne fait pas partie de la bibliothèque standard, mais elle est officiellement recommandée dans la documentation Python comme interface client HTTP de plus haut niveau.
Son installation, simple et rapide, est présentée dans la documentation en ligne de Requests consultable à cette adresse.
Un·e développeur·se doit savoir se documenter et avoir le réflexe de consulter les différentes documentations proposées. Ces dernières permettent de comprendre et d'utiliser la bibliothèque en question.
Les documentations en ligne des langages et modules sont toujours disponibles en anglais. Certaines sont traduites dans d'autres langues, mais la traduction n’est pas systématique.
Dans le cas de la bibliothèque Requests, l'aide en ligne a fait l'objet d'une traduction en français, consultable à cette adresse.
Une fois le module installé, il suffit de l'importer pour accéder aux fonctionnalités qu'il propose, ainsi qu'à une aide intégrée locale, donc accessible en l'absence de connexion Internet. Rédigée en langue anglaise, cette aide destinée à un public international est généralement formulée de manière assez simple.
Depuis Python, on importe le module Requests :
Nous pouvons interroger le système d'aide natif de Python avec
en précisant le nom du module qui nous intéresse.
Affiche le texte d'aide suivant :
On observe que cette aide intégrée propose deux exemples de code illustrant des fonctionnalités du module. Ces exemples sont construits avec les deux requêtes HTTP les plus courantes : GET et POST.
Consultons l'aide applicable à GET.
Nous obtenons le texte suivant :
L'aide contextuelle fournie par les IDE (pour Integrated Development Environment, soit « environnement de développements ») facilite également le travail des développeur·se·s en apportant les éléments de syntaxe dans l'éditeur de code, en regard immédiat de la ligne de code courante.
Voici à quoi ressemble le texte d'aide contextuelle associé à la fonction
de Requests :Aide contextuelle relative à la méthode get()
La consultation de la documentation en ligne et de l'aide contextuelle nous guide pour l'utilisation de la bibliothèque. Sa lecture nous apprend que nous pouvons facilement requérir des ressources du web à partir de leur URL.
Effectuons une requête HTTP de type GET sur l'URL correspondant à la page Wikipédia consacrée au langage Python en langue française.
La fonction
appelée sur l'objet , correspondant au résultat de notre requête GET, nous permet de connaître ses attributs.
Nous obtenons l'affichage suivant :
Sans tenir compte des nombreuses méthodes spéciales (celles commençant par les caractères «
») nous constatons l'existence d'une vingtaine d'attributs rattachés à notre objet .L'examen de ces attributs montre qu'il est possible d'accéder facilement à toutes sortes d'informations liées à HTTP, entre autres :
- le code statut retourné par le serveur avec la méthode;
- les entêtes avec la méthode;
- et le code source html avec la méthode.
Nous pouvons aussi vérifier avec la méthode
si une redirection a eu lieu et contrôler l'url finale avec la méthode .
Les fonctions
et permettent de se documenter sur le contenu et le fonctionnement des bibliothèques.Création d'un module
Création d'un module
Les développeur·se·s peuvent non seulement utiliser les modules existants, mais aussi créer leurs propres modules logiciels.
Nous allons l'illustrer avec un exemple simple, en créant un module dédié aux conversions de températures entre les degrés Celsius et Fahrenheit. Notre module pourra également indiquer s'il gèle pour toute température exprimée (en Celsius, comme en Fahrenheit).
Nous définissons notre module avec le code ci-après, que nous enregistrons dans un fichier nommé
.
Nous pouvons ensuite importer ce module dans nos programmes, et ainsi accéder à l'ensemble des fonctionnalités qu'il propose.
Sur la console, passer les commandes suivantes :
où index indique la position du dossier où se trouve le module dans la liste des chemins contenue dans
.On notera que ce code de notre module comporte plusieurs textes de documentation (appelés docstrings en anglais) matérialisés par les textes multi-lignes encadrés entre triples guillemets : «
».Ils sont utiles non seulement pour la maintenance du code, mais pas seulement, comme nous allons le mettre en évidence dans un instant.
Une fois notre module réalisé, nous pouvons en importer et en utiliser les fonctions en quelques lignes de code.
Le fait d'avoir renseigné notre module et ses fonctions avec des docstrings permet à Python de proposer l'aide correspondante avec les fonctions natives de l'aide système.
Nous obtenons l'affichage suivant :
La docstring figurant au début du module est prise en compte de la manière suivante :
- la première ligne, associée au nom du module, en fournit une description synthétique dans la section « NAME » (nom) ;
- les lignes suivantes apparaissent dans la section « DESCRIPTION » ;
- les docstrings des fonctions sont présentées individuellement dans la section « FUNCTIONS » (fonctions) à la suite de leur nom et de leurs paramètres.
Notre module exemple a été développé avec un paradigme fonctionnel mais la modularité n'impose aucun paradigme en particulier. Nous pourrions tout aussi bien développer ce module avec un paradigme objet. Le système d'aide native présenterait alors les attributs et méthodes des classes définies dans le module.
Nous savons maintenant utiliser et créer des modules au niveau local. Découvrons maintenant ce qu'il est possible de réaliser avec une connexion au web.
Accès aux API web
Accès aux API web
Intéressons-nous aux possibilités d'interactions avec des modules distants par le biais d'API web. Commençons par définir et caractériser ce qu'est une API web.
Définition
Définition
API :
Une API (de l'anglais Application Programming Interface) est une interface de programmation applicative (ou interface de programmation d'application).
Le sigle API désigne de manière générique tout type d'interface applicative. Dans le cadre de ce cours nous nous intéressons aux API du web.
Caractérisation d'une API web
Caractérisation d'une API web
API web :
On désigne par « API web » une API fournie par un serveur web.
Les API web sont nombreuses et fournissent des données très variées. En voici quelques-unes ci-dessous à titre d’exemples.
- Open Weather Map : fournit des informations météos diverses relatives au lieu qui lui est précisé.
- Text-to-speech : convertit le texte qui lui est transmis en fichier audio.
- Géo : cette API web, produite par le gouvernement français, délivre des informations sur une commune (code postal, coordonnées géographiques, regroupements auxquels elle appartient).
- Paypal, HiPay, Stripe… : solutions de paiements en ligne accessibles via des API.
Cette API expose ses données via des points d'accès (endpoints en anglais) qu'il est possible de consulter par le biais de requêtes HTTP. Les URL des points d'accès sont indiquées dans la documentation de l'API. Les réponses sont généralement proposées au format JSON ou parfois en XML.
Il existe différentes manières de proposer une API dans le contexte du web, mais ces API respectent généralement le modèle appelé REST (pour Representational State Transfer).
Ce modèle est basé sur des paires de requêtes et de réponses caractérisées par l'absence de notion d'état entre ces requêtes qui sont totalement indépendantes les unes des autres, en conformité avec la logique du protocole HTTP. Une API respectant le modèle REST est appelée RESTful.
Les interactions avec les API web reposent sur l'emploi de verbes HTTP : principalement GET pour consommer des données, éventuellement complété par POST, PUT et DELETE si l'API permet aussi de créer et d'éditer des données sur le serveur.
Des bibliothèques Python spécialisées telles que Bottle, Flask ou Django permettent de proposer des API web et notamment des API respectant le modèle REST.
Échanges entre les différents acteurs faisant appel à une API web
Modalités d'accès aux API
Modalités d'accès aux API
Les API web possèdent des modalités d'accès variables. Celles-ci sont définies par le producteur du service et peuvent être caractérisées selon plusieurs critères :
- coût (gratuit ou payant) ;
- utilisateur·rices·s (accessible à tou·te·s ou seulement à un public restreint) ;
- mode d'accès (avec ou sans clé d'accès) ;
- utilisation avec ou sans limitation (en général sous la forme d'un nombre de requêtes par unité de temps) ;
- réutilisation, avec ou sans restriction d'exploitation des données, et le cas échéant une distinction selon que la réutilisation soit ou non à vocation commerciale.
Les points d'accès à l'API sont indiqués par la documentation, ainsi que nous allons l'illustrer en interrogeant de manière concrète une API web.
Voici un exemple de conditions d'accès à une API : l'API Géo.
Celle-ci est ouverte à tous, mais dans des conditions bien précises : $10$ appels/seconde/ip. En effet, en sollicitant l'API, on mobilise des ressources informatiques, et celles-ci ne sont pas gratuites !
Aperçu de l’API Géo
Interrogation d'une API
Interrogation d'une API
L'interrogation de l'API sera effectuée à l'aide de la bibliothèque Requests présentée en première partie de ce cours.
L'API que nous utiliserons porte sur les jours fériés en France.
La documentation de l'API est consultable à cette adresse. On y trouve également le code source et la licence d'utilisation.
Cette API ne nécessite pas de clé d'accès pour sa consultation.
Cette documentation nous précise que les points d'accès fournissent des données au format JSON, et nous fournit le format de l'URL à laquelle envoyer notre requête pour connaître tous les jours fériés d'une année :
«
» doit être remplacé par l'année de notre choix.Effectuons la requête GET correspondante pour l'année 2020.
Ce code produit l'affichage suivant :
Nous pourrions ensuite facilement extraire et traiter des éléments parmi ces données obtenues via l'API web. L'accès aux données du web sous forme d'API n'est guère plus compliqué que l'accès à des données stockées dans un fichier local.
Les modalités d'interactions varient d'une API à l'autre : certaines sont très simples et proposent uniquement quelques points d'accès en consultation seule, quand d'autres, plus complexes, peuvent comporter de nombreux points d'accès et supporter plusieurs méthodes, afin de non seulement obtenir mais également transmettre ou éditer des données sur le serveur.
Conclusion :
Nous avons abordé la modularité du développement logiciel sous l'angle du découpage de programmes en composants spécialisés ; en montrant d'abord l'utilisation de modules existants, puis la création de tels modules, afin d'enrichir les fonctionnalités natives des langages de programmation.
Nous avons ensuite présenté l'accès web à des modules distants par le biais d'API dont nous avons précisé les caractéristiques techniques et les modalités d'accès, lesquelles varient en fonction des choix opérés par le producteur de la ressource. Nous avons pu constater à l'aide d'un exemple que les API web permettent d'obtenir facilement des données formatées, conçues pour être ensuite traitées par un programme informatique.