Aller au contenu

Interface et implémentation

Principe

Une structure de données ?

Une structure de données est une collection, une organisation de données en vue de leur utilisation: les listes, les tuples ou les dictionnaires Python sont des exemples de structures.

Dès que la structure est déclarée, il est nécessaire alors de définir les méthodes qui agissent sur ces objets : c'est l'interface qui permet entre autres, de créer la structure, de la modifier, d'afficher son contenu voire de la supprimer...

Création d'une nouvelle interface

On se propose de définir ici une nouvelle structure de données: les polynômes! En mathématiques, les polynômes sont des objets qui s'écrivent commme combinaison de monômes, de la forme \(a_n\times x^n\). Par exemple, \(P(x)=2x^4-5x^2+x-3\) est un polynôme de degré 4. Nous allons définir toute une interface en commençant par réfléchir par l'implémentation de cette structure: comment allons-nous représenter, on dit implémenter, les polynômes en informatique!!?

Nous allons choisir de le réprésenter par une liste Python de telle façon que:

  1. le coefficient \(a_n\) du polynôme \(P\) se trouve au rang \(n\) de la liste.
  2. la longueur de la liste est égale au degré du polynôme plus 1!

Ainsi, le polynôme \(P(x)=2x^4-5x^2+x-3\) est-il représenté par la liste Python P = [-3, 1, -5, 0, 2]!

Nous allons maintenant définir une interface pour cette structure de données.

Une interface

Un ensemble d'informations qui permet de décrire une structure de données ainsi que les méthodes qui agissent sur ces données

Une première proposition.

Interface Instructions Commentaires
Création d'un polynôme de degré \(n\) create_pol(n) Retourne une liste. Par défaut tous les coefficients sont égaux à 0
Affiche le degré du polynome P degre(P) Retourne un entier. Il faut que P existe
Ajout du coefficient \(a_n\) au polynome P ajout_coeff(P, valeur, n) Retourne une liste. Il faut que P existe
Accès aux éléments du polynôme affiche_coeff(P, rang) Retourne un nombre.
{: .tabnsi_long :}

Exercice

Quelles sont les instrutions qui permettent d'implémenter le polynôme \(P(x)=2x^4-5x^2+x-3\)?

On peut enrichir l'interface en créant de nouvelles fonctionnalités, méthodes:

Interface Instructions Commentaires
Évaluation de P pour une valeur de \(x=val\) eval_pol(P, val) Retourne une valeur égale à \(P(val)\).
Somme de deux polynômes somme(p1, p2) Retourne une liste.
Produit de deux polynômes produit(p1, p2) Retourne une liste. Il faut que P existe
{: .tabnsi_long :}

Exercice

  1. Implémenter les deux polynômes \(P_1(x)=5x-3\) et \(P_2(x)=8x^3-5x^2+1\) avec les méthodes précédentes.
  2. Créer les polynômes \(P\) et \(S\) égaux respectivement à la somme et au produit de \(P_1\) et \(P_2\).

La façon dont sont codées les méthodes présentées dans les interfaces, sont a priori invisibles aux yeux de l'utilisateur: on parle d'implémentation d'une méthode lorsqu'on découvre comment est programmée la méthode. Pour une même méthode, il peut exister alors plusieurs implémentations...

En résumé...

L'interface est la partie visible pour qui veut utiliser ce type de données. Elle précise comment utiliser la structure de données sans se préoccuper de la façon dont les choses ont été programmées, c'est-à-dire son implémentation.

Implémenter l'interface

Nous allons implémenter une interface sur les polynômes dans un paradigme fonctionnel. Pour cela suivez le lien ici.

Il est aussi possible d'implémenter dans un paradigme orienté objet mais comprenez que l'interface ne changera pas!

Nous pourrions aussi envisager d'implémenter les polynômes par un dictionnaire où les clés seraient les coefficients et leur valeur, leur rang.

API...birth day!

Une autre interface bien utile, une API!

C'est quoi une API?

Une API (Application Programming Interface), ou interface de programmation, est un ensemble normalisé de briques logicielles grâce auxquelles un système informatique offre des services à d’autres systèmes. Quand nous consultons la météo sur notre smartphone, il utilise l’API du service météo en question. La plupart des applications mobiles sont conçues autour d’une ou plusieurs API.

