Les fonctions et la programmation orientée objet
Introduction
Comme dit au chapitre L’histoire de l’algorithmique, une fonction est une boîte contenant un bloc réutilisable d’instructions prêtes à l’emploi.
Dans un programme, on utilise des fonctions comme raccourci, pour alléger le code. Le programme sait à quel bloc d’instructions déjà créé une certaine fonction fait référence.
Un programmeur, ça DRY
DRY est un acronyme anglophone qui signifie Don’t Repeat Yourself (Ne vous répétez pas). La traque et l’élimination du code répétitif sont une bonne pratique de programmeur pour réduire la taille des programmes.
Un programme qui grandit a la fâcheuse tendance à se remplir de répétitions. Prenons l’exemple d’un programme qui pose plusieurs fois une question et attend une réponse valant "Oui" ou "Non" :
Algorithme : Oui ou Non ?
Variables :
chaine : reponse1, reponse2, reponse3
Début :
Afficher "Voulez-vous devenir développeur ?"
Saisir reponse1
Tant que reponse1 <> "Oui" OU reponse1 <> "Non"
Afficher "Merci de répondre par Oui ou Non"
Saisir reponse1
Afficher “Vous avez répondu :”, reponse1, “à la question”
Afficher "Habitez-vous à la campagne ?"
Saisir reponse2
Tant que reponse2 <> "Oui" OU reponse2 <> "Non"
Afficher "Merci de répondre par Oui ou Non"
Saisir...
Écrire une procédure
Pour écrire une procédure, on regroupe les instructions dans une boîte, et on y fait référence pour exécuter le contenu de la procédure.
Procédure HelloWorld()
entier : i
chaine : message
message ← "Bonjour le monde !"
Pour i allant de 1 à 5 avec un pas de 1
Afficher message
Cette première procédure affiche cinq fois le message "Bonjour le monde !"
Comme le montre cet exemple, une procédure commence par le mot-clé Procédure. Nous indiquons ensuite son nom suivi d’une paire de parenthèses (). À l’intérieur de la procédure, nous indiquons les variables internes nécessaires à son fonctionnement, ici l’entier i qui sert de compteur pour la boucle Pour. Cette boucle affiche ensuite cinq fois le message voulu.
Nous pouvons appeler la procédure dans un algorithme comme ceci :
Algorithme : Utilisation d'une procédure pour afficher un message
plusieurs fois
Début :
HelloWorld()
Fin
Le programme se contente de lancer la procédure HelloWorld(), ce qui a pour effet d’afficher cinq fois le message "Bonjour le monde !". Plus besoin de copier à plusieurs endroits...
Les paramètres
Une procédure utilise des variables en son sein, par exemple l’entier i et la chaîne message. C’est ce qu’on appelle des variables locales. Pourquoi locales ? Parce que ces variables ne sont pas accessibles depuis l’extérieur de la procédure. On ne peut les modifier qu’à l’intérieur de la procédure. Attention : il s’agit d’une règle très importante. On ne peut donc pas modifier la valeur du message sans changer la procédure elle-même... sauf si l’on passe le message en paramètre de la procédure. Qu’est-ce qu’un paramètre ? Un paramètre représente une valeur qu’on place à l’intérieur des parenthèses lors de l’appel de la procédure :
Procédure HelloWorld(paramètre)
Un paramètre se comporte comme une variable que la procédure peut intégrer en son sein pour effectuer un traitement. Nous allons nous en servir pour indiquer le message que nous voulons afficher cinq fois :
Algorithme : Passage d'un paramètre
Procédure procedureAvecParametre(chaine : message)
entier : i
Pour i allant de 1 à 5 avec un pas de 1
Afficher message
Début :
procedureAvecParametre(“Bonjour...
Écrire une fonction
Une fonction est un type particulier de procédure. À la différence des procédures, les fonctions transmettent des valeurs au programme pour qu’il les utilise. On dit qu’elles renvoient ou retournent des valeurs.
Nous voulons écrire un programme qui calcule la valeur du carré d’un nombre :
Algorithme : Carré d'un nombre
Fonction carre(entier : x)
Retourner x * x
Début :
Afficher carre(2) + 38
Fin
Cette fonction prend en paramètre une valeur entière x. Cette valeur est multipliée par elle-même pour donner son carré et le retourner lors de l’appel de la fonction. Autrement dit, le programme remplace carre(2) par la valeur du calcul, c’est-à-dire 4 (le carré de 2). Et puisqu’il s’agit d’un nombre entier, on peut l’additionner à un autre nombre, ici 38, et afficher le résultat : 42. Ce mécanisme de récupération des valeurs des fonctions est très pratique quand on programme.
Une fonction possède donc les mêmes mécanismes que les procédures. Nous pouvons donc faire ceci :
Algorithme : Imbrication de carrés
Fonction carre(entier : x)
Retourner...
Les fonctions dans les langages de programmation
Les procédures et les fonctions sont des éléments de base de la quasi-totalité des langages de programmation. Elles sont donc présentes en Python et en JavaScript. La plupart du temps, on les désigne indistinctement sous le nom de fonction. D’ailleurs, les langages de programmation donnent accès à un ensemble de fonctions de base. Par exemple, dans la bibliothèque standard de Python (le programme de base qui vient avec le langage Python et son interpréteur), il y a un certain nombre de fonctions précodées qui sont fournies :
-
print : permet d’afficher un message à l’écran.
-
help : donne accès à la documentation d’une fonction ou d’un objet (à quoi il sert, comment l’utiliser…).
-
type : permet de connaître le type d’une variable.
-
Etc.
Nous pouvons évidemment créer nos propres fonctions selon nos besoins. Voici par exemple le code Python et JavaScript permettant de créer les algorithmes décrits précédemment.
-
HelloWorld
Le code Python :
def HelloWorld():
for i in range(1, 6):
print("Bonjour le monde !")
HelloWorld()
Le code JavaScript :
<!DOCTYPE html>
<html> ...
Utiliser des fonctions déjà existantes
Nous venons de voir comment créer des fonctions en Python et en JavaScript. Mais nous avons également indiqué qu’il existe des fonctions précodées et nous en avons utilisé, par exemple pour afficher des messages (print() en Python et alert() en JavaScript). Y a-t-il d’autres fonctions déjà créées de ce genre ? La réponse est oui, il y en a des myriades !
1. Cas du langage Python
Ces fonctions sont incluses par défaut dans les langages de programmation, ce qui fait que nous n’avons pas à les recréer. Il suffit de faire appel à elles pour les utiliser. En Python, ces fonctions font partie de ce qu’on appelle la bibliothèque standard, cette dernière étant constituée de modules qui à leur tour contiennent la définition des fonctions. Il est parfois nécessaire d’importer le module dans lequel se trouvent les fonctions. En effet, même si les fonctions se trouvent dans la bibliothèque standard, Python ne les charge pas par défaut pour ne pas s’alourdir inutilement.
Voici cinq méthodes permettant d’importer une ou plusieurs fonctions depuis un module en Python :
# Importation de module
# Méthode 1
import mon_module
mon_module.ma_fonction()
# Méthode 2
import mon_module as mdl
mdl.ma_fonction()
# Méthode 3
from mon_module import ma_fonction
ma_fonction()
# Méthode 4
from mon_module import ma_fonction1, ma_fonction2
ma_fonction1()
ma_fonction2()
# Méthode 5
from mon_module import *
ma_fonction()
La méthode 1 importe le module mon_module. Elle implique de préfixer le nom des fonctions du module avec le nom du module suivi d’un point, comme ceci : mon_module.ma_fonction().
La méthode 2 fait la même chose sauf qu’on renomme le nom du module en mdl pour ne pas avoir à le réécrire en entier à chaque fois (on saisit trois caractères plutôt que dix, soit pour un gain de temps de 2 secondes au moins, ce qui est non négligeable).
La méthode 3 commence par sélectionner...
La programmation orientée objet
La programmation orientée objet (POO) permet d’aller encore plus loin dans le DRY. Il s’agit d’un paradigme de programmation, autrement dit d’une façon de programmer, qui fait intervenir des concepts tels que les classes, l’héritage, le polymorphisme et l’encapsulation.
Comme dit précédemment, les fonctions permettent de raccourcir le code. Mais quand un programme grandit, un nombre important de fonctions peut rendre le programme difficile à maintenir. Il faut par exemple se montrer prudent lorsqu’on modifie une fonction qui interagit avec de nombreuses variables ou d’autres fonctions. L’approche orientée objet pallie à ce problème en permettant d’obtenir un code plus maintenable et plus court que la programmation classique. Pour y arriver, elle fait interagir, non pas des fonctions entre elles, mais des objets entre eux. Qu’est-ce qu’un objet ?
Le site W3Schools explique ceci : "En JavaScript, les objets sont les rois. Si vous comprenez les objets, vous comprenez JavaScript." Cette phrase est également vraie pour de nombreux autres langages orientés objet parmi lesquels Python. Un objet est une entité (un concept) qui possède des attributs et des méthodes. Un attribut est une caractéristique de cet objet, et une méthode est une action qui peut être effectuée par cet objet. Une méthode n’est rien d’autre qu’une fonction associée à un objet particulier.
Voici comment la plupart des langages de programmation permettent d’accéder aux attributs et aux méthodes d’un objet :
-
objet.attribut
-
objet.methode()
C’est ce que nous faisons quand nous écrivons variable.lenght en JavaScript par exemple.
Les objets sont partout autour de vous. Ce livre est un objet, votre voiture est un objet, vous êtes un objet. En fait, tout est un objet, dans le sens où tout peut être conceptualisé comme tel. Et tout au long d’une journée, vous interagissez avec des objets. Le matin, vous appuyez sur l’objet réveil pour l’arrêter, ensuite vous sortez de l’objet lit pour vous rendre dans l’objet douche, et pour aller au travail, vous montez dans l’objet...