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
mainpour 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 :

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

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 :

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 :

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

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 :

Diagramme de dépendances :

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 :

Les modules se suivent dans un ordre logique.
Diagramme de dépendances :

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 :

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.
- 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:- Créez un diagramme de dépendances pour ces modules nommé
modules_repas-dependancy.drawio - Créez un diagramme de flux pour ces modules nommé
modules_repas-flux.drawio.
- Créez un diagramme de dépendances pour ces modules nommé