Keyboard shortcuts

Touchez ← ou → pour naviguer les chapitres

Touchez S ou / pour chercher dans le livre

Touchez ? pour afficher ce message

Touchez Esc pour masquer ce message

Accueil > Programmer avec Java >

đŸ› ïž DĂ©composition des problĂšmes

Survol et attentes

MĂȘme sans connaissances en programmation, vous ĂȘtes capable de dĂ©composer des grands problĂšmes en plus petits problĂšmes. C’est une compĂ©tence essentielle pour la programmation et pour la rĂ©solution de problĂšmes en gĂ©nĂ©ral. En particulier, Ă  l’ùre de l’intelligence artificielle, votre capacitĂ© Ă  dĂ©crire les morceaux individuels d’un problĂšme complexe vous permettra de tirer le plus grand profit des outils de rĂ©daction de code, surtout si vous commencez par la rĂ©daction des mĂ©thodes au bas de chaque chaĂźne d’appels.

Définitions
Modulaire
Un programme est dit modulaire quand il est divisĂ© en parties indĂ©pendantes qui peuvent ĂȘtre rĂ©utilisĂ©es. Les mĂ©thodes sont les “modules” les plus simples dans un programme Java.
Décomposition / Approche descendante
StratĂ©gie de rĂ©solution de problĂšmes qui consiste Ă  diviser un problĂšme complexe en plus petits problĂšmes plus faciles Ă  rĂ©soudre. L’approche de partir du problĂšme global et de le diviser en plus petits problĂšmes est appelĂ©e approche descendante. En programmation, on peut utiliser des commentaires de ligne pour crĂ©er des sections dans la mĂ©thode main pour chaque partie de la solution mais on utilise gĂ©nĂ©ralement une mĂ©thode sĂ©parĂ©e pour chacun de ces sous-problĂšmes.
Déclarer
DĂ©finir de façon plus ou moins formelle les Ă©lĂ©ments (Ă©tapes/mĂ©thodes) Ă  inclure dans un plan pour la rĂ©alisation d’un projet, la structure d’un programme, etc. Une dĂ©claration informelle est souvent juste un titre ou une courte description. Quand le plan est basĂ© sur la dĂ©composition, les Ă©lĂ©ments sont les diffĂ©rents “modules” (Ă©tapes / mĂ©thodes) de la solution complĂšte.
Diagramme de dépendances
Diagramme indiquant la relation entre les Ă©tapes/modules/mĂ©thodes de la solution Ă  un problĂšme . Les mĂ©thodes sont des blocs nommĂ©s. Si une mĂ©thode a une flĂšche sortante vers une autre mĂ©thode, elle dĂ©pend de cette autre mĂ©thode. Si une mĂ©thode n’a aucune flĂšche sortante, elle est indĂ©pendante.
Chaüne d’appels
Une suite de flĂšches dans le diagramme de dĂ©pendances, du dĂ©but (souvent la mĂ©thode main) jusqu’à la fin (un bloc qui n’a pas de flĂšche sortante).
Refactoriser
En programmation, ce terme veut dire restructurer le code pour le rendre plus lisible, plus efficace ou plus facile Ă  maintenir. SĂ©parer un morceau de code plus long et complexe en mĂ©thodes distinctes (le dĂ©composer) aprĂšs l’avoir Ă©crit est un exemple de refactorisation qui rend le code plus facile Ă  lire, Ă  tester, Ă  rĂ©utiliser et Ă  modifier.

Objectifs d’apprentissage

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

  • DĂ©crire un programme modulaire.
  • DĂ©cire la dĂ©composition d’un problĂšme avec une approche descendante.
  • ReprĂ©senter les Ă©tapes d’un problĂšme dĂ©composĂ© avec un diagramme de dĂ©pendances.
  • Identifier les dĂ©pendances entre les modules selon les chaĂźnes d’appels.

CritĂšres de succĂšs

  • Je suis capable d’utiliser une approche descendante pour planifier les Ă©tapes de mon projet.
  • Je peux crĂ©er un diagramme de dĂ©pendances pour un programme dĂ©composĂ©.
  • Je peux refactoriser un programme en modules appropriĂ©s pour le rendre plus facile Ă  lire, tester et maintenir.

Un programme modulaire

