{"id":143,"date":"2021-08-18T15:47:20","date_gmt":"2021-08-18T15:47:20","guid":{"rendered":"https:\/\/www.louismarchand.me\/?page_id=143"},"modified":"2022-08-26T13:50:03","modified_gmt":"2022-08-26T13:50:03","slug":"object2-intro","status":"publish","type":"page","link":"https:\/\/www.louismarchand.me\/index.php\/object2-intro\/","title":{"rendered":"Introduction"},"content":{"rendered":"<h2>Un bref historique<\/h2>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Simula\n<ul>\n<li>Cr\u00e9\u00e9 en 1962 par Ole-Johan Dahl et Kristen Nygaard<\/li>\n<li>Langage de simulation<\/li>\n<li>Bas\u00e9 sur Algol60, un langage proc\u00e9dural utilis\u00e9 dans les ann\u00e9es 1960<\/li>\n<li>L&rsquo;invention du concept objet par accident<\/li>\n<li>L&rsquo;objectif du langage \u00e9tait de simuler des objets de la vie r\u00e9elle.<\/li>\n<li>M\u00eame s&rsquo;il s&rsquo;agit du premier langage objet, son impl\u00e9mentation objet est chaotique et mal structur\u00e9e.<\/li>\n<\/ul>\n<\/li>\n<li>Smalltalk\n<ul>\n<li>Cr\u00e9\u00e9 en 1972 par Alan Kay, Dan Ingals, Ted Kaehler, Adele Goldberg<\/li>\n<li>L&rsquo;objectif du langage est la transmission de message entre instances d&rsquo;objet.<\/li>\n<li>Bas\u00e9 sur Simula<\/li>\n<li>Langage par prototype.<\/li>\n<li>Alan Kay est souvent consid\u00e9r\u00e9 comme un des p\u00e8res de la programmation orient\u00e9e objet 2.<\/li>\n<\/ul>\n<\/li>\n<li>C++\n<ul>\n<li>Cr\u00e9\u00e9 en 1983 par Bjarne Stroustrup<\/li>\n<li>\u00c9volution orient\u00e9e objet du langage C<\/li>\n<li>Structure objet puissante, mais mal structur\u00e9e.\n<ul>\n<li>Certains programmeurs C++ se r\u00e9fugient dans les \u00ab\u00a0template\u00a0\u00bb C++ pour \u00e9viter les probl\u00e8mes que peut poser la structure objet C++.<\/li>\n<li>Certains programmeurs \u00e9vitent d&rsquo;utiliser certains concepts objet C++ (par exemple, l&rsquo;h\u00e9ritage multiple) afin d&rsquo;\u00e9viter les probl\u00e8mes que peut poser la structure objet C++<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>Eiffel\n<ul>\n<li>Cr\u00e9er en 1986 par Bertrand Meyer<\/li>\n<li>les langages orient\u00e9s objet de l&rsquo;\u00e9poque \u00e9taient souvent mal structur\u00e9s et malgr\u00e9 que beaucoup de bonnes id\u00e9es ressortaient, le domaine \u00e9tait pour le moins, chaotique.<\/li>\n<li>Bertrand Meyer, un chercheur en d\u00e9veloppement logiciel, \u00e9crivit un livre sur le d\u00e9veloppement de langage orient\u00e9 objet:\n<ul>\n<li>Object-Oriented Software Construction<\/li>\n<\/ul>\n<\/li>\n<li>Aucun langage \u00e0 l&rsquo;\u00e9poque ne permettait de g\u00e9rer tous les concepts objets pr\u00e9sent\u00e9s dans le livre;<\/li>\n<li>Bretrand Meyer a donc invent\u00e9 un langage th\u00e9orique (\u00e0 l&rsquo;\u00e9poque) qui lui permettrait de donner les d\u00e9monstration et exemple n\u00e9cessaire dans son livre.<\/li>\n<li>Bertrand Meyer est \u00e9galement consid\u00e9r\u00e9 comme un des p\u00e8res de la programmation orient\u00e9e objet.<\/li>\n<\/ul>\n<\/li>\n<li>Java:\n<ul>\n<li>Cr\u00e9\u00e9 en 1996 par Sun Microsystem.<\/li>\n<li>L&rsquo;objectif \u00e9tait de cr\u00e9er des programmes orient\u00e9s objet pour le Web<\/li>\n<li>Contrairement aux langages orient\u00e9s objet de l&rsquo;\u00e9poque (C++, Ada, Pascal, etc.), Java obligeait l&rsquo;utilisation de l&rsquo;orient\u00e9e objet dans la cr\u00e9ation de code.<\/li>\n<li>Malgr\u00e9 qu&rsquo;il n&rsquo;a apport\u00e9 aucune \u00e9volution aux m\u00e9caniques objets, java a grandement particip\u00e9 \u00e0 l&rsquo;int\u00e9r\u00eat des d\u00e9veloppeurs pour les technologies objet.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Quelques d\u00e9finitions<\/h2>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>On appelle <strong>instance<\/strong> la repr\u00e9sentation en m\u00e9moire d&rsquo;un ensemble de donn\u00e9e;\n<ul>\n<li>On appelle <strong>instanciation<\/strong> le fait r\u00e9server un espace m\u00e9moire et d&rsquo;y copier des donn\u00e9es.<\/li>\n<\/ul>\n<\/li>\n<li>On appelle <strong>routine<\/strong>, un m\u00e9canisme de programmation qui encapsule une portion de code qui effectue un traitement sp\u00e9cifique.\n<ul>\n<li>On nomme <strong>appel<\/strong> le fait d&rsquo;ex\u00e9cuter une routine;<\/li>\n<li>Lors d&rsquo;un appel de routine, la <strong>routine appelante<\/strong> est la routine ayant lanc\u00e9 l&rsquo;ex\u00e9cution d&rsquo;une autre routine;<\/li>\n<li>Lors d&rsquo;un appel de routine, la <strong>routine appel\u00e9e<\/strong> est la routine doit \u00eatre ex\u00e9cut\u00e9e;<\/li>\n<li>On appelle <strong>variable locale<\/strong> les donn\u00e9es uniquement accessibles \u00e0 l&rsquo;int\u00e9rieur d&rsquo;une routine;<\/li>\n<li>On dit qu&rsquo;on a un <strong>effet de bord<\/strong> lorsque durant l&rsquo;ex\u00e9cution d&rsquo;une routine, l&rsquo;\u00e9tat du syst\u00e8me a \u00e9t\u00e9 modifi\u00e9. Cela arrive lorsqu&rsquo;une routine effectue une entr\u00e9e\/sortit ou modifie une variable non locale et ne replace pas le r\u00e9sultat de cette modification \u00e0 son \u00e9tat initial.<\/li>\n<li>Une <strong>fonction<\/strong> est une routine qui a pour travail de retourner une valeur \u00e0 la routine appelante;\n<ul>\n<li>En g\u00e9n\u00e9ral, une fonction devrait \u00e9viter de causer des effets de bord;<\/li>\n<li>On appelle <strong>fonction pure<\/strong>, une fonction ne faisant pas d&rsquo;effet de bord;<\/li>\n<\/ul>\n<\/li>\n<li>Une <strong>proc\u00e9dure<\/strong> est une routine qui ne retourne aucune valeur de retour. Ce type de routine sert \u00e0 modifier l&rsquo;\u00e9tat du syst\u00e8me par effet de bord.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Un objet<\/h2>\n<p>Un <strong>objet<\/strong> est une repr\u00e9sentation abstraite d&rsquo;une instance m\u00e9moire permettant de regrouper des informations reli\u00e9es entre elles par des liens logiques et des m\u00e9canismes permettant la manipulation de ces informations.<\/p>\n<h3>Comparaison avec la programmation proc\u00e9durale<\/h3>\n<p>Comme on peut le constater dans la d\u00e9finition, la programmation orient\u00e9e objet met de l&rsquo;avant les informations avant les m\u00e9canismes. Il s&rsquo;agit du changement de paradigme majeur par rapport \u00e0 la programmation proc\u00e9durale.<\/p>\n<h2>Les diff\u00e9rents types de langages objet<\/h2>\n<p>Il existe deux (2) grandes cat\u00e9gories de langage objet:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Les langages orient\u00e9s objet par classes:\n<ul>\n<li>En g\u00e9n\u00e9ral, les langages proc\u00e9duraux ont \u00e9volu\u00e9 en langage orient\u00e9e objet par classe.<\/li>\n<li>Parmi ces langages, on retrouve:\n<ul>\n<li>Java<\/li>\n<li>C#<\/li>\n<li>Eiffel<\/li>\n<li>Pascal Objet<\/li>\n<li>Python<\/li>\n<li>PHP<\/li>\n<li>etc.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>Les langages orient\u00e9s objet par prototype:\n<ul>\n<li>En g\u00e9n\u00e9ral, ce sont les langages fonctionnels qui ont \u00e9volu\u00e9 en langage par prototype.<\/li>\n<li>Parmi ces langages, on retrouve:\n<ul>\n<li>Javascript<\/li>\n<li>LISP<\/li>\n<li>Scheme<\/li>\n<li>Haskell<\/li>\n<li>Ocaml<\/li>\n<li>Smalltalk<\/li>\n<li>etc.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Les langages objet par prototypes<\/h3>\n<p>Dans le cadre du cours, nous travaillerons avec des langages par classes. J&rsquo;aimerais donc prendre un moment pour parler des langages objet par prototype. Dans ce type de langages:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Les objets sont enti\u00e8rement cr\u00e9\u00e9s par clonage (copie int\u00e9grale d&rsquo;autres objets);<\/li>\n<li>Les prototypes sont cr\u00e9\u00e9s en clonant un objet de base du langage (un objet sans m\u00e9thodes ni attributs);<\/li>\n<li>Pour cr\u00e9er les instances diff\u00e9rentes d&rsquo;un type d&rsquo;objet (par exemple, client, facture, etc.), on clone le prototype;<\/li>\n<li>L&rsquo;h\u00e9ritage est cr\u00e9\u00e9 en g\u00e9n\u00e9rant un nouveau prototype, en clonant le prototype anc\u00eatre;<\/li>\n<li>Ce type de langage utilise g\u00e9n\u00e9ralement le \u00ab\u00a0Duck Typing\u00a0\u00bb, ce qui permet d&rsquo;une certaine mani\u00e8re, le polymorphisme sans utiliser de m\u00e9thode abstraite.\n<ul>\n<li>Le \u00ab\u00a0<strong>Duck Typing<\/strong>\u00a0\u00bb est une m\u00e9canique de langage permettant de valider l&rsquo;utilisation d&rsquo;une m\u00e9thode ou d&rsquo;un attribut, sans avoir \u00e0 typer la variable;<\/li>\n<li>L&rsquo;id\u00e9e est que l&rsquo;interpr\u00e9teur de langage regarde si l&rsquo;objet contient la m\u00e9thode, \u00e0 l&rsquo;ex\u00e9cution, et si ce n&rsquo;est pas le cas, lance une exception;<\/li>\n<li>L&rsquo;utilisation du \u00ab\u00a0Duck typing\u00a0\u00bb est g\u00e9n\u00e9ralement r\u00e9serv\u00e9e aux langages interpr\u00e9t\u00e9s.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Voici un exemple de code objet \u00e9crit en Javascript qui utilise la m\u00e9canique de prototype:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"kd\">function<\/span> <span class=\"nx\">Personne<\/span><span class=\"p\">(<\/span><span class=\"nx\">aNom<\/span><span class=\"p\">,<\/span> <span class=\"nx\">aAge<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n\t<span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">nom<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">aNom<\/span><span class=\"p\">;<\/span>\r\n\t<span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">age<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">aAge<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"nx\">Personne<\/span><span class=\"p\">.<\/span><span class=\"nx\">prototype<\/span><span class=\"p\">.<\/span><span class=\"nx\">bonjour<\/span> <span class=\"o\">=<\/span> <span class=\"kd\">function<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n\t<span class=\"nx\">alert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Bonjour. Mon nom est &quot;<\/span> <span class=\"o\">+<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">nom<\/span> <span class=\"o\">+<\/span> <span class=\"s2\">&quot; et mon age est &quot;<\/span> <span class=\"o\">+<\/span>\r\n\t\t<span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">age<\/span> <span class=\"o\">+<\/span><span class=\"s2\">&quot; ans.&quot;<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"kd\">function<\/span> <span class=\"nx\">Enseignant<\/span><span class=\"p\">(<\/span><span class=\"nx\">aNom<\/span><span class=\"p\">,<\/span> <span class=\"nx\">aAge<\/span><span class=\"p\">,<\/span> <span class=\"nx\">aCours<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n\t<span class=\"nx\">Personne<\/span><span class=\"p\">.<\/span><span class=\"nx\">call<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">,<\/span> <span class=\"nx\">aNom<\/span><span class=\"p\">,<\/span> <span class=\"nx\">aAge<\/span><span class=\"p\">);<\/span>\r\n\t<span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">cours<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">aCours<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"nx\">Enseignant<\/span><span class=\"p\">.<\/span><span class=\"nx\">prototype<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">Object<\/span><span class=\"p\">.<\/span><span class=\"nx\">create<\/span><span class=\"p\">(<\/span><span class=\"nx\">Personne<\/span><span class=\"p\">.<\/span><span class=\"nx\">prototype<\/span><span class=\"p\">);<\/span>\r\n<span class=\"nx\">Enseignant<\/span><span class=\"p\">.<\/span><span class=\"nx\">prototype<\/span><span class=\"p\">.<\/span><span class=\"kr\">constructor<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">Enseignant<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"nx\">Enseignant<\/span><span class=\"p\">.<\/span><span class=\"nx\">prototype<\/span><span class=\"p\">.<\/span><span class=\"nx\">bonjour<\/span> <span class=\"o\">=<\/span> <span class=\"kd\">function<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n\t<span class=\"nx\">alert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Bonjour. Mon nom est &quot;<\/span> <span class=\"o\">+<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">nom<\/span> <span class=\"o\">+<\/span> <span class=\"s2\">&quot; et mon age est &quot;<\/span> <span class=\"o\">+<\/span>\r\n\t\t<span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">age<\/span> <span class=\"o\">+<\/span> <span class=\"s2\">&quot; ans.\\n Je suis enseignant du cours de &quot;<\/span> <span class=\"o\">+<\/span>\r\n\t\t<span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">cours<\/span> <span class=\"o\">+<\/span> <span class=\"s2\">&quot;.&quot;<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n\r\n<span class=\"nx\">chuck<\/span> <span class=\"o\">=<\/span> <span class=\"ow\">new<\/span> <span class=\"nx\">Personne<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Chuck&quot;<\/span><span class=\"p\">,<\/span> <span class=\"mf\">40<\/span><span class=\"p\">);<\/span>\r\n<span class=\"nx\">chuck<\/span><span class=\"p\">.<\/span><span class=\"nx\">bonjour<\/span><span class=\"p\">();<\/span>\r\n\r\n<span class=\"nx\">louis<\/span> <span class=\"o\">=<\/span> <span class=\"ow\">new<\/span> <span class=\"nx\">Enseignant<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Louis&quot;<\/span><span class=\"p\">,<\/span> <span class=\"mf\">30<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;Programmation orient\u00e9e objet 2&quot;<\/span><span class=\"p\">);<\/span>\r\n<span class=\"nx\">louis<\/span><span class=\"p\">.<\/span><span class=\"nx\">bonjour<\/span><span class=\"p\">();<\/span>\r\n<\/pre>\n<\/div>\n<p>Il est \u00e0 noter que des m\u00e9caniques de programmation orient\u00e9e objet par classe ont \u00e9t\u00e9 ajout\u00e9es dans les versions r\u00e9centes de Javascript.<\/p>\n<p><a href=\"https:\/\/www.louismarchand.me\/index.php\/les-cours\/programmation-orientee-objet-2\/\">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>Un bref historique Simula Cr\u00e9\u00e9 en 1962 par Ole-Johan Dahl et Kristen Nygaard Langage de simulation Bas\u00e9 sur Algol60, un langage proc\u00e9dural utilis\u00e9 dans les ann\u00e9es 1960 L&rsquo;invention du concept objet par accident L&rsquo;objectif du langage \u00e9tait de simuler des objets de la vie r\u00e9elle. M\u00eame s&rsquo;il s&rsquo;agit du premier langage objet, son impl\u00e9mentation objet&hellip; <a class=\"more-link\" href=\"https:\/\/www.louismarchand.me\/index.php\/object2-intro\/\">Continue reading <span class=\"screen-reader-text\">Introduction<\/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-143","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/143","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=143"}],"version-history":[{"count":12,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/143\/revisions"}],"predecessor-version":[{"id":662,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/143\/revisions\/662"}],"wp:attachment":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/media?parent=143"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}