Nous continuons notre préparation pour le projet Epicrafter’s Journey en complétant notre boîte à outils.
Marc revient vers vous et nous demande de progresser :
Après avoir vu la notion de variable, il est temps d’apprendre à exécuter des traitements grâce aux fonctions. C’est l’heure d’aller de l’avant !
Ni une ni deux, vous vous plongez dans cette nouvelle thématique !
Découvrez les fonctions
Une fonction possède :
Une signature (on dit aussi prototype)
Une implémentation, ce qui correspond aux instructions exécutées.
La signature d’une fonction suit un schéma standard en 5 éléments :
La visibilité | Cet élément influence les zones de code qui seront en droit d’exécuter la fonction. |
Une caractéristique | Le comportement d’une fonction peut être altéré par cet élément. Plusieurs mots-clés Java sont applicables ici comme final ou static. Nous y reviendrons. |
Le type retour | Une fonction peut retourner ou non une valeur. Comme le langage Java est typé il faut définir à l’avance quel type de donnée sera renvoyé. |
Le nom | Le nom sera utilisé pour exécuter la fonction au moment voulu. J'encourage l'utilisation de nom à forte valeur sémantique et à la notation Camel case. |
Les paramètres | Une fonction peut recevoir des données en entrée. Ces données seront alors exploitées durant le traitement. |
Voici un exemple :public static void main(String[] args)
Mais nous l’avons déjà vu cette fonction !
Absolument, maintenant nous sommes en mesure d'interpréter sa signature :
la visibilité : public
la caractéristique : static.
le type retour : void
le nom : main
les paramètres : String[] args
Certaines de ses notions sont directement liées à la programmation orientée objet que l’on étudiera plus tard dans le cours.
Pour l’instant, vous pouvez considérer que la visibilité public permet à notre fonction d’être exécutées depuis d’autres fichiers et que le mot-clé static nous simplifie l’appel de la fonction. D’ailleurs nous utiliserons ces deux aspects tout au long du chapitre.
Et comment fait-on appel à une fonction ?
Excellente question ! Étant donné que nous utilisons pour l’instant des méthodes statiques, alors la syntaxe est : [Nom de classe].[Nom de la méthode]. Par exemple, si une fonction nommée test est codée dans une classe nommée Main, le code seraMain.test();
Allez, passons à la pratique !
Écrivez une première fonction simple
Je vous propose d'écrire une fonction qui :
N'aura pas de paramètres.
N'aura pas de type retour.
Aura pour nom : affiche.
Affiche le texte “Une fonction en Java a été exécutée” dans la console.
Sauriez-vous définir la signature ? Allez je vous aide ce coup-ci : public static void affiche()
Et que dire de son implémentation ? La voici :
public static void affiche() {
System.out.println(“Une fonction en Java a été exécutée”);
}
Pour rappel l’instruction System.out.println() permet d’afficher dans la console du texte comme vu lors d’une démonstration précédente.
Écrivez une fonction paramétrée
Cela a l’air simple en fait Java. Rassurez-moi, il y a moyen de faire des choses plus compliquées ?
Je l'admets : c'était vraiment une fonction simple. Alors ajoutons un peu de complexité avec les paramètres. Reprenons la fonction précédente et faisons en sorte que le texte affiché dans la console soit récupéré en paramètre de la fonction :
public static void affiche(String texte) {
System.out.println(texte);
}
Notez que le paramètre est écrit entre les parenthèses de la fonction.
On dirait une variable, non ?
Je vois que vous êtes de fins observateurs. Absolument ! Un paramètre n’est rien d’autre qu’une variable et sera donc composé d’un type et d’un nom. La portée de la variable est la fonction. En dehors de la fonction impossible d’y accéder.
Voyons un autre exemple dans la démonstration suivante :
Pas mal, n’est-ce pas ? Nous pouvons retenir :
Qu’une fonction peut avoir plusieurs paramètres.
Qu’une fonction peut retourner une valeur grâce au mot-clé return.
Que le mot-clé final peut être mis devant un paramètre. C’est une bonne pratique de programmation car un paramètre d’entrée n’a pas pour vocation à être modifié par la fonction.
Voici le code écrit :
public static int addition(final int entier1, final int entier2) {
return entier1 + entier2;
}
Écrivez une fonction récursive
Voyons à présent une certaine catégorie de fonctions : les fonctions récursives.
Une fonction récursive est une fonction qui s'appelle elle-même !
Dans quelle situation est-ce nécessaire ?
Principalement lorsque l’on souhaite éviter un code répétitif pour exécuter une chaîne de traitement où chaque traitement est le même mais avec des paramètres d’entrée différents. Voici un exemple :
Decompte(valeur) {
Affiche la valeur
Appel Decompte(valeur-1)
}
J’ai volontairement écrit en pseudo-code ici pour que vous vous concentriez sur la logique du traitement et non sur la syntaxe du Java. Le but de cette fonction est de réaliser un décompte. À chaque fois qu’on rentre dans la fonction on affiche la valeur puis on appelle la même fonction en transmettant en paramètre la valeur moins un. Ainsi chaque appel aura un résultat différent.
Mais ce code a un problème ! Il s’exécutera sans fin (ou plutôt jusqu’à ce qu’on ait consommé toute la mémoire disponible pour notre application). Pour résoudre ce point, une fonction récursive doit avoir un critère d’arrêt. Complétons la fonction :
Decompte(valeur) {
Si la valeur est supérieure ou égale à 0
Alors
Affiche la valeur
Appel Decompte(valeur-1)
}
Au moment où la valeur attendra -1 alors la fonction ne s’appellera plus elle-même et le traitement sera arrêté.
Voici le code en Java :
public static void decompte(final int valeur) {
if(valeur >= 0) {
System.out.println(valeur);
decompte(valeur-1);
}
]
On n'a pas vu cette instruction if, c’est quoi ?
En effet ! Comme critère d’arrêt j’ai utilisé ce qu’on appelle une condition en programmation. Suivez-moi dans le prochain chapitre pour que je vous explique précisément ce point.
À vous de jouer
Contexte
Marc :
Alors tu t’en sors avec les fonctions ? Tiens, je te propose un exercice de programmation. Essaye de créer une fonction paramétrée qui permet d’afficher un texte dans une console. Je vais t’écrire une consigne.
Dans le même projet que pour le chapitre précédent, complétez le code en suivant la consigne suivante.
Consignes
Ajoutez une nouvelle fonction nommée affichage qui prend un texte en paramètre et qui n’a pas de type retour.
La fonction concatène la variable passée en paramètre avec le mot “Bonjour “ puis affiche dans la console le résultat.
Dans la fonction principale main appelez la fonction affichage en passant en paramètre le texte “Marty”.
Le résultat dans la console sera :
En résumé
Une fonction permet d’exécuter une suite d’instructions.
Une fonction possède une signature décomposable en plusieurs éléments (visibilité, caractéristique, type retour, nom, paramètres).
L’implémentation de la fonction est écrite entre { }
Utiliser des variables et exécuter des fonctions sont une base indispensable. Maintenant voyez d’autres outils pour manipuler nos variables au sein des fonctions !