Au dĂ©but d’une tĂąche de programmation, on peut penser Ă  notre solution comme un seul programme :

programme monolithique

Par contre, on a souvent à faire au moins les trois étapes suivantes dans chaque programme qui interagit avec un utilisateur :

programme modulaire

Si on connaĂźt les dĂ©tails de la tĂąche, on peut probablement diviser l’étape “Actions” encore selon les diffĂ©rentes tĂąches Ă  rĂ©aliser :

programme plus modulaire

Ce qu’on vient de faire est une dĂ©composition du problĂšme selon une approche descendante : on a pris un problĂšme complexe et on l’a divisĂ© en plus petits problĂšmes. Chaque petit problĂšme est plus facile Ă  rĂ©soudre que le problĂšme global.

En programmation, on peut utiliser des méthodes pour résoudre chaque petit problÚme.

Un projet modulaire

On peut appliquer la mĂȘme approche Ă  la planification d’un projet dans n’importe quelle domaine.

Par exemple, un projet de recherche qui commence comme ceci :

projet

Peut ĂȘtre dĂ©composĂ© en Ă©tapes comme ceci :

projet modulaire

Voyant les Ă©tapes exposĂ©es comme ça, on peut mieux prĂ©voir le temps nĂ©cessaire ou mieux s’organiser en Ă©quipe pour rĂ©partir les tĂąches.

Diagramme de dépendances

Certaines Ă©tapes ou modules d’un projet ne peuvent pas se faire sans que d’autres ne soient complĂ©tĂ©es. Un diagramme de dĂ©pendances illustre ces relations entre les modules.

On a déjà vu un diagramme de flux (qui montre la séquence des étapes) dans une leçon précédente. Un diagramme de dépendances est différent sur plusieurs points :

  • Il ne montre pas ce qui se passe dans les dĂ©tails mais identifie seulement les “modules” ou les â€œĂ©tapes” du projet.
  • Il ne montre pas l’ordre d’exĂ©cution mais plutĂŽt quelle Ă©tape dĂ©pend de quelle autre Ă©tape.

Le projet de recherche

Ici on compare les deux types de diagrammes pour le projet de recherche :

Diagramme de flux :

flux du projet

Diagramme de dépendances :

dépendances du projet

Avez-vous remarquĂ© que la direction des flĂšches est inversĂ©e entre les deux diagrammes? C’est parce que le diagramme de dĂ©pendances commence avec le projet complet et regarde ce qui est nĂ©cessaire pour le rendre
 rĂ©ponse : que le projet soit rĂ©digĂ©. Et pour rĂ©diger le projet, on a besoin de quoi?
 rĂ©ponse : les notes de recherche. Et pour faire les notes, on a besoin de quoi?
 rĂ©ponse : les sources d’information, etc. Ici les flĂšches indiquent les dĂ©pendances. Si on a une flĂšche de A vers B, ça veut dire que A dĂ©pend de B.

Dans le diagramme de flux, c’est l’opposĂ© : on commence avec la premiĂšre Ă©tape Ă  rĂ©aliser. Ensuite, on regarde ce qui doit se passer aprĂšs. Et aprĂšs, et aprĂšs, jusqu’à la fin du projet. Si on a une flĂšche de A vers B, ça veut dire que B est l’étape qui suit A.

C’est naturel que les flĂšches soient inversĂ©es entre les deux diagrammes. Si A dĂ©pend de B, alors A doit attendre que B soit fait. Cela nous donne :

  • flĂšche de dĂ©pendance de A vers B
  • flĂšche de sĂ©quence de B vers A

Le programme modulaire

Maintenant on fait le mĂȘme exercice pour le programme modulaire :

Diagramme de flux :

flux du programme

Les modules se suivent dans un ordre logique.

Diagramme de dépendances :

dépendances du programme

Le programme dépend des modules Accueil, Actions et Au revoir qui sont indépendants entre eux (aucune flÚche). Il y a aussi Actions qui dépend des modules Tùche 1, Tùche 2, 
 qui sont aussi montrés comme indépendants entre eux.

