« Méthodes de génie logiciel avec Ada/Première partie » : différence entre les versions

Contenu supprimé Contenu ajouté
Aucun résumé des modifications
Aucun résumé des modifications
Ligne 74 :
==Notion de saut sémantique==
 
Le cahier des charges d'un problème informatique représente une description de haut niveau de la solution souhaitée.
solution souhaitée. Un programme est une réalisation particulière du cahier des charges, c'est-à-dire une description de bas niveau d'une solution.
une description de bas niveau d'une solution. La conception, c'est-à-dire le processus permettant de passer d'une description à l'autre, est donc fondamentalement un ''saut sémantique''.
passer d'une description à l'autre, est donc fondamentalement un ''saut sémantique''.
 
Dans un problème simple, un tel saut peut s'accomplir directement : des méthodes intermédiaires sont donc inutiles.
sont donc inutiles. Au fur et à mesure que le problème se complique, la taille du saut sémantique augmente. Rapidement, les limitations intrinsèques de nos capacités intellectuelles ne nous permettent plus de maîtriser ce saut, et il ne devient plus possible de passer directement de l'énoncé du problème à sa solution.
du problème à sa solution. Or que fait-on dans la vie courante lorsque l'on est en présence d'un saut trop important pour pouvoir être effectué directement ?
augmente. Rapidement, les limitations intrinsèques de nos capacités intellectuelles ne nous
On le remplace par une succession de petits sauts (communément appelée ''escalier''), individuellement faisables, et dont la somme permet d'accomplir la descente souhaitée.
permettent plus de maîtriser ce saut, et il ne devient plus possible de passer directement de l'énoncé
De même en génie logiciel, il faudra définir des étapes de conception intermédiaires destinées à abaisser graduellement le niveau sémantique depuis le niveau du cahier des charges jusqu'à celui du langage de programmation.
du problème à sa solution. Or que fait-on dans la vie courante lorsque l'on est en présence d'un saut
trop important pour pouvoir être effectué directement ? On le remplace par une succession de petits
sauts (communément appelée ''escalier''), individuellement faisables, et dont la somme permet
d'accomplir la descente souhaitée. De même en génie logiciel, il faudra définir des étapes de
conception intermédiaires destinées à abaisser graduellement le niveau sémantique depuis le niveau
du cahier des charges jusqu'à celui du langage de programmation.
 
==Surmonter la complexité==
 
Comment faire pour réaliser ces différents «sauts» qui constituent l'essentiel d'une méthode de conception ?
conception ? Le problème, qui n'est pas propre à l'informatique, a été résolu par des moyens connus depuis Descartes :
depuis Descartes :
 
{{BlocCitation|
'' ... diviser chacune des difficultés que j'examinerais en autant de parcelles qu'il se pourrait
''et qu'il serait requis pour les mieux résoudre. [Des37]''<ref>R. Descartes. ''Discours de la méthode.'' Leyde, 1637.</ref>
et qu'il serait requis pour les mieux résoudre.
''et qu'il serait requis pour les mieux résoudre. [Des37]''<ref>|auteur=R. Descartes. ''Discours de la méthode.'' Leyde, 1637.</ref> [Des37]}}
 
Informatiquement parlant, ceci signifie que l'on divisera un programme en modules, qui seront des unités de programme pouvant être considérées individuellement par le programmeur.
''Dans le reste de ce chapitre, nous utiliserons ce terme de «module» pour désigner l'unité de structuration conceptuelle'', même si cela ne correspond pas forcément à la notion informatique de «quantité compilable individuellement».
des unités de programme pouvant être considérées individuellement par le programmeur. ''Dans le''
''reste de ce chapitre, nous utiliserons ce terme de «module» pour désigner l'unité de structuration''
''conceptuelle'', même si cela ne correspond pas forcément à la notion informatique de «quantité
compilable individuellement».
 
Ce que Descartes ne dit pas, c'est le nombre requis de telles divisions (''autant qu'il serait requis…'' voilà qui ne nous avance guère !).
voilà qui ne nous avance guère !). On pourrait croire qu'il suffit de diviser le problème en un grand nombre de modules pour surmonter la complexité.
Or il n'en est rien ; le fait de diviser un programme introduit un niveau de complexité supplémentaire : celui dû aux relations nécessaires entre les parties. Supposons une échelle arbitraire, où 7 représenterait la limite de ce qui peut être raisonnablement fait par une seule personne ; si un programme est de complexité 14, il faudra non pas deux, mais trois personnes pour le résoudre, la troisième étant chargée de gérer la communication entre les deux autres. Ceci va en fait limiter le gain pouvant être obtenu de la décomposition. Considérons en effet deux cas extrêmes :
nombre de modules pour surmonter la complexité. Or il n'en est rien ; le fait de diviser un
programme introduit un niveau de complexité supplémentaire : celui dû aux relations nécessaires
entre les parties. Supposons une échelle arbitraire, où 7 représenterait la limite de ce qui peut être
raisonnablement fait par une seule personne ; si un programme est de complexité 14, il faudra non
pas deux, mais trois personnes pour le résoudre, la troisième étant chargée de gérer la
communication entre les deux autres. Ceci va en fait limiter le gain pouvant être obtenu de la
décomposition. Considérons en effet deux cas extrêmes :
 
* Nombre de modules = 1. Aucune complexité de relation, mais complexité interne au module maximale.
Ligne 382 ⟶ 368 :
end loop;
</syntaxhighlight>
EvidemmentÉvidemment, du point de vue du langage, il y avait de bonnes raisons. La première affectation s'effectuait entre une variable de type Page et une expression de type Mémoire ; comme il s'agissait de deux types différents, l'affectation était interdite. Dans le second cas, on n'affectait que des composants, tous du type Integer, et chacune des affectations était autorisée.
 
Je ne tentai même pas de m'aventurer dans une telle explication, car l'étudiant aurait pensé (comme le lecteur le pense actuellement) que le typage fort ne fait qu'apporter des complications au malheureux utilisateur en l'obligeant à écrire une boucle explicite. La conversation continua comme ceci :