{"id":47,"date":"2021-05-29T13:43:42","date_gmt":"2021-05-29T13:43:42","guid":{"rendered":"https:\/\/www.louismarchand.me\/?page_id=47"},"modified":"2022-01-26T19:19:19","modified_gmt":"2022-01-26T19:19:19","slug":"les-routines","status":"publish","type":"page","link":"https:\/\/www.louismarchand.me\/index.php\/les-routines\/","title":{"rendered":"Les routines"},"content":{"rendered":"<h2>D\u00e9finitions<\/h2>\n<h3>La routine<\/h3>\n<p>On appel <strong>routine<\/strong> (ou <strong>sous-routine<\/strong> ou <strong>sous-programme<\/strong>) permet d&rsquo;encapsuler une portion de code (ou s\u00e9rie d&rsquo;instructions) effectuant un travail bien pr\u00e9cis. La <strong>routine<\/strong> est identifi\u00e9e et peut \u00eatre ex\u00e9cut\u00e9e une multitude de fois \u00e0 plusieurs endroits dans le code d&rsquo;un programme.<\/p>\n<h3>Appel de routine<\/h3>\n<p>Lorsqu&rsquo;une premi\u00e8re routine ex\u00e9cute une autre routine, on dit que la premi\u00e8re routine effectue un <strong>appel<\/strong> de routine (ou que la premi\u00e8re routine <strong>appel<\/strong>le l&rsquo;autre routine.<\/p>\n<p>Par exemple, si j&rsquo;ai la routine A et la routine B; je peux dire que A appel B si al routine A lance l&rsquo;ex\u00e9cution de la routine B.<\/p>\n<p>\u00c9galement, lorsqu&rsquo;une routine A appel une routine B, on dit que la routine A est la routine <strong>appelante<\/strong> et que la routine B est la routine <strong>appel\u00e9e<\/strong>.<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">maRoutineA<\/span><span class=\"p\">(){<\/span>\r\n    <span class=\"p\">...<\/span>\r\n    <span class=\"n\">maRoutineB<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">...<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">maRoutineB<\/span><span class=\"p\">(){<\/span>\r\n    <span class=\"p\">...<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<h2>Les variables locales<\/h2>\n<p>Les routines peuvent utiliser des variables locales afin de lui permettre d&rsquo;effectuer un travail plus complexe et d&rsquo;avoir un code plus propre. Il est par contre important de noter que ces variables locales ne sont accessibles qu&rsquo;\u00e0 l&rsquo;int\u00e9rieur de la routine et les valeurs plac\u00e9es dans ces variables locales ne restent pas sauvegard\u00e9es entre les diff\u00e9rents appels de routine. En d&rsquo;autres mots, ces variables sont cr\u00e9\u00e9es au d\u00e9but de l&rsquo;ex\u00e9cution d&rsquo;une routine et sont d\u00e9truites \u00e0 la fin de l&rsquo;ex\u00e9cution de cette derni\u00e8re. Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">salutation<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">Scanner<\/span> <span class=\"n\">lScanner<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Scanner<\/span><span class=\"p\">(<\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">in<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">String<\/span> <span class=\"n\">lPrenom<\/span><span class=\"p\">,<\/span> <span class=\"n\">lNom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Veuillez entrer votre prenom: \"<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">lPrenom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lScanner<\/span><span class=\"p\">.<\/span><span class=\"na\">nextLine<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Veuillez entrer votre nom: \"<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">lNom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lScanner<\/span><span class=\"p\">.<\/span><span class=\"na\">nextLine<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Bonjour \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lPrenom<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lNom<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Dans cet exemple, la routine \u00ab\u00a0salutation\u00a0\u00bb poss\u00e8de 3 variables locales: \u00ab\u00a0lScanner\u00a0\u00bb, \u00ab\u00a0lPrenom\u00a0\u00bb et \u00ab\u00a0lNom\u00a0\u00bb.<\/p>\n<h2>Les arguments<\/h2>\n<p>Il est parfois n\u00e9cessaire, pour une routine, d&rsquo;avoir acc\u00e8s \u00e0 certaines valeurs afin de bien faire le travail qu&rsquo;elle doit ex\u00e9cuter. Afin que la routine appelante puisse transmettre ces valeurs vers la routine appel\u00e9e, on utilise g\u00e9n\u00e9ralement des <strong>arguments<\/strong>. La routine appel\u00e9e doit sp\u00e9cifier les <strong>arguments<\/strong> qu&rsquo;elle n\u00e9cessite dans sa signature et la routine appel\u00e9e doit passer ces <strong>arguments<\/strong> dans son appel de routine.<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">salutation<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aPrenom<\/span><span class=\"p\">,<\/span> <span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">){<\/span>\r\n    <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Bonjour \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">aPrenom<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">programme<\/span><span class=\"p\">(){<\/span>\r\n    <span class=\"n\">Scanner<\/span> <span class=\"n\">lScanner<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Scanner<\/span><span class=\"p\">(<\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">in<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">String<\/span> <span class=\"n\">lPrenom<\/span><span class=\"p\">,<\/span> <span class=\"n\">lNom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Entrez votre prenom: \"<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">lPrenom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lScanner<\/span><span class=\"p\">.<\/span><span class=\"na\">nextLine<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Entrez votre nom: \"<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">lNom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lScanner<\/span><span class=\"p\">.<\/span><span class=\"na\">nextLine<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"n\">salutation<\/span><span class=\"p\">(<\/span><span class=\"n\">lPrenom<\/span><span class=\"p\">,<\/span> <span class=\"n\">lNom<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Dans cet exemple, la routine \u00ab\u00a0programme\u00a0\u00bb appel la routine \u00ab\u00a0salutation\u00a0\u00bb avec deux (2) arguments: le pr\u00e9nom (aPrenom) et le nom (aNom).<\/p>\n<h2>Valeur de retour<\/h2>\n<p>Il est possible que nous veuillions qu&rsquo;une routine appel\u00e9e retourne une valeur \u00e0 une routine appelante. Il y a plusieurs mani\u00e8res pour faire ce type de retour, mais la plus utilis\u00e9e (et celle qui devrait \u00eatre privil\u00e9gi\u00e9e) est la valeur de retour.<\/p>\n<p>Pour sp\u00e9cifier une valeur de retour, il faut d\u00e9buter par sp\u00e9cifier le type de cette valeur dans la signature de la routine. Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">maRoutine<\/span><span class=\"p\">()<\/span>\r\n<\/pre>\n<\/div>\n<p>Dans cette routine, maRoutine retourne une valeur de type \u00ab\u00a0String\u00a0\u00bb aux routines appelantes.<\/p>\n<p>Pour retourner une valeur en particulier, il faut utiliser l&rsquo;instruction <strong>return<\/strong>. Afin de s&rsquo;assurer de ne pas briser de structure de contr\u00f4le, il est une bonne pratique de mettre l&rsquo;instruction <strong>return<\/strong> une seule fois dans une routine, \u00e0 la derni\u00e8re ligne de la routine.<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">somme<\/span><span class=\"p\">(<\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aListe<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kt\">int<\/span> <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"n\">Integer<\/span> <span class=\"n\">element<\/span> <span class=\"p\">:<\/span> <span class=\"n\">aListe<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lResultat<\/span> <span class=\"o\">+<\/span> <span class=\"n\">element<\/span><span class=\"p\">.<\/span><span class=\"na\">intValue<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">lResultat<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<h2>Modification sur place d&rsquo;argument<\/h2>\n<p>Une routine appel\u00e9e peut \u00e9galement utiliser un autre m\u00e9canisme pour retourner une valeur \u00e0 la routine appelante. La routine appel\u00e9e peut modifier un des arguments. On appelle ce m\u00e9canisme <strong>modification sur place d&rsquo;argument<\/strong>. Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">versMajuscule<\/span><span class=\"p\">(<\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aListe<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kt\">int<\/span> <span class=\"n\">i<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"n\">i<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span> <span class=\"n\">i<\/span> <span class=\"o\">&lt;<\/span> <span class=\"n\">aListe<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">();<\/span> <span class=\"n\">i<\/span> <span class=\"o\">=<\/span> <span class=\"n\">i<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">aListe<\/span><span class=\"p\">.<\/span><span class=\"na\">set<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"p\">,<\/span> <span class=\"n\">aListe<\/span><span class=\"p\">.<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"p\">).<\/span><span class=\"na\">toUpperCase<\/span><span class=\"p\">());<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>On voit que la m\u00e9thode \u00ab\u00a0versMajuscule\u00a0\u00bb modifie directement l&rsquo;argument \u00ab\u00a0aListe\u00a0\u00bb en effectuant des \u00ab\u00a0set\u00a0\u00bb.<\/p>\n<p>Par contre, pour effectuer ce m\u00e9canisme, nous ne pouvons pas assigner l&rsquo;argument avec un nouvel objet. En d&rsquo;autres mots, vous ne devez pas faire de \u00ab\u00a0=\u00a0\u00bb. Par exemple, l&rsquo;exemple suivant <strong>ne fonctionnera pas<\/strong>:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">versMajuscule<\/span><span class=\"p\">(<\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aListe<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lListe<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"n\">aListe<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">());<\/span>\r\n    <span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">element<\/span><span class=\"p\">:<\/span> <span class=\"n\">aListe<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">lListe<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">element<\/span><span class=\"p\">.<\/span><span class=\"na\">toUpperCase<\/span><span class=\"p\">());<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"n\">aListe<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lListe<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Pour comprendre la raison pour laquelle cette modification ne fonctionne pas, il faut comprendre comment un argument fonctionne. Voici un sch\u00e9ma repr\u00e9sentant un passage d&rsquo;argument lors de l&rsquo;appel d&rsquo;une routine.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12043 \" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/05\/argument_sur_place_avant.png\" alt=\"\" width=\"637\" height=\"431\" \/><\/p>\n<p>On voit que chaque routine stock chacun une copie du pointeur qui pointe vers le m\u00eame objet en m\u00e9moire. En effet, si une <strong>modification sur place<\/strong> est faite sur a liste, puisqu&rsquo;il s&rsquo;agit de la m\u00eame liste, la modification s&rsquo;effectue pour les deux (2) routines. Par contre, lorsque nous cr\u00e9ons une autre liste et que nous faisons une assignation \u00ab\u00a0=\u00a0\u00bb, voici ce que devient le sch\u00e9ma.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12040\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/05\/argument_sur_place_apres.png\" alt=\"\" width=\"641\" height=\"434\" \/><\/p>\n<p>On voit qu&rsquo;une nouvelle liste a bel et bien \u00e9t\u00e9 cr\u00e9\u00e9e, mais seule la routine appel\u00e9e y a acc\u00e8s. La routine appelante n&rsquo;a aucun acc\u00e8s \u00e0 cette nouvelle liste et son pointeur pointe toujours vers la premi\u00e8re liste.<\/p>\n<h2>Les effets de bord<\/h2>\n<p>On a un <strong>effet de bord<\/strong> lorsqu&rsquo;une routine modifie l&rsquo;\u00e9tat du syst\u00e8me (par syst\u00e8me, j\u2019entends le programme au sens large). La meilleure fa\u00e7on de savoir si une routine fait un <strong>effet de bord<\/strong>, c&rsquo;est de regarder si tout est identique dans le programme entre avant l&rsquo;appel de la routine et apr\u00e8s l&rsquo;appel de la routine.<\/p>\n<p>Il y a diff\u00e9rents effets de bord:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Effectuer une entr\u00e9e ou sortie:\n<ul>\n<li>\u00ab\u00a0Print\u00a0\u00bb,<\/li>\n<li>\u00ab\u00a0Scanner\u00a0\u00bb,<\/li>\n<li>Valeur dans une fen\u00eatre,<\/li>\n<li>Cr\u00e9ation, modification, suppression de fichiers,<\/li>\n<li>Modification de base de donn\u00e9es,<\/li>\n<li>etc.<\/li>\n<\/ul>\n<\/li>\n<li>Modifier une valeur de:\n<ul>\n<li>Variable globale,<\/li>\n<li>Attribut,<\/li>\n<li>Argument de la m\u00e9thode (modification sur place),<\/li>\n<li>etc.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Voici quelques exemples:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">salutation<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aPrenom<\/span><span class=\"p\">,<\/span> <span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">){<\/span>\r\n    <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Bonjour \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">aPrenom<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>La m\u00e9thode \u00ab\u00a0salutation\u00a0\u00bb de l&rsquo;exemple pr\u00e9c\u00e9dent effectue un <strong>effet de bord<\/strong> puisqu&rsquo;il inscrit un texte dans la console, ce qui change l&rsquo;\u00e9tat du programme en cours.<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">lireChaine<\/span><span class=\"p\">(){<\/span>\r\n    <span class=\"n\">Scanner<\/span> <span class=\"n\">lScanner<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Scanner<\/span><span class=\"p\">(<\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">in<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">lScanner<\/span><span class=\"p\">.<\/span><span class=\"na\">nextLine<\/span><span class=\"p\">();<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>La m\u00e9thode \u00ab\u00a0lireChaine\u00a0\u00bb de l&rsquo;exemple pr\u00e9c\u00e9dent effectue un <strong>effet de bord<\/strong> puisqu&rsquo;il lit de l&rsquo;information au clavier, ce qui change l&rsquo;\u00e9tat du programme en cours.<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">versMajuscule<\/span><span class=\"p\">(<\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aListe<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kt\">int<\/span> <span class=\"n\">i<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"n\">i<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span> <span class=\"n\">i<\/span> <span class=\"o\">&lt;<\/span> <span class=\"n\">aListe<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">();<\/span> <span class=\"n\">i<\/span> <span class=\"o\">=<\/span> <span class=\"n\">i<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">aListe<\/span><span class=\"p\">.<\/span><span class=\"na\">set<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"p\">,<\/span> <span class=\"n\">aListe<\/span><span class=\"p\">.<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"p\">).<\/span><span class=\"na\">toUpperCase<\/span><span class=\"p\">());<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>La routine \u00ab\u00a0versMajuscule\u00a0\u00bb ci-dessus effectue un effet de bord puisqu&rsquo;elle modifie le contenu de la liste re\u00e7ue en argument.<\/p>\n<p>Voici maintenant un exemple sans effet de bord:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">moyenne<\/span><span class=\"p\">(<\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aListe<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kt\">int<\/span> <span class=\"n\">lSomme<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"n\">Integer<\/span> <span class=\"n\">element<\/span> <span class=\"p\">:<\/span> <span class=\"n\">aListe<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">lSomme<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lSomme<\/span> <span class=\"o\">+<\/span> <span class=\"n\">element<\/span><span class=\"p\">.<\/span><span class=\"na\">intValue<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">lSomme<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lSomme<\/span> <span class=\"o\">\/<\/span> <span class=\"n\">aListe<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">();<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>La routine \u00ab\u00a0moyenne\u00a0\u00bb dans cet exemple <strong>n&rsquo;a pas d&rsquo;effet de bord<\/strong> puisqu&rsquo;elle ne modifie aucune valeur autre que dans ses propres variables locales et ne fait aucune entr\u00e9e\/sortie.<\/p>\n<h2>Les diff\u00e9rents types de routines<\/h2>\n<p>Le terme <strong>routine<\/strong> est un terme tr\u00e8s g\u00e9n\u00e9ral. Il y a deux types diff\u00e9rents de routine qui ont des utilit\u00e9s assez diff\u00e9rentes. On les appelle les <strong>proc\u00e9dures<\/strong> et les <strong>fonctions<\/strong>. Il est tr\u00e8s important de bien comprendre la diff\u00e9rence entre ces deux types de routines, car ils seront utilis\u00e9s diff\u00e9remment dans un contexte objet.<\/p>\n<h3>Les proc\u00e9dures<\/h3>\n<p>Une <strong>proc\u00e9dure<\/strong> est une routine qui ne retourne aucune valeur \u00e0 l&rsquo;utilisateur. Ce type de routine est g\u00e9n\u00e9ralement utilis\u00e9 afin d&rsquo;effectuer des effets de bord.<\/p>\n<p>En java, une proc\u00e9dure est une routine dont la valeur de retour est \u00ab\u00a0void\u00a0\u00bb.<\/p>\n<h3>Les fonctions<\/h3>\n<p>Une <strong>fonction<\/strong> est une routine qui retourne une valeur \u00e0 la routine appelante par la m\u00e9canique de la valeur de retour. Ce type de routine sert g\u00e9n\u00e9ralement \u00e0 calculer une valeur ou bien \u00e0 retourner une valeur n&rsquo;\u00e9tant pas accessible par la routine appelante.<\/p>\n<h4>Les fonctions pures<\/h4>\n<p>On dit qu&rsquo;une <strong>fonction est pure<\/strong> dans le cas ou elle ne cause pas d&rsquo;effet de bord. En g\u00e9n\u00e9ral, lorsque nous cr\u00e9ons des fonctions, nous essayons au maximum de cr\u00e9er des fonctions pures. Lorsque ce n&rsquo;est pas possible ou qu&rsquo;il y a un gros avantage \u00e0 faire une fonction qui n&rsquo;est pas pure, il est important de bien sp\u00e9cifier dans la documentation de la fonction qu&rsquo;il y a un effet de bord ainsi que la port\u00e9e de cet effet.<\/p>\n<h2>R\u00e9cursivit\u00e9<\/h2>\n<p>Certaines routines peuvent s&rsquo;appeler elles-m\u00eames afin d&rsquo;effectuer leurs travaux. On appelle ces routines des <strong>routines r\u00e9cursives<\/strong>.<\/p>\n<p>En g\u00e9n\u00e9ral, les routines r\u00e9cursives sont construites de la mani\u00e8re suivante:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Base:\n<ul>\n<li>La valeur la plus minimaliste.<\/li>\n<\/ul>\n<\/li>\n<li>R\u00e9cursion:\n<ul>\n<li>Le calcul de la prochaine valeur<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Par exemple, on d\u00e9finit la factorielle d&rsquo;un \u00ab\u00a0nombre\u00a0\u00bb comme \u00e9tant le produit de toutes les valeurs pr\u00e9c\u00e8dent le \u00ab\u00a0nombre\u00a0\u00bb.<\/p>\n<p>Par exemple, la factorielle de 10 = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 3628800<\/p>\n<p>Voici le code Java de la m\u00e9thode \u00ab\u00a0factorielle\u00a0\u00bb qui calcul la factorielle d&rsquo;un nombre:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">factorielle<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kt\">int<\/span> <span class=\"n\">lResultat<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">aValeur<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">0<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aValeur<\/span> <span class=\"o\">*<\/span> <span class=\"n\">factorielle<\/span><span class=\"p\">(<\/span><span class=\"n\">aValeur<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">lResultat<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>On voit que, selon l&rsquo;algorithme, la base est Factorielle(0) qui donne 1; Ensuite, Factorielle(1) = 1 * Factorielle(0) = 1; Ensuite, Factorielle(2) = 2 * Factorielle(1) = 2; etc.<\/p>\n<h2>Gestion des erreurs<\/h2>\n<p>Lorsqu&rsquo;une routine est cr\u00e9\u00e9e, il est important de bien sp\u00e9cifier le travail, la port\u00e9e et les limites de cette routine. En effet, il faut \u00e9viter de cr\u00e9er des routines qui g\u00e8rent trop de choses et se limiter au travail que cette derni\u00e8re est cens\u00e9e faire. Dans le cas o\u00f9 l&rsquo;\u00e9tat de l&rsquo;appel de routine est probl\u00e9matique (par exemple arguments ou attributs des objets non valides), la routine ne doit pas se terminer normalement. Une exception doit \u00eatre lanc\u00e9e afin d&rsquo;informer la routine appelante de la probl\u00e9matique.<\/p>\n<h3>Les exceptions<\/h3>\n<p>Si une routine lance une exception, il faut que cette exception soit d\u00e9clar\u00e9e dans la signature de la routine. On sp\u00e9cifie cette exception en ajoutant le mot cl\u00e9 <strong>throw<\/strong>, suivie du type d&rsquo;Exception \u00e0 la signature de la routine. \u00c9galement, pour lancer une exception dans le code, il faut utiliser l&rsquo;instruction <strong>throw<\/strong> en y sp\u00e9cifiant un objet de type <strong>Exception<\/strong>. Voici un exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Additionne les \u00e9l\u00e9ments de `aListe1` et de `aListe2`.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * Noter que les deux listes doivent \u00eatre de la m\u00eame taille.<\/span>\r\n<span class=\"cm\"> * @param aListe1 La premi\u00e8re liste \u00e0 additionner<\/span>\r\n<span class=\"cm\"> * @param aListe2 La seconde liste \u00e0 additionner<\/span>\r\n<span class=\"cm\"> * @return Liste contenant la somme des deux listes.<\/span>\r\n<span class=\"cm\"> * @exception Exception Les listes ne sont pas de la m\u00eame taille.<\/span>\r\n<span class=\"cm\"> **\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"nf\">additionne<\/span><span class=\"p\">(<\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aListe1<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aListe2<\/span><span class=\"p\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"n\">Exception<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"n\">aListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">());<\/span>\r\n    <span class=\"kt\">int<\/span> <span class=\"n\">i<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">aListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">()<\/span> <span class=\"o\">==<\/span> <span class=\"n\">aListe2<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">())<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"n\">i<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span> <span class=\"n\">i<\/span> <span class=\"o\">&lt;<\/span> <span class=\"n\">aListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">();<\/span> <span class=\"n\">i<\/span> <span class=\"o\">=<\/span> <span class=\"n\">i<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">lResultat<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"n\">aListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"p\">).<\/span><span class=\"na\">intValue<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span>\r\n                        <span class=\"n\">aListe2<\/span><span class=\"p\">.<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"p\">).<\/span><span class=\"na\">intValue<\/span><span class=\"p\">()));<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Exception<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Les listes doivent \u00eatre de la m\u00eame taille\"<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">lResultat<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>On voit que cette m\u00e9thode doit recevoir deux (2) listes contenant le m\u00eame nombre d&rsquo;\u00e9l\u00e9ments. Dans le cas o\u00f9 ce ne serait pas le cas, la routine lance une exception de type <strong>Exception<\/strong>. Lorsque nous verrons l&rsquo;h\u00e9ritage, nous verrons que nous pouvons cr\u00e9er des types plus pr\u00e9cis d&rsquo;exceptions. Pour l&rsquo;instant, vous pouvez cr\u00e9er toutes vos exceptions en instanciant la classe <strong>Exception<\/strong>, comme dans l&rsquo;exemple.<\/p>\n<p>Il est \u00e9galement \u00e0 noter que l&rsquo;instruction <strong>throw<\/strong> termine directement l&rsquo;ex\u00e9cution de la routine. Malgr\u00e9 cela, il est une bonne pratique de vous assurer de respecter une bonne logique au niveau de vos structures de contr\u00f4le. Par exemple, l&rsquo;exemple pr\u00e9c\u00e9dent est correct, mais la forme ci-dessous <strong>ne devrait pas \u00eatre utilis\u00e9e<\/strong>:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Additionne les \u00e9l\u00e9ments de `aListe1` et de `aListe2`.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * Noter que les deux listes doivent \u00eatre de la m\u00eame taille.<\/span>\r\n<span class=\"cm\"> * @param aListe1 La premi\u00e8re liste \u00e0 additionner<\/span>\r\n<span class=\"cm\"> * @param aListe2 La seconde liste \u00e0 additionner<\/span>\r\n<span class=\"cm\"> * @return Liste contenant la somme des deux listes.<\/span>\r\n<span class=\"cm\"> * @exception Exception Les listes ne sont pas de la m\u00eame taille.<\/span>\r\n<span class=\"cm\"> **\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"nf\">additionne<\/span><span class=\"p\">(<\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aListe1<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aListe2<\/span><span class=\"p\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"n\">Exception<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"n\">aListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">());<\/span>\r\n    <span class=\"kt\">int<\/span> <span class=\"n\">i<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">aListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">()<\/span> <span class=\"o\">!=<\/span> <span class=\"n\">aListe2<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">())<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Exception<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Les listes doivent \u00eatre de la m\u00eame taille\"<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"n\">i<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span> <span class=\"n\">i<\/span> <span class=\"o\">&lt;<\/span> <span class=\"n\">aListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">();<\/span> <span class=\"n\">i<\/span> <span class=\"o\">=<\/span> <span class=\"n\">i<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">lResultat<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"n\">aListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"p\">).<\/span><span class=\"na\">intValue<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span>\r\n                    <span class=\"n\">aListe2<\/span><span class=\"p\">.<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"p\">).<\/span><span class=\"na\">intValue<\/span><span class=\"p\">()));<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">lResultat<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Malgr\u00e9 qu&rsquo;elle est fonctionnelle et qu&rsquo;elle peut m\u00eame para\u00eetre, \u00e0 premi\u00e8re vue, plus simple, les structures de contr\u00f4le de cette version peuvent causer des incompr\u00e9hensions et des ambigu\u00eft\u00e9s \u00e0 la lecture. Par exemple, quelqu&rsquo;un pourrait ne pas remarquer qu&rsquo;il y a un \u00ab\u00a0throw\u00a0\u00bb dans le \u00ab\u00a0if\u00a0\u00bb et se demander pourquoi la boucle \u00ab\u00a0for\u00a0\u00bb ne s&rsquo;ex\u00e9cute pas, malgr\u00e9 ce cette derni\u00e8re n&rsquo;est dans aucune structure de contr\u00f4le conditionnelle (\u00ab\u00a0if\u00a0\u00bb). Cette ambigu\u00eft\u00e9 pourrait donc avoir des effets dangereux dans un contexte de l&rsquo;entretien \u00e0 long terme du logiciel.<\/p>\n<h3>Gestion des exceptions<\/h3>\n<p>Du c\u00f4t\u00e9 de la m\u00e9thode appelante, il est important de g\u00e9rer les exceptions des m\u00e9thodes appel\u00e9es avec une structure <strong>try\/catch<\/strong>. Voici un exemple d&rsquo;utilisation d&rsquo;un <strong>try\/catch<\/strong>:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lListe1<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">);<\/span>\r\n<span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lListe2<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">);<\/span>\r\n<span class=\"n\">lListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">));<\/span>\r\n<span class=\"n\">lListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">));<\/span>\r\n<span class=\"n\">lListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">15<\/span><span class=\"p\">));<\/span>\r\n<span class=\"n\">lListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">20<\/span><span class=\"p\">));<\/span>\r\n<span class=\"n\">lListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">25<\/span><span class=\"p\">));<\/span>\r\n<span class=\"n\">lListe2<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">));<\/span>\r\n<span class=\"n\">lListe2<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">));<\/span>\r\n<span class=\"n\">lListe2<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">15<\/span><span class=\"p\">));<\/span>\r\n<span class=\"n\">lListe2<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">20<\/span><span class=\"p\">));<\/span>\r\n<span class=\"n\">lListe2<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">25<\/span><span class=\"p\">));<\/span>\r\n<span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"n\">additionne<\/span><span class=\"p\">(<\/span><span class=\"n\">lListe1<\/span><span class=\"p\">,<\/span> <span class=\"n\">lListe2<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"n\">Integer<\/span> <span class=\"n\">element<\/span> <span class=\"p\">:<\/span> <span class=\"n\">lResultat<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">element<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span><span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"n\">Exception<\/span> <span class=\"n\">exception<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Il manque une valeur \u00e0 la liste.\"<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Avec l&rsquo;exemple pr\u00e9c\u00e9dent, regardez ce qui arrive lorsque vous retirez une des instructions \u00ab\u00a0add\u00a0\u00bb. Normalement, le message d&rsquo;erreur devrait appara\u00eetre.<\/p>\n<p>Il est \u00e9galement \u00e0 noter qu&rsquo;il est possible de mettre plus d&rsquo;une clause <strong>catch<\/strong> dans le cas ou le la routine appel\u00e9e peut lancer plus d&rsquo;un type d&rsquo;exception.<\/p>\n<h3>Exceptions de type \u00ab\u00a0RuntimeException\u00a0\u00bb<\/h3>\n<p>Comme nous l&rsquo;avons vu plus haut, lorsqu&rsquo;une exception de type \u00ab\u00a0Exception\u00a0\u00bb est lanc\u00e9e avec un \u00ab\u00a0throw\u00a0\u00bb, il est obligatoire d&rsquo;indiquer l&rsquo;exception dans la signature de la m\u00e9thode et il est \u00e9galement obligatoire pour le client de g\u00e9rer cette exception avec un \u00ab\u00a0try\u00a0\u00bb.<\/p>\n<p>Par contre, il existe \u00e9galement un type d&rsquo;exception qui a comme particularit\u00e9 qu&rsquo;il n&rsquo;exige pas d&rsquo;\u00eatre g\u00e9r\u00e9. Ce type d&rsquo;exception se nomme les \u00ab\u00a0RuntimeException\u00a0\u00bb.<\/p>\n<p>Prenons par exemple, une nouvelle m\u00e9thode \u00ab\u00a0duplique\u00a0\u00bb, qui retourne une liste contenant les \u00e9l\u00e9ments d&rsquo;une liste multipli\u00e9s par 2. Afin d&rsquo;\u00e9viter la duplication de code, nous allons utiliser la m\u00e9thode \u00ab\u00a0additionne\u00a0\u00bb que nous avons utilis\u00e9 plus haut:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Multiplie par 2 les \u00e9l\u00e9ments de `aListe`.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param aListe La liste \u00e0 multiplier par 2.<\/span>\r\n<span class=\"cm\"> * @return Liste contenant la multiplication par 2 des \u00e9l\u00e9ments de `aListe`.<\/span>\r\n<span class=\"cm\"> **\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"nf\">duplique<\/span><span class=\"o\">(<\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aListe<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">additionne<\/span><span class=\"o\">(<\/span><span class=\"n\">aListe<\/span><span class=\"o\">,<\/span> <span class=\"n\">aListe<\/span><span class=\"o\">);<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Si on essaie de compiler cette m\u00e9thode, le compilateur nous obligera \u00e0 utiliser un \u00ab\u00a0try&#8230;catch\u00a0\u00bb afin de g\u00e9rer l&rsquo;exception de la m\u00e9thode \u00ab\u00a0additionne\u00a0\u00bb (ou bien d\u00e9clarer l&rsquo;exception dans la signature de la m\u00e9thode \u00ab\u00a0duplique\u00a0\u00bb, ce qui obligera le client \u00e0 g\u00e9rer l&rsquo;exception avec un \u00ab\u00a0try&#8230;catch\u00a0\u00bb).<\/p>\n<p>Le probl\u00e8me, c&rsquo;est qu&rsquo;ici, l&rsquo;exception est compl\u00e8tement illogique. Puisqu&rsquo;il est impossible qu&rsquo;une liste n&rsquo;ait pas la m\u00eame taille qu&rsquo;elle-m\u00eame, il est impossible que l&rsquo;exception survienne. Nous ne devrions donc pas retourner d&rsquo;exception dans la m\u00e9thode \u00ab\u00a0duplique\u00a0\u00bb. Instinctivement, nous pourrions \u00eatre tent\u00e9s de ne rien mettre dans le \u00ab\u00a0catch\u00a0\u00bb du \u00ab\u00a0try&#8230;catch\u00a0\u00bb. Comme ceci (<strong>noter qu&rsquo;il s&rsquo;agit d&rsquo;un exemple \u00e0 ne pas reproduire<\/strong>):<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Multiplie par 2 les \u00e9l\u00e9ments de `aListe`.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param aListe La liste \u00e0 multiplier par 2.<\/span>\r\n<span class=\"cm\"> * @return Liste contenant la multiplication par 2 des \u00e9l\u00e9ments de `aListe`.<\/span>\r\n<span class=\"cm\"> **\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"nf\">duplique<\/span><span class=\"o\">(<\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aListe<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lResultat<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"k\">try<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"n\">additionne<\/span><span class=\"o\">(<\/span><span class=\"n\">aListe<\/span><span class=\"o\">,<\/span> <span class=\"n\">aListe<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span> <span class=\"k\">catch<\/span><span class=\"o\">(<\/span><span class=\"n\">Exception<\/span> <span class=\"n\">laException<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"c1\">\/\/ Que faire ici<\/span>\r\n    <span class=\"o\">}<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">lResultat<\/span><span class=\"o\">;<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Par contre, il est une mauvaise pratique en programmation de ne rien mettre dans un \u00ab\u00a0catch\u00a0\u00bb. Apr\u00e8s tout, il est possible que nous ayons mal pens\u00e9 notre logique et qu&rsquo;une exception arrive tout de m\u00eame. Donc, afin d&rsquo;\u00e9viter d&rsquo;avoir un \u00ab\u00a0catch\u00a0\u00bb vide et afin d&rsquo;\u00e9viter que le client soit oblig\u00e9 de mettre inutilement un \u00ab\u00a0try..catch\u00a0\u00bb, on peut utiliser un \u00ab\u00a0RuntimeException\u00a0\u00bb. Comme ceci:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Multiplie par 2 les \u00e9l\u00e9ments de `aListe`.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param aListe La liste \u00e0 multiplier par 2.<\/span>\r\n<span class=\"cm\"> * @return Liste contenant la multiplication par 2 des \u00e9l\u00e9ments de `aListe`.<\/span>\r\n<span class=\"cm\"> **\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"nf\">duplique<\/span><span class=\"o\">(<\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aListe<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lResultat<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"k\">try<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"n\">additionne<\/span><span class=\"o\">(<\/span><span class=\"n\">aListe<\/span><span class=\"o\">,<\/span> <span class=\"n\">aListe<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span> <span class=\"k\">catch<\/span><span class=\"o\">(<\/span><span class=\"n\">Exception<\/span> <span class=\"n\">laException<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">RuntimeException<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Un erreur interne s'est produit.\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">lResultat<\/span><span class=\"o\">;<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Noter qu&rsquo;il est recommand\u00e9 d&rsquo;utiliser le moins possible les \u00ab\u00a0RuntimeException\u00a0\u00bb. En d&rsquo;autres mots, utilisez seulement le \u00ab\u00a0RuntimeException\u00a0\u00bb lorsque cette exception ne devrait jamais \u00eatre lanc\u00e9e (et que si elle est lanc\u00e9e, il s&rsquo;agit du bogue de la m\u00e9thode en tant que tel, et non celui du client).<\/p>\n<h2>Les suites de tests<\/h2>\n<p>Il est important de bien tester vos routines lorsque vous en cr\u00e9ez. Il n&rsquo;y a, bien entendu aucune surprise ici. Mais que veut dire \u00ab\u00a0bien tester une routine\u00a0\u00bb?<\/p>\n<p>Pour bien tester une routine, il faut valider les \u00e9l\u00e9ments suivants:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Que la routine fait le travail qu&rsquo;elle doit faire;<\/li>\n<li>Que la routine fait TOUT le travail qu&rsquo;elle doit faire;<\/li>\n<li>Quel la routine ne fait pas le travail qu&rsquo;elle n&rsquo;est pas cens\u00e9e faire.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Ce qui nous am\u00e8ne aux diff\u00e9rents types de cas de tests:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Les cas normaux:\n<ul>\n<li>Valide des valeurs qui devraient valider le travail standard de la routine,<\/li>\n<li>Souvent les seuls tests effectu\u00e9s par les programmeurs;<\/li>\n<\/ul>\n<\/li>\n<li>Les cas erron\u00e9s:\n<ul>\n<li>Valide que des valeurs non valides lancent des exceptions,<\/li>\n<li>Les routines n&rsquo;ont pas toutes des cas erron\u00e9s;<\/li>\n<\/ul>\n<\/li>\n<li>Les cas limites:\n<ul>\n<li>Valide que les cas aux limites normaux et erron\u00e9s sont valides,<\/li>\n<li>Il est possible qu&rsquo;il n&rsquo;y ait pas de cas limite.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Il est \u00e0 noter qu&rsquo;une s\u00e9rie de tests doit g\u00e9n\u00e9ralement \u00eatre \u00ab\u00a0arrang\u00e9e avec le gars des vues\u00a0\u00bb. C&rsquo;est-\u00e0-dire que les valeurs sont pr\u00e9alablement choisies et inscrites dans le code. Il n&rsquo;est pas n\u00e9cessaire de faire des tests avec des valeurs al\u00e9atoires.<\/p>\n<p>Voici une classe contenant une s\u00e9rie de tests pour la routine \u00ab\u00a0additionne\u00a0\u00bb pr\u00e9sent\u00e9e plus t\u00f4t:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kn\">import<\/span> <span class=\"nn\">java.util.ArrayList<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.List<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Programme de pour montrer la cr\u00e9ation de tests.<\/span>\r\n<span class=\"cm\"> * <\/span>\r\n<span class=\"cm\"> * @author Louis Marchand<\/span>\r\n<span class=\"cm\"> * @version %I%, %G%<\/span>\r\n<span class=\"cm\"> * <\/span>\r\n<span class=\"cm\"> * Distribu\u00e9 sous licence MIT.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Programme<\/span>\r\n<span class=\"p\">{<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Additionne les \u00e9l\u00e9ments de `aListe1` et de `aListe2`.<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * Noter que les deux listes doivent \u00eatre de la m\u00eame taille.<\/span>\r\n<span class=\"cm\">     * @param aListe1 La premi\u00e8re liste \u00e0 additionner<\/span>\r\n<span class=\"cm\">     * @param aListe2 La seconde liste \u00e0 additionner<\/span>\r\n<span class=\"cm\">     * @return Liste contenant la somme des deux listes.<\/span>\r\n<span class=\"cm\">     * @exception Exception Les listes ne sont pas de la m\u00eame taille.<\/span>\r\n<span class=\"cm\">     **\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"nf\">additionne<\/span><span class=\"p\">(<\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aListe1<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aListe2<\/span><span class=\"p\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"n\">Exception<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"n\">aListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">());<\/span>\r\n        <span class=\"kt\">int<\/span> <span class=\"n\">i<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">aListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">()<\/span> <span class=\"o\">==<\/span> <span class=\"n\">aListe2<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">())<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"n\">i<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span> <span class=\"n\">i<\/span> <span class=\"o\">&lt;<\/span> <span class=\"n\">aListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">();<\/span> <span class=\"n\">i<\/span> <span class=\"o\">=<\/span> <span class=\"n\">i<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"n\">lResultat<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"n\">aListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"p\">).<\/span><span class=\"na\">intValue<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span>\r\n                            <span class=\"n\">aListe2<\/span><span class=\"p\">.<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"p\">).<\/span><span class=\"na\">intValue<\/span><span class=\"p\">()));<\/span>\r\n            <span class=\"p\">}<\/span>\r\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Exception<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Les listes doivent \u00eatre de la m\u00eame taille\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">lResultat<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Suite de tests de la routine `additionne`.<\/span>\r\n<span class=\"cm\">     **\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">testAdditionne<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">testAdditionneNormal<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">testAdditionneErrone<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">testAdditionneLimite<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Cas normal de la suite de tests de la routine `additionne`.<\/span>\r\n<span class=\"cm\">     **\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">testAdditionneNormal<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lListe1<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lListe2<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lResultat<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"n\">lListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">lListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">lListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">15<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">lListe2<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">lListe2<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">20<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">lListe2<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">30<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"n\">additionne<\/span><span class=\"p\">(<\/span><span class=\"n\">lListe1<\/span><span class=\"p\">,<\/span> <span class=\"n\">lListe2<\/span><span class=\"p\">);<\/span>\r\n            <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">lResultat<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">()<\/span> <span class=\"o\">!=<\/span> <span class=\"mi\">3<\/span> <span class=\"o\">||<\/span>\r\n                    <span class=\"n\">lResultat<\/span><span class=\"p\">.<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">).<\/span><span class=\"na\">intValue<\/span><span class=\"p\">()<\/span> <span class=\"o\">!=<\/span> <span class=\"mi\">15<\/span> <span class=\"o\">||<\/span>\r\n                    <span class=\"n\">lResultat<\/span><span class=\"p\">.<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">).<\/span><span class=\"na\">intValue<\/span><span class=\"p\">()<\/span> <span class=\"o\">!=<\/span> <span class=\"mi\">30<\/span> <span class=\"o\">||<\/span> \r\n                    <span class=\"n\">lResultat<\/span><span class=\"p\">.<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">).<\/span><span class=\"na\">intValue<\/span><span class=\"p\">()<\/span> <span class=\"o\">!=<\/span> <span class=\"mi\">45<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Cas normal non valide.\"<\/span><span class=\"p\">);<\/span>\r\n            <span class=\"p\">}<\/span>\r\n        <span class=\"p\">}<\/span><span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"n\">Exception<\/span> <span class=\"n\">exception<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Cas normal non valide.\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Cas erron\u00e9 de la suite de tests de la routine `additionne`.<\/span>\r\n<span class=\"cm\">     **\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">testAdditionneErrone<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lListe1<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lListe2<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lResultat<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"n\">lListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">lListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">lListe1<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">15<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">lListe2<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">lListe2<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"p\">(<\/span><span class=\"mi\">20<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"n\">additionne<\/span><span class=\"p\">(<\/span><span class=\"n\">lListe1<\/span><span class=\"p\">,<\/span> <span class=\"n\">lListe2<\/span><span class=\"p\">);<\/span>\r\n            <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Cas erron\u00e9 non valide.\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span><span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"n\">Exception<\/span> <span class=\"n\">exception<\/span><span class=\"p\">)<\/span> <span class=\"p\">{}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Cas limite de la suite de tests de la routine `additionne`.<\/span>\r\n<span class=\"cm\">     **\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">testAdditionneLimite<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lListe1<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lListe2<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"n\">additionne<\/span><span class=\"p\">(<\/span><span class=\"n\">lListe1<\/span><span class=\"p\">,<\/span> <span class=\"n\">lListe2<\/span><span class=\"p\">);<\/span>\r\n            <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">lResultat<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">()<\/span> <span class=\"o\">!=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Cas limite non valide.\"<\/span><span class=\"p\">);<\/span>\r\n            <span class=\"p\">}<\/span>\r\n        <span class=\"p\">}<\/span><span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"n\">Exception<\/span> <span class=\"n\">exception<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Cas limite non valide.\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Ex\u00e9cution du programme<\/span>\r\n<span class=\"cm\">     **\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">arguments<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">Programme<\/span> <span class=\"n\">programme<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Programme<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">programme<\/span><span class=\"p\">.<\/span><span class=\"na\">testAdditionne<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.louismarchand.me\/index.php\/programmation-orientee-objet-1\/\">Retour<\/a><\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>Auteur: Louis Marchand<br \/>\n<a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/deed.fr\" target=\"_blank\" rel=\"license noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/i.creativecommons.org\/l\/by\/4.0\/80x15.png\" alt=\"Creative Commons License\" \/><\/a><br \/>\nSauf pour les sections sp\u00e9cifi\u00e9es autrement, ce travail est sous licence <a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/deed.fr\" target=\"_blank\" rel=\"license noopener noreferrer\">Creative Commons Attribution 4.0 International<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>D\u00e9finitions La routine On appel routine (ou sous-routine ou sous-programme) permet d&rsquo;encapsuler une portion de code (ou s\u00e9rie d&rsquo;instructions) effectuant un travail bien pr\u00e9cis. La routine est identifi\u00e9e et peut \u00eatre ex\u00e9cut\u00e9e une multitude de fois \u00e0 plusieurs endroits dans le code d&rsquo;un programme. Appel de routine Lorsqu&rsquo;une premi\u00e8re routine ex\u00e9cute une autre routine, on&hellip; <a class=\"more-link\" href=\"https:\/\/www.louismarchand.me\/index.php\/les-routines\/\">Continue reading <span class=\"screen-reader-text\">Les routines<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-47","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/47","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/comments?post=47"}],"version-history":[{"count":8,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/47\/revisions"}],"predecessor-version":[{"id":560,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/47\/revisions\/560"}],"wp:attachment":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/media?parent=47"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}