ICS3U

Accueil > Programmer avec Java >

Séquence d’exécution avec le code modulaire

Survol et attentes

Définitions
Diagramme de séquence d’exécution
Un diagramme qui identifie les numéros de lignes des instructions selon l’ordre réelle d’exécution (et non l’ordre de déclaration). Les appels de méthode sont indiqués par une flèche de la ligne de l’appel vers la ligne de la signature de la méthode appelée. Le retour (fin) de la méthode est indiqué par une flèche de la ligne de la dernière instruction de la méthode vers la ligne de l’appel.
Appel de procédure
Dans un diagramme de flux : un rectangle avec des lignes de côté doublées qui contient le nom de la méthode. Cette forme représente l’appel de la méthode.
Définition de procédure
Dans un diagramme de flux : commence par un ovale qui contient le nom de la méthode (au lieu de “début”), continue avec les instructions de la méthode et finit par un autre ovale qui contient “fin de [nom de la méthode]” ou “retour”.

Objectifs d’apprentissage

À la fin de cette leçon vous devrez être en mesure de :

Critères de succès

Le code modulaire

Commençons avec un exemple simple1 d’un programme décomposé, d’un programme modulaire.

Fichier : MainClass.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void main() {
    welcome();
    doStuff();
    bye();
}

void welcome() {
    System.out.println("Bienvenue dans mon programme!");
}

void doStuff() {
    System.out.println("On fait des choses utiles ici...");
}

void bye() {
    System.out.println("Bye!");
}

Dans ce programme, comme dans tout programme Java, le programme principal est dans la méthode main. Dans ce cas-ci, le programme principal est très simple. Il appelle trois autres méthodes, welcome, doStuff et bye. On comprend très bien la structure globale du programme. Par la suite, tous les détails du programme se trouvent dans les méthodes individuelles appelées par main. Même si ces détails devenaient plus complexes, la méthode main resterait simple et facile à lire.

Le diagramme de flux

Le même programme est représenté ci-dessous dans un diagramme de flux.

diagramme de flux avec modules

Notez qu’il y a plusieurs séquences d’instructions distinctes dans le diagramme de flux : une pour chaque méthode.

L’algorithme commence toujours avec l’ovale “Début” et se termine avec l’ovale “Fin”. Par contre, on a maintenant un nouveau type de bloc dans le diagramme - un appel de procédure :

appel dans un diagramme de flux

Ce bloc envoie l’exécution du programme à la séquence d’instructions qui commence par le nom inscrit dans le bloc. Quand la séquence d’instructions de la méthode appelée est terminée, l’exécution est retournée au point de l’appel et continue le long des flèches.

On voit aussi que les ovales de début et de fin sont légèrement différents pour les procédures :

  • le mot “Début” est remplacé par le nom de la méthode
  • le mot “Fin” est remplacé par “Fin de [nom de la méthode]” ou “Retourne”

Tracer la séquence d’exécution programme

Chaque appel d’une méthode envoie l’exécution du programme à la signature de la méthode appelée et à travers ses instructions. Quand la méthode appelée se termine, l’exécution est retournée au point de l’appel pour continuer avec le reste du programme.

On peut le voir et le représenter comme suit.

À partir du code

On peut utiliser l’outil Python Tutor pour visualiser l’exécution du programme étape par étape afin de mieux comprendre la mécanique d’appel et de retour de méthodes.

Notez que le code est logiquement identique à celui ci-dessus mais que la version de Java disponible (Java 8) ne permet pas les simplifications de la syntaxe qu’on a avec Java 22. On a donc la déclaration explicite d’une classe et les mots clés static et public pour les méthodes.

Sans un tel outil, on peut tracer manuellement l’éxecution avec un diagramme de séquence d’exécution, soit :

  • une liste des numéros de ligne exécutés dans l’ordre d’exécution;
  • on indente vers la droite avec une flèche pour indiquer un appel de méthode et
  • on revient à gauche avec une autre flèche pour indiquer le retour de la méthode.

Pour notre version de MainClass.java (avec la syntaxe simplifiée), le diagramme de séquence d’exécution serait :

1
2
3
4
5
6
7
8
9
10
11
1
2 -> 7  
     8
2 <- 9 
3 -> 11 
     12
3 <- 13 
4 -> 15 
     16
4 <- 17 
5 

Les lignes suivantes représentent des appels de méthodes :

Appel de welcome :

1
2 -> 7

Appel de doStuff :

1
3 -> 11

Appel de bye :

1
4 -> 15

Les lignes suivantes représentent les retours de méthodes :

Retour de welcome :

1
2 <- 9

Retour de doStuff :

1
3 <- 13

Retour de bye :

1
4 <- 17

Notez que l’appel et le retour reviennent à la même ligne dans le diagramme de séquence, soit 2 appel welcome et welcome retourne à 2, etc.

Dans Python Tutor, on sautait les lignes de signature durant l’appel et la ligne appelante lors du retour. C’est parce que nos procédures n’ont pas de paramètres et ne retournent pas de valeur en se terminant alors il n’y avait rien à visualiser pour ces lignes. On voit les paramètres et les valeurs de retour dans une prochaine leçon.

Notez aussi que durant l’exécution des méthodes appelées, les numéros de ligne sont identées au même niveau que la signature de la méthode afin de distinguer ces instructions des instructions de la méthode appelante.

À partir du diagramme de flux

On peut aussi tracer la séquence d’exécution à partir du diagramme de flux. On y ajoute manuellement plus de flèches!

diagramme de flux avec modules

Encore une fois, comme avec le diagramme de séquence d’exécution, l’appel et le retour se font à partir du même bloc dans le diagramme de flux.

Exercices

🛠️ Pratique

Travaillez dans le répertoire GitHub partagé par votre enseignant pour la pratique et les exercices

  1. Pour le programme ci-dessous dans un fichier nommé ModularSequence.java :
    1. Créez le diagramme de séquence d’exécution dans un commentaire de bloc à la fin du programme.
    2. Ajoutez un astérisque (*) à la fin de chaque ligne du diagramme de séquence d’exécution où il y a une instruction d’affichage.
    3. Dans un deuxième commentaire de bloc à la fin du programme, documentez ce que le programme affiche à la console durant l’exécution. Comparez cette sortie avec le diagramme de séquence d’exécution et l’ordre des lignes avec des astérisques. Est-ce que c’est cohérent? Si non, revoyez votre diagramme de séquence d’exécution pour trouver où vous avez fait une erreur.
    4. Créez le diagramme de flux dans le dossier diagrammes dans un fichier nommé modular-flux.drawio.
    5. Créez le diagramme de dépendances (voir la leçon précédente) dans un fichier nommé modular-dependancy.drawio. Utilisez main comme le bloc de départ.

ModularSequence.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void main() {
    System.out.println("Bienvenue!");
    a();
    b();
}

void a() {
    c();
    System.out.println("bleu");
}

void b() {
    System.out.println("blanc");
    a();
}

void c() {
    System.out.println("rouge");
}
  1. Exemple applicant les classes implicites et le main d’instance de JEP 463 (pleinement intégré aux outils Java22+)