Ici la relation entre les deux types de diagrammes n’est pas aussi claire. Entre autres, on ne peut pas regarder le diagramme de flux et savoir, avec certitude, si une Ă©tape dĂ©pend de l’étape prĂ©cĂ©dante ou non. De l’autre cĂŽtĂ©, il n’y a aucun lien direct entre les “modules” Accueil, Actions et Au revoir dans le diagramme de dĂ©pendances alors rien ne suggĂšre une sĂ©quence sauf notre expĂ©rience qu’un accueil vient avant un au revoir.

En général, on produit chaque type de diagramme indépendamment en appliquant les concepts de chacun :

  • le diagramme de flux montre toujours la sĂ©quence d’exĂ©cution des Ă©tapes;
  • le diagramme de dĂ©pendances montre les dĂ©pendances entre les diffĂ©rents modules.

Chaünes d’appels

Dans les diagrammes de dĂ©pendances, les modules sont liĂ©es dans des chaĂźnes de dĂ©pendance. Les modules en programmation sont souvent des mĂ©thodes. Dans ce contexte on parle de chaĂźnes d’appels, parce qu’une mĂ©thode doit appeller les autres mĂ©thodes qu’elle a besoin d’utiliser.

Si une mĂ©thode Ă  plusieurs dĂ©pendances, il y a des branches qui se forment dans le diagramme, crĂ©ant autant de chaĂźnes d’appels que de branches. Notre exemple de programme modulaire a donc ces cinq chaĂźnes d’appels car la mĂ©thode Actions dĂ©pend de trois mĂ©thodes, triplant le nombre de chaĂźnes passant par elle :

chaünes d’appels

Au dĂ©but d’une chaĂźne d’appels (le bloc avec aucune flĂšche entrante), on a la mĂ©thode dĂ©pendante d’une autre. À la fin d’une chaĂźne d’appels, on a une mĂ©thode qui n’a pas de dĂ©pendances (aucune flĂšche sortante), qui est indĂ©pendante.

Si on veut profiter pleinement de la dĂ©composition (plusieurs problĂšmes plus simples au lieu d’un grand problĂšme), on ne peut pas commencer par Ă©crire les instructions pour les mĂ©thodes dĂ©pendantes car il faudra aussi immĂ©diatement Ă©crire les instructions pour toutes les autres mĂ©thodes plus bas dans la chaĂźne d’appels (la premiĂšre mĂ©thode dĂ©pend d’eux)
 on n’a pas vraiment simplifiĂ© notre tĂąche! Par contre, si on commence avec une des mĂ©thodes indĂ©pendantes, on peut Ă©crire le code juste pour cette mĂ©thode et la tester. On a juste un petit problĂšme Ă  rĂ©soudre. Ensuite, on peut soit choisir une autre mĂ©thode indĂ©pendante Ă  faire ou bien la prochaine mĂ©thode plus haut dans la chaĂźne d’appels. Dans chaque cas, on reste avec juste un petit problĂšme Ă  rĂ©soudre dans l’immĂ©diat. Mais peu Ă  peu, tous les modules du projet se rĂ©alisent.

Refactoriser - quand on a déjà tout écrit

Parfois on n’a pas prĂ©vu dĂ©couper notre programme en plus petites mĂ©thodes, mais la taille du programme ou sa complexitĂ© ou le besoin de rĂ©utiliser plusieurs fois le mĂȘme code nous pousse Ă  le faire. RĂ©organiser le code sans changer son comportement s’appelle refactoriser. Il n’y a pas de planification, juste un besoin pressant pour la dĂ©composition, pour la crĂ©ation de modules.

La plupart du temps, surtout en commençant Ă  programmer, c’est dur de savoir quand quelque chose sera trop complexe avant de l’avoir Ă©crit, alors la refactorisation est souvent ce qui motive les premiĂšres expĂ©riences avec le code modulaire.

Exercices

đŸ› ïž Pratique

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

Assurez-vous d’avoir installĂ© l’extension “Draw.io Integration” pour VS Code pour Ă©diter les fichiers .drawio.

  1. Pour la grande tĂąche de “prĂ©parer un repas” avec les modules “prĂ©parer la table”, “cuisiner”, “servir le mets principal”, “servir le dessert”, “remplir les breuvages” et “nettoyer”, dans votre dossier diagrammes :
    1. Créez un diagramme de dépendances pour ces modules nommé modules_repas-dependancy.drawio
    2. Créez un diagramme de flux pour ces modules nommé modules_repas-flux.drawio.

© 2022-2025 David Crowley