{"id":425,"date":"2021-10-18T15:07:49","date_gmt":"2021-10-18T15:07:49","guid":{"rendered":"https:\/\/www.louismarchand.me\/?page_id=425"},"modified":"2021-10-18T15:07:49","modified_gmt":"2021-10-18T15:07:49","slug":"objet2-le-langage-eiffel","status":"publish","type":"page","link":"https:\/\/www.louismarchand.me\/index.php\/objet2-le-langage-eiffel\/","title":{"rendered":"Le langage Eiffel"},"content":{"rendered":"<h2>Historique<\/h2>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Cr\u00e9\u00e9 par Bertrand Meyer;<\/li>\n<li>Premi\u00e8re version en 1986;<\/li>\n<li>Les trois vies du langage Eiffel:\n<ul>\n<li>Langage th\u00e9orique\n<ul>\n<li>\u00c9criture du livre \u00ab\u00a0Object-Oriented Software Construction\u00a0\u00bb;<\/li>\n<li>Aucun langage \u00e0 l&rsquo;\u00e9poque ne permettait de repr\u00e9senter les diff\u00e9rents concepts du livre;<\/li>\n<li>Le langage a \u00e9t\u00e9 cr\u00e9\u00e9 afin de repr\u00e9senter les exemples du livre;<\/li>\n<li>Aucun compilateur ou interpr\u00e9teur n&rsquo;\u00e9tait disponible.<\/li>\n<\/ul>\n<\/li>\n<li>Langage p\u00e9dagogique\n<ul>\n<li>Le livre a \u00e9t\u00e9 beaucoup utilis\u00e9 dans un contexte p\u00e9dagogique;<\/li>\n<li>Afin que les \u00e9tudiants et les enseignants puissent avoir une meilleure exp\u00e9rience avec le livre, un compilateur Eiffel minimaliste a \u00e9t\u00e9 cr\u00e9\u00e9.<\/li>\n<\/ul>\n<\/li>\n<li>Langage de production\n<ul>\n<li>L&rsquo;engouement pour un r\u00e9el compilateur Eiffel a encourag\u00e9 son cr\u00e9ateur \u00e0 fonder une compagnie (International Software Engineering) afin de d\u00e9velopper un compilateur commercial;<\/li>\n<li>La premi\u00e8re version du standard officiel (ECMA-367) a \u00e9t\u00e9 cr\u00e9\u00e9e en 2005.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>Malgr\u00e9 que le langage n&rsquo;est pas beaucoup utilis\u00e9 dans l&rsquo;industrie, il a influenc\u00e9 une grande quantit\u00e9 de langage moderne.\n<ul>\n<li>Par exemple, les langages suivants se sont inspir\u00e9s de Eiffel: Java, C#, Scala, Ruby, etc.<\/li>\n<li>Encore aujourd&rsquo;hui, les langages ajoutent des technologies d\u00e9velopp\u00e9es initialement dans Eiffel:\n<ul>\n<li>Par exemple:\n<ul>\n<li>Java et C# ont int\u00e9gr\u00e9 l&rsquo;approche par contrat;<\/li>\n<li>Java a inclue une fonctionnalit\u00e9 de fonction pure dans les derni\u00e8res versions;<\/li>\n<li>Java, C# et Kotlin se sont inspir\u00e9s du Void-Safety afin de cr\u00e9er leur technologie \u00ab\u00a0null safe\u00a0\u00bb;<\/li>\n<li>etc.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Le langage Eiffel<\/h2>\n<p>Les principaux objectifs du langage Eiffel sont les suivants:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Langage orient\u00e9 objet pur\n<ul>\n<li>Tout est un objet;<\/li>\n<li>Aucun type primitif;<\/li>\n<li>Aucune fonction \u00ab\u00a0main\u00a0\u00bb;<\/li>\n<li>Concept de classe abstraite et classe effective;<\/li>\n<li>Une seule structure d&rsquo;h\u00e9ritage (pas d&rsquo;interface);<\/li>\n<li>etc.<\/li>\n<\/ul>\n<\/li>\n<li>Langage tr\u00e8s performant:\n<ul>\n<li>Il s&rsquo;agit d&rsquo;un langage compil\u00e9 ayant pour cible la machine de l&rsquo;utilisateur:\n<ul>\n<li>Aucun interpr\u00e9teur (comme Python, JavaScript, etc.);<\/li>\n<li>Aucune machine virtuelle (comme Java ou C#);<\/li>\n<\/ul>\n<\/li>\n<li>Performance similaire aux langages C et C++;<\/li>\n<\/ul>\n<\/li>\n<li>R\u00e9utilisation des composantes:\n<ul>\n<li>Limiter le moins possible l&rsquo;h\u00e9ritage;<\/li>\n<li>Aucune notion de m\u00e9thode ou attribut priv\u00e9;<\/li>\n<\/ul>\n<\/li>\n<li>Favoriser au maximum la robustesse des logiciels d\u00e9velopp\u00e9s:\n<ul>\n<li>\u00ab\u00a0Void-Safety\u00a0\u00bb;<\/li>\n<li>\u00ab\u00a0Desing\u00a0\u00bb par contrat;<\/li>\n<li>M\u00e9canismes de masquage de l&rsquo;information tr\u00e8s avanc\u00e9s;<\/li>\n<li>etc.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Pourquoi Eiffel<\/h3>\n<p>Consid\u00e9rant le fait que le langage Eiffel n&rsquo;est pas beaucoup utilis\u00e9 dans l&rsquo;industrie, il est l\u00e9gitime de se demander pourquoi apprendre ce langage au lieu d&rsquo;un autre. Voici certaines pistes de r\u00e9flexion qui vous permettra de r\u00e9pondre \u00e0 ce questionnement.<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Apprendre des langages de programmation diff\u00e9rents vous permettra d&rsquo;\u00eatre plus flexible en tant que programmeur;<\/li>\n<li>Puisque les structures objets d&rsquo;Eiffel n&rsquo;ont aucune limites impos\u00e9es, Eiffel est le langage le plus efficace pour apprendre les concepts de la programmation orient\u00e9e objet:\n<ul>\n<li>Pas de double structure d&rsquo;h\u00e9ritage (pas d&rsquo;interface, seulement des classes);<\/li>\n<li>H\u00e9ritage tr\u00e8s structur\u00e9;<\/li>\n<li>Tout est un objet (incluant les entiers, les caract\u00e8res, etc.)<\/li>\n<li>etc.<\/li>\n<\/ul>\n<\/li>\n<li>Concepts originaux qui vous permettront de d\u00e9velopper une meilleure rigueur de programmation:\n<ul>\n<li>\u00ab\u00a0Void-Safety\u00a0\u00bb,<\/li>\n<li>\u00ab\u00a0Desing\u00a0\u00bb par contrat,<\/li>\n<li>etc.<\/li>\n<\/ul>\n<\/li>\n<li>Eiffel est un langage puissant, pr\u00e9cis, formel et \u00e9l\u00e9gant qui vous permettra de cr\u00e9er de meilleur programme en g\u00e9n\u00e9ral.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Une classe en Eiffel<\/h2>\n<p>La meilleure fa\u00e7on de comprendre le code Eiffel est de le voir s\u00e9par\u00e9 en section. Voici un exemple:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10595 size-full\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/10\/code_eiffel_structure.png\" alt=\"\" width=\"800\" height=\"1280\" \/><\/p>\n<h3>Les clauses \u00ab\u00a0feature\u00a0\u00bb<\/h3>\n<p>L&rsquo;accolade apr\u00e8s la clause \u00ab\u00a0feature\u00a0\u00bb correspond \u00e0 une liste des classes \u00e0 avoir acc\u00e8s aux m\u00e9thodes et attributs contenue dans cette section. G\u00e9n\u00e9ralement, si aucune classe n&rsquo;est sp\u00e9cifi\u00e9e, les m\u00e9thodes et attributs sont consid\u00e9r\u00e9s comme publics et si on y place \u00ab\u00a0{NONE}\u00a0\u00bb, \u00e7a indique que les m\u00e9thodes et attributs sont consid\u00e9r\u00e9s comme priv\u00e9 (au sens de Eiffel: les descendants ont acc\u00e8s \u00e0 ces m\u00e9thodes et attributs).<\/p>\n<p>Les sections \u00ab\u00a0feature\u00a0\u00bb peuvent varier. Par exemple, il n&rsquo;est pas n\u00e9cessaire de mettre de \u00ab\u00a0feature\u00a0\u00bb libell\u00e9e \u00ab\u00a0constantes\u00a0\u00bb et cette clause \u00ab\u00a0feature\u00a0\u00bb aurait pu \u00eatre mise publique au lieu de priv\u00e9.<\/p>\n<p>En g\u00e9n\u00e9ral, on place minimalement une section \u00ab\u00a0<span style=\"font-family: courier new, courier, monospace;\">feature {NONE} &#8211;Initialisation<\/span>\u00a0\u00bb pour les constructeurs, une section \u00ab\u00a0<span style=\"font-family: courier new, courier, monospace;\">feature &#8211;Acc\u00e8s<\/span>\u00a0\u00bb pour l&rsquo;interface de la classe (les m\u00e9thodes et attributs publics) et une section \u00ab\u00a0<span style=\"font-family: courier new, courier, monospace;\">feature {NONE} &#8211;Impl\u00e9mentation<\/span>\u00a0\u00bb pour les m\u00e9thodes et attributs priv\u00e9s. Par contre, rien ne vous emp\u00eache d&rsquo;\u00eatre plus pr\u00e9cis et de faire des sections plus particuli\u00e8res.<\/p>\n<h3>Les m\u00e9thodes<\/h3>\n<p>La base d&rsquo;une m\u00e9thode s&rsquo;\u00e9crit de la mani\u00e8re suivante:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">valider_point_de_vie<\/span>\r\n\t\t<span class=\"c1\">-- S'assure que les `points_de_vie' soient entre<\/span>\r\n\t\t<span class=\"c1\">-- 0 et `Points_de_vie_maximaux'.<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kr\">if<\/span> <span class=\"n\">points_de_vie<\/span> <span class=\"o\">&lt;<\/span> <span class=\"mi\">0<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t<span class=\"n\">points_de_vie<\/span> <span class=\"o\">:=<\/span> <span class=\"mi\">0<\/span>\r\n\t\t<span class=\"kr\">elseif<\/span> <span class=\"n\">points_de_vie<\/span> <span class=\"o\">&gt;<\/span> <span class=\"n\">Points_de_vie_maximaux<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t<span class=\"n\">points_de_vie<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">Points_de_vie_maximaux<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>La premi\u00e8re ligne correspond \u00e0 la signature de la m\u00e9thode. Si aucun type de retour n&rsquo;est n\u00e9cessaire (la m\u00e9thode est une proc\u00e9dure), on ne sp\u00e9cifie rien. Si aucun argument n&rsquo;est n\u00e9cessaire, nous n&rsquo;avons pas \u00e0 y placer les parenth\u00e8ses vides \u00ab\u00a0()\u00a0\u00bb.<\/p>\n<p>Ensuite, nous avons la documentation de la m\u00e9thode sous forme de commentaires. Une bonne documentation Eiffel doit \u00eatre concise et pr\u00e9cise et faire r\u00e9f\u00e9rence aux arguments, autres m\u00e9thodes et attributs auxquels il a un lien. Les r\u00e9f\u00e9rences aux arguments, m\u00e9thodes et attributs se font en mettant ces derniers entre accents graves \u00ab\u00a0`\u00a0\u00bb et apostrophe \u00ab\u00a0&lsquo;\u00a0\u00bb. Si une r\u00e9f\u00e9rence \u00e0 une classe est utilis\u00e9e, mettre cette classe en majuscule, entre accolades \u00ab\u00a0{CLASSE}\u00a0\u00bb.<\/p>\n<p>Enfin, on voit que le corps du texte se trouve entre le \u00ab\u00a0do\u00a0\u00bb et le \u00ab\u00a0end\u00a0\u00bb.<\/p>\n<p>Voici un autre exemple plus complet:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">calculer_moyenne<\/span><span class=\"p\">(<\/span><span class=\"n\">a_nombres<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">INTEGER<\/span><span class=\"o\">]<\/span><span class=\"p\">):<\/span><span class=\"nc\">INTEGER<\/span>\r\n\t\t<span class=\"c1\">-- Retourne la moyenne des nombres de `a_nombres'<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_somme<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"n\">l_somme<\/span> <span class=\"o\">:=<\/span> <span class=\"mi\">0<\/span>\r\n\t\t<span class=\"kr\">across<\/span> <span class=\"n\">a_nombres<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_nombres<\/span> <span class=\"kr\">loop<\/span>\r\n\t\t\t<span class=\"n\">l_somme<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">l_somme<\/span> <span class=\"o\">+<\/span> <span class=\"n\">la_nombres<\/span><span class=\"p\">.<\/span><span class=\"n\">item<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\t\t<span class=\"kc\">Result<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">l_somme<\/span> <span class=\"o\">\/\/<\/span> <span class=\"n\">a_nombres<\/span><span class=\"p\">.<\/span><span class=\"n\">count<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n\r\n<\/pre>\n<\/div>\n<p>On voit que les arguments sont plac\u00e9s entre parenth\u00e8ses \u00ab\u00a0()\u00a0\u00bb et le type de retour est sp\u00e9cifi\u00e9 \u00e0 l&rsquo;aide d&rsquo;un deux-points \u00ab\u00a0:\u00a0\u00bb \u00e0 la fin de la signature.<\/p>\n<p>Ensuite, en Eiffel, toutes les variables locales de la m\u00e9thode doivent \u00eatre d\u00e9clar\u00e9es dans une clause \u00ab\u00a0local\u00a0\u00bb. De cette mani\u00e8re, on peut savoir rapidement toutes les variables globales qui seront utilis\u00e9es dans la m\u00e9thode.<\/p>\n<p>Enfin, puisque Eiffel renforce le principe d&rsquo;un seul point d&rsquo;entr\u00e9e et d&rsquo;un seul point de sortie de toutes structures de contr\u00f4le, il n&rsquo;y a pas de \u00ab\u00a0return\u00a0\u00bb en Eiffel. Pour retourner un r\u00e9sultat pr\u00e9cis, il suffit d&rsquo;assigner la variable sp\u00e9ciale \u00ab\u00a0Result\u00a0\u00bb avec la valeur que l&rsquo;on veut retourner. D&rsquo;ailleurs, il faut voir la variable \u00ab\u00a0Result\u00a0\u00bb comme une variable locale standard. On peut l&rsquo;utiliser n&rsquo;importe o\u00f9 dans la m\u00e9thode. Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">calculer_somme<\/span><span class=\"p\">(<\/span><span class=\"n\">a_nombres<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">INTEGER<\/span><span class=\"o\">]<\/span><span class=\"p\">):<\/span><span class=\"nc\">INTEGER<\/span>\r\n\t\t<span class=\"c1\">-- Retourne la somme des nombres de `a_nombres'<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kc\">Result<\/span> <span class=\"o\">:=<\/span> <span class=\"mi\">0<\/span>\r\n\t\t<span class=\"kr\">across<\/span> <span class=\"n\">a_nombres<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_nombres<\/span> <span class=\"kr\">loop<\/span>\r\n\t\t\t<span class=\"kc\">Result<\/span> <span class=\"o\">:=<\/span> <span class=\"kc\">Result<\/span> <span class=\"o\">+<\/span> <span class=\"n\">la_nombres<\/span><span class=\"p\">.<\/span><span class=\"n\">item<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>La m\u00e9thode retournera la somme totale de tous les nombres puisque les nombres sont directement additionn\u00e9s dans la variable \u00ab\u00a0Result\u00a0\u00bb. Ainsi, la fin de l&rsquo;ex\u00e9cution de la m\u00e9thode, la variable \u00ab\u00a0Result\u00a0\u00bb contient la somme totale.<\/p>\n<h3>Les conditionnelles \u00ab\u00a0if\u00a0\u00bb<\/h3>\n<p>Les conditionnelles \u00ab\u00a0if\u00a0\u00bb sont tr\u00e8s similaires \u00e0 la mani\u00e8re dont on les utilise dans les langages comme Java. Voici un exemple pour voir la syntaxe \u00e0 utiliser:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t\t<span class=\"c1\">-- Ex\u00e9cution de l'application<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_nom<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span>\r\n\t\t<span class=\"n\">l_age<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"n\">io<\/span><span class=\"p\">.<\/span><span class=\"n\">put_string<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Quel est votre nom: \"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">io<\/span><span class=\"p\">.<\/span><span class=\"n\">read_line<\/span>\r\n\t\t<span class=\"n\">l_nom<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">io<\/span><span class=\"p\">.<\/span><span class=\"n\">last_string<\/span>\r\n\t\t<span class=\"n\">io<\/span><span class=\"p\">.<\/span><span class=\"n\">put_string<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Quel est votre age: \"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">io<\/span><span class=\"p\">.<\/span><span class=\"n\">read_integer_32<\/span>\r\n\t\t<span class=\"n\">l_age<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">io<\/span><span class=\"p\">.<\/span><span class=\"n\">last_integer_32<\/span>\r\n\t\t<span class=\"kr\">if<\/span> <span class=\"n\">l_age<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">30<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t<span class=\"n\">io<\/span><span class=\"p\">.<\/span><span class=\"n\">put_string<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Bonjour \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">l_nom<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">elseif<\/span> <span class=\"n\">l_age<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">18<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t<span class=\"n\">io<\/span><span class=\"p\">.<\/span><span class=\"n\">put_string<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Salut \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">l_nom<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">else<\/span>\r\n\t\t\t<span class=\"n\">io<\/span><span class=\"p\">.<\/span><span class=\"n\">put_string<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Yo \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">l_nom<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<h3>Les boucles<\/h3>\n<p>En Eiffel, il existe 2 types de boucles: les boucles \u00ab\u00a0until\u00a0\u00bb et les boucles \u00ab\u00a0across\u00a0\u00bb.<\/p>\n<h4>Les boucles \u00ab\u00a0until\u00a0\u00bb<\/h4>\n<p>La boucle \u00ab\u00a0until\u00a0\u00bb peut servir \u00e0 tout type de boucle. Il s&rsquo;agit d&rsquo;une certaine mani\u00e8re de l&rsquo;\u00e9quivalent d&rsquo;une boucle \u00ab\u00a0while\u00a0\u00bb dans les langages bas\u00e9s sur le C (C++, Java, C#, etc.)<\/p>\n<p>La diff\u00e9rence entre les boucles \u00ab\u00a0while\u00a0\u00bb de C et les boucles \u00ab\u00a0until\u00a0\u00bb de Eiffel est que la condition est invers\u00e9e. Dans le cas de la boucle \u00ab\u00a0while\u00a0\u00bb, la condition indique dans quel cas le programme doit rester dans la boucle (\u00ab\u00a0reste dans la boucle tant que la condition est vraie\u00a0\u00bb) tandis que dans la boucle \u00ab\u00a0until\u00a0\u00bb de Eiffel, la condition indique dans quel cas le programme doit sortir de la boucle (\u00ab\u00a0sort de la boucle lorsque la condition est vraie\u00a0\u00bb).<\/p>\n<p>Voici la syntaxe d&rsquo;une boucle \u00ab\u00a0until\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">from<\/span> <span class=\"n\">i<\/span> <span class=\"o\">:=<\/span> <span class=\"mi\">1<\/span> <span class=\"kr\">until<\/span> <span class=\"n\">i<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">10<\/span> <span class=\"kr\">loop<\/span>\r\n\t<span class=\"c1\">-- corps de la boucle<\/span>\r\n\t<span class=\"n\">i<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">i<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span>\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>La clause \u00ab\u00a0from\u00a0\u00bb consiste en l&rsquo;initialisation des variables qui seront utilis\u00e9es dans la condition de sortie de la boucle \u00ab\u00a0until\u00a0\u00bb. Il est possible de mettre plusieurs instructions dans cette clause. Le contenu de cette clause peut \u00eatre vide.<\/p>\n<p>La clause \u00ab\u00a0until\u00a0\u00bb consiste en la condition de sortie de la boucle. Cette clause est obligatoire et doit contenir une condition bool\u00e9enne.<\/p>\n<p>La clause \u00ab\u00a0loop\u00a0\u00bb contient le corps de la boucle (les instructions qui seront utilis\u00e9es dans la boucle).<\/p>\n<p>\u00c0 noter qu&rsquo;on voit souvent une version multiligne de cette structure. C&rsquo;est tr\u00e8s pratique lorsque l&rsquo;initialisation et la condition sont assez longues et plus complexes. Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">from<\/span>\r\n\t<span class=\"n\">liste<\/span><span class=\"p\">.<\/span><span class=\"n\">start<\/span>\r\n\t<span class=\"n\">trouve<\/span> <span class=\"o\">:=<\/span> <span class=\"kc\">False<\/span>\r\n<span class=\"kr\">until<\/span>\r\n\t<span class=\"n\">liste<\/span><span class=\"p\">.<\/span><span class=\"n\">exhausted<\/span> <span class=\"ow\">or<\/span>\r\n\t<span class=\"n\">trouve<\/span>\r\n<span class=\"kr\">loop<\/span>\r\n\t<span class=\"kr\">if<\/span> <span class=\"n\">liste<\/span><span class=\"p\">.<\/span><span class=\"n\">item<\/span> <span class=\"o\">~<\/span> <span class=\"n\">valeur<\/span> <span class=\"kr\">then<\/span>\r\n\t\t<span class=\"n\">trouve<\/span> <span class=\"o\">:=<\/span> <span class=\"kc\">True<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n\t<span class=\"n\">liste<\/span><span class=\"p\">.<\/span><span class=\"n\">forth<\/span>\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<h4>Les boucles \u00ab\u00a0across\u00a0\u00bb<\/h4>\n<p>Les boucles \u00ab\u00a0across\u00a0\u00bb servent principalement \u00e0 parcourir une structure de donn\u00e9e it\u00e9rable. Voici la syntaxe:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">across<\/span> <span class=\"n\">liste<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_liste<\/span> <span class=\"kr\">loop<\/span>\r\n\t<span class=\"c1\">-- Corps de la boucle<\/span>\r\n\t<span class=\"c1\">-- L'objet en cours peut \u00eatre utilis\u00e9 avec la_liste.item<\/span>\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Voici un exemple complet:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">trouve<\/span> <span class=\"o\">:=<\/span> <span class=\"kc\">False<\/span>\r\n<span class=\"kr\">across<\/span> <span class=\"n\">liste<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_liste<\/span> <span class=\"kr\">loop<\/span>\r\n\t<span class=\"kr\">if<\/span> <span class=\"n\">la_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">item<\/span> <span class=\"o\">~<\/span> <span class=\"n\">valeur<\/span> <span class=\"kr\">then<\/span>\r\n\t\t<span class=\"n\">trouve<\/span> <span class=\"o\">:=<\/span> <span class=\"kc\">True<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<h3>Le \u00ab\u00a0Void-Safety\u00a0\u00bb<\/h3>\n<p>Le \u00ab\u00a0Void-Safety\u00a0\u00bb est une technologie d\u00e9velopp\u00e9e tr\u00e8s r\u00e9cemment dans le langage Eiffel, qui garantit, \u00e0 la compilation, qu&rsquo;aucun d\u00e9r\u00e9f\u00e9rencement de pointeur NULL (appel\u00e9 Void en Eiffel) ne sera effectu\u00e9 par le programme, lors de l&rsquo;ex\u00e9cution.<\/p>\n<p>Dans le domaine de la programmation, le d\u00e9r\u00e9f\u00e9rencement de pointeur NULL est un des \u00ab\u00a0bugs\u00a0\u00bb les plus importants. Tony Hoare, le cr\u00e9ateur du langage ALGOL W et le cr\u00e9ateur du concept de pointeur NULL consid\u00e8re cette cr\u00e9ation comme son erreur de 1 milliard de dollars (Voir: <a href=\"https:\/\/en.wikipedia.org\/wiki\/Null_pointer\">https:\/\/en.wikipedia.org\/wiki\/Null_pointer<\/a>).<\/p>\n<p>Par exemple, prenons le code Java suivant:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kn\">import<\/span> <span class=\"nn\">java.io.File<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Test<\/span> <span class=\"p\">{<\/span>\r\n\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\">String<\/span> <span class=\"n\">texte<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/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\">texte<\/span><span class=\"p\">.<\/span><span class=\"na\">toLowerCase<\/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>L&rsquo;ex\u00e9cution de ce programme vous donnera une exception de type \u00ab\u00a0NullPointerException\u00a0\u00bb. Il s&rsquo;agit en fait d&rsquo;un exemple minimaliste, mais les cas plus concrets peuvent \u00eatre beaucoup plus complexes. Ils peuvent \u00e9galement \u00eatre tr\u00e8s difficiles \u00e0 r\u00e9gler.<\/p>\n<p>Dans les langages permettant l&rsquo;utilisation de pointeur NULL, certains permettent de d\u00e9celer certains probl\u00e8mes potentiels de d\u00e9r\u00e9f\u00e9rencement de pointeur NULL; mais tr\u00e8s peu ne garantit qu&rsquo;il n&rsquo;y en aura jamais. Eiffel est de ces derniers.<\/p>\n<p>Afin de r\u00e9gler d\u00e9finitivement le probl\u00e8me de d\u00e9r\u00e9f\u00e9rencement de pointeur NULL, Eiffel force toute variable \u00e0 \u00eatre initialis\u00e9e avant le possible d\u00e9r\u00e9f\u00e9rencement de cette variable. Cette derni\u00e8re r\u00e8gle pr\u00e9vaut \u00e9galement pour l&rsquo;initialisation des attributs par le constructeur. C&rsquo;est \u00e0 dire, si le constructeur peut se terminer sans que le compilateur puisse garantir que l&rsquo;attribut est initialis\u00e9, le compilateur donnera une erreur de compilation afin de vous permettre de vous assurer que l&rsquo;attribut est bel et bien initialis\u00e9 dans tous les cas. Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">TEST<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"c1\">-- Initialisation de `Current'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Initialisation de l'objet\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">attribut1<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Ce code donnera une erreur \u00ab\u00a0VEVI: variable is not properly set\u00a0\u00bb. \u00c7a indique en fait que le compilateur ne peut pas confirmer que l&rsquo;attribut (\u00ab\u00a0attribut1\u00a0\u00bb) est correctement initialis\u00e9 \u00e0 la fin du constructeur \u00ab\u00a0make\u00a0\u00bb.<\/p>\n<p>Voici un autre exemple plus complexe:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">TEST<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"n\">a_textes<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"c1\">-- Initialisation de `Current'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">if<\/span> <span class=\"n\">a_textes<\/span><span class=\"p\">.<\/span><span class=\"n\">count<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">0<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">attribut1<\/span><span class=\"p\">.<\/span><span class=\"n\">make_empty<\/span>\r\n\t\t\t\t<span class=\"kr\">across<\/span> <span class=\"n\">a_textes<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_textes<\/span> <span class=\"kr\">loop<\/span>\r\n\t\t\t\t\t<span class=\"n\">attribut1<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">attribut1<\/span> <span class=\"o\">+<\/span> <span class=\"n\">a_textes<\/span><span class=\"p\">.<\/span><span class=\"n\">item<\/span>\r\n\t\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">attribut1<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Dans cet exemple, si la liste de textes re\u00e7ue en argument est vide, l&rsquo;attribut ne sera pas initialis\u00e9 \u00e0 la fin du constructeur. Nous obtenons donc encore une erreur de code VEVI.<\/p>\n<h4>Utilisation d&rsquo;objet Void<\/h4>\n<p>Le fait qu&rsquo;Eiffel est \u00ab\u00a0Void Safe\u00a0\u00bb n&rsquo;indique pas qu&rsquo;il est impossible d&rsquo;utiliser des objets Void. Par contre, ces objets doivent \u00eatre d\u00e9clar\u00e9s comme \u00e9tant \u00ab\u00a0detachable\u00a0\u00bb. Par exemple: l&rsquo;exemple suivant (qui ne compilait pas pr\u00e9c\u00e9demment) compile maintenant sans probl\u00e8me:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">TEST<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"c1\">-- Initialisation de `Current'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Initialisation de l'objet\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">attribut1<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Par contre, si j&rsquo;essaie d&rsquo;utiliser l&rsquo;attribut potentiellement non initialis\u00e9, j&rsquo;obtiens de nouveau une erreur de type VEVI. Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">TEST<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"c1\">-- Initialisation de `Current'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Initialisation de l'objet\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">ajoute_texte<\/span><span class=\"p\">(<\/span><span class=\"n\">a_texte<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"c1\">-- Ajoute `a_texte' \u00e0 `attribut1'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">attribut1<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">attribut1<\/span> <span class=\"o\">+<\/span> <span class=\"n\">a_texte<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">attribut1<\/span><span class=\"p\">:<\/span><span class=\"kr\">detachable<\/span> <span class=\"nc\">STRING<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>En effet, lors de l&rsquo;utilisation de l&rsquo;attribut1 dans la m\u00e9thode \u00ab\u00a0ajoute_texte\u00a0\u00bb, il est possible que l&rsquo;attribut un ne soit pas initialis\u00e9. Donc, pour utiliser un attribut d\u00e9tachable, il faut faire un \u00ab\u00a0if attached\u00a0\u00bb, comme ceci:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">TEST<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"c1\">-- Initialisation de `Current'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Initialisation de l'objet\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">ajoute_texte<\/span><span class=\"p\">(<\/span><span class=\"n\">a_texte<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"c1\">-- Ajoute `a_texte' \u00e0 `attribut1'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">if<\/span> <span class=\"kr\">attached<\/span> <span class=\"n\">attribut1<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_attribut1<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t\t<span class=\"n\">attribut1<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">la_attribut1<\/span> <span class=\"o\">+<\/span> <span class=\"n\">a_texte<\/span>\r\n\t\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">attribut1<\/span><span class=\"p\">:<\/span><span class=\"kr\">detachable<\/span> <span class=\"nc\">STRING<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>La variable \u00ab\u00a0la_attribut1\u00a0\u00bb dans cet exemple est une copie du pointeur de l&rsquo;attribut1. Cette copie est essentielle, car il n&rsquo;est pas impossible qu&rsquo;entre l&rsquo;ex\u00e9cution du \u00ab\u00a0if\u00a0\u00bb et le d\u00e9r\u00e9f\u00e9rencement du pointeur, l&rsquo;attribut1 soit remis \u00e0 Void. Voici un exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">TEST<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"c1\">-- Initialisation de `Current'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Initialisation de l'objet\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">ajoute_texte<\/span><span class=\"p\">(<\/span><span class=\"n\">a_texte<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"c1\">-- Ajoute `a_texte' \u00e0 `attribut1'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">if<\/span> <span class=\"kr\">attached<\/span> <span class=\"n\">attribut1<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t\t<span class=\"n\">retire_texte<\/span>\r\n\t\t\t\t<span class=\"n\">attribut1<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">attribut1<\/span> <span class=\"o\">+<\/span> <span class=\"n\">a_texte<\/span>\r\n\t\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">retire_texte<\/span>\r\n\t\t\t<span class=\"c1\">-- Retire l'objet `attribut1'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">attribut1<\/span> <span class=\"o\">:=<\/span><span class=\"kc\">void<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">attribut1<\/span><span class=\"p\">:<\/span><span class=\"kr\">detachable<\/span> <span class=\"nc\">STRING<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Il est clair que dans cet exemple, m\u00eame si le \u00ab\u00a0if\u00a0\u00bb v\u00e9rifie que l&rsquo;attribut1 n&rsquo;est pas Void, lors de l&rsquo;utilisation de l&rsquo;attribut1 (dans l&rsquo;expression \u00ab\u00a0attribut1 + a_texte\u00a0\u00bb), cet attribut sera Void puisque la m\u00e9thode \u00ab\u00a0retire_texte\u00a0\u00bb a mis ce dernier \u00e0 Void. Donc, le code suivant compilerait correctement puisque \u00ab\u00a0la_attribut1\u00a0\u00bb est utilis\u00e9 au lieu de attribut1 dans l&rsquo;expression potentiellement probl\u00e9matique (\u00ab\u00a0la_attribut1 + a_texte\u00a0\u00bb):<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">TEST<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"c1\">-- Initialisation de `Current'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Initialisation de l'objet\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">ajoute_texte<\/span><span class=\"p\">(<\/span><span class=\"n\">a_texte<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"c1\">-- Ajoute `a_texte' \u00e0 `attribut1'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">if<\/span> <span class=\"kr\">attached<\/span> <span class=\"n\">attribut1<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_attribut1<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t\t<span class=\"n\">retire_texte<\/span>\r\n\t\t\t\t<span class=\"n\">attribut1<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">la_attribut1<\/span> <span class=\"o\">+<\/span> <span class=\"n\">a_texte<\/span>\r\n\t\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">retire_texte<\/span>\r\n\t\t\t<span class=\"c1\">-- Retire l'objet `attribut1'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">attribut1<\/span> <span class=\"o\">:=<\/span><span class=\"kc\">void<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">attribut1<\/span><span class=\"p\">:<\/span><span class=\"kr\">detachable<\/span> <span class=\"nc\">STRING<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.louismarchand.me\/index.php\/a-propos-de\/programmation-orientee-objet-2\/\">Retour<\/a><\/p>\n<hr \/>\n<p>Auteur: Louis Marchand<br \/><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 \/>Sauf 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>Historique Cr\u00e9\u00e9 par Bertrand Meyer; Premi\u00e8re version en 1986; Les trois vies du langage Eiffel: Langage th\u00e9orique \u00c9criture du livre \u00ab\u00a0Object-Oriented Software Construction\u00a0\u00bb; Aucun langage \u00e0 l&rsquo;\u00e9poque ne permettait de repr\u00e9senter les diff\u00e9rents concepts du livre; Le langage a \u00e9t\u00e9 cr\u00e9\u00e9 afin de repr\u00e9senter les exemples du livre; Aucun compilateur ou interpr\u00e9teur n&rsquo;\u00e9tait disponible. Langage&hellip; <a class=\"more-link\" href=\"https:\/\/www.louismarchand.me\/index.php\/objet2-le-langage-eiffel\/\">Continue reading <span class=\"screen-reader-text\">Le langage Eiffel<\/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-425","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/425","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=425"}],"version-history":[{"count":1,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/425\/revisions"}],"predecessor-version":[{"id":427,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/425\/revisions\/427"}],"wp:attachment":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/media?parent=425"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}