L’objectif d’une API est de fournir des fonctionnalités, sans révéler le fonctionnement interne de l’application qui fournit les données. C’est en cela qu’on dit qu’une API est en façade : on ne voit pas l’intérieur du bâtiment

Un exemple d'API météo

Le site ici de openweather offre une api pour des informations sur la météo de votre ville. Pour pouvoir l'utiliser il faut utiliser un jeton (Token) fourni lors de l'inscription. Bien que le service soit gratuit, il existe de nombreuses options payantes.

Exercice

Effectuer la requete ci-dessous dans un script python.

  1. Quelle est la nature de la variable data?
  2. Modifiez le code pour obtenir la vitesse du vent et sa direction.
🐍 Script Python
import requests

url = "http://api.openweathermap.org/data/2.5/weather?q=agen&appid=4370f9449a4ab35020f78dffcc0fe303"
content = requests.get(url)
data = content.json()
t = data['main']['temp']
print("La témpérature est de {temp:.2f} degrés C".format(temp = t - 273.15))

On peut aussi effectuer des requêtes en Javascript et modifier ainsi le contenu d'une page web. Ci-dessous, une fonction utilisant une API donnant la position de la station spatiale ISS utilisant des promesses... voir ici pour la spécification de cette API.

JavaScript
function marequete() {
    fetch("http://api.open-notify.org/iss-now.json")
        .then(res => res.json())
        .then(
            function isspos(jsonobj){

                var lat = jsonobj['iss_position']['latitude'];
                var lon = jsonobj['iss_position']['longitude'];
                document.getElementById("latitude").innerText =  lat;
                document.getElementById("longitude").innerText =  lon;
            }
        )
}
Concrètement, une API est constituée d’une bibliothèque logicielle, d’un service web et d’une description qui spécifie comment les clients peuvent interagir avec la plateforme logicielle qui fournit les données, appelée aussi fournisseur.

Un peu de manipulation

De nombreuses API disposent d’un wrapper Python : c’est un module Python qui permet d’interroger la base de données du fournisseur de façon simplifiée, sans avoir à écrire les requêtes Web, ni à interpréter les réponses. Celles-ci sont généralement écrites au format JSON, qui est un format d’échange de données, au même titre que le XML. À partir de ces réponses, le wrapper Python génère des listes ou des dictionnaires, facilement manipulables.

Exercice

On va utiliser l'API Mars Rover Photos disponible à cette adresse .

  1. Générer une clé d'authentification (il existe une clé de démo DEMO_KEY mais qui donne un accès limité...)
  2. Installer le wrapper Python nasaapi(comme un simple module...) ou python-nasa-api documenté ici
  3. Cherchez comment obtenir l'URL de la première photo que le rover Curiosity a prise le 50ième jour martien, avec sa caméra arrière nommée Rear Hazard Avoidance Camera ou simplement RHAZ.
  4. Copier /collez cette URL dans un navigateur WEB pour visualiser cette photo.
  5. À l'aide des données reçues du rover Curioity, donnez:

    • Id de curiosity
    • Sa date de lancement
    • Sa date d'atterissage sur Mars
  6. Utiliser le module webbrowser pour afficher directement les photos trouvées.

🐍 Script Python
# importation du module webbrowser
import webbrowser
# importation du sous-module MarsRovers du module nasaapi
from nasaapi import MarsRovers
# initialisation de la connexion avec l’API et création de l’objet rovers
rovers = MarsRovers(« coller ici la clé API NASA »,« ici le jour» , « NAV-CAM »)
# par exemple rovers = MarsRovers("DEMO_KEY", sols = 1000 , camera = 'fhaz')
# récupération des données de Curiosity (dictionnaire)
cur = rovers.curiosity()
print(cur)
# accès à l’URL de la quatrième photo
# l'URL est contenu dans la variable cur. À vous de l'y extraire.
url_photo = « compléter ici»
# envoi de l’URL dans le navigateur
webbrowser.open_new_tab(url_photo)