{"id":230084,"date":"2022-11-21T11:26:00","date_gmt":"2022-11-21T08:26:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230084"},"modified":"2022-11-21T17:42:28","modified_gmt":"2022-11-21T14:42:28","slug":"programmation-orientee-objet-comprendre-les-interfaces","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/programmation-orientee-objet-comprendre-les-interfaces\/","title":{"rendered":"Programmation orient\u00e9e objet\u00a0: Comprendre les interfaces"},"content":{"rendered":"\n<p>\u00c0 ce stade, je dirais que les bases de la compr\u00e9hension de la programmation orient\u00e9e objet ont \u00e9t\u00e9 pos\u00e9es.<\/p>\n<p>Plus pr\u00e9cis\u00e9ment, j&rsquo;ai couvert:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/les-deux-premiers-piliers-de-la-poo\/\" title=\"Abstraction\">Abstraction<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/les-deux-premiers-piliers-de-la-poo\/\" title=\"Encapsulation\">Encapsulation<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/les-deux-deuxiemes-piliers-de-la-poo\/\" title=\"H\u00e9ritage\">H\u00e9ritage<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/les-deux-deuxiemes-piliers-de-la-poo\/\" title=\"Polymorphisme\">Polymorphisme<\/a><\/li>\n<\/ol>\n<p>Et, oui, il y a un d\u00e9bat sur ce qui constitue les fondations (c&rsquo;est-\u00e0-dire que certains ne m\u00e9langent pas le polymorphisme dans le m\u00e9lange, bien que je le fasse). Mais les quatre ci-dessus devraient fournir une base solide sur laquelle continuer \u00e0 d\u00e9velopper vos comp\u00e9tences en programmation orient\u00e9e objet.<\/p>\n<p>Il y en a d&rsquo;autres, mais je ne pense pas qu&rsquo;ils soient aussi profonds, d\u00e9taill\u00e9s ou difficiles \u00e0 comprendre que certains des concepts susmentionn\u00e9s. L\u00e0 encore, diff\u00e9rentes choses deviennent plus faciles pour les autres.<\/p>\n<p>Quoi qu&rsquo;il en soit, les deux sujets suivants qu&rsquo;il est important de comprendre sont\u00a0:<\/p>\n<ol>\n<li>Interfaces<\/li>\n<li>Abstraction<\/li>\n<\/ol>\n<p>Je parlerai de chacun s\u00e9par\u00e9ment, mais assurez-vous que vous avez d&rsquo;abord lu la s\u00e9rie <a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Fondamentaux<\/a>, car les deux sujets ci-dessus vous permettront de vous y fier et d&rsquo;en tirer parti.<\/p>\n<p>Vague, je sais, mais laissez-moi vous expliquer et ensuite partir de l\u00e0.<\/p>\n<h2>Comprendre les interfaces<\/h2>\n<p>De loin, la d\u00e9finition la plus courante d&rsquo;une interface que vous entendrez probablement est qu&rsquo;il s&rsquo;agit d&rsquo;un contrat. Ce n&rsquo;est pas faux, mais je pense que cela laisse beaucoup \u00e0 d\u00e9sirer.<\/p>\n<p>Par exemple, lorsque vous pensez \u00e0 des contrats, vous pensez probablement \u00e0 quelque chose de tr\u00e8s compliqu\u00e9, beaucoup de jargon, un processus compliqu\u00e9 pour obtenir quelque chose sign\u00e9, dat\u00e9, pr\u00eat \u00e0 fonctionner et ainsi de suite.<\/p>\n<p>Mais quand il s&rsquo;agit d&rsquo;interfaces de programmation, ce n&rsquo;est vraiment pas le cas. En fait, je dirais que la d\u00e9finition d&rsquo;interfaces peut faciliter la programmation et all\u00e9ger beaucoup de formalit\u00e9s administratives car cela rend les choses tr\u00e8s noires ou blanches quant \u00e0 ce que quelque chose doit impl\u00e9menter.<\/p>\n<h3>Un mot sur les &quot;interfaces&quot;<\/h3>\n<p>Notre industrie utilise le mot \u00abinterface\u00bb pour deux choses :<\/p>\n<ul>\n<li>Les concepteurs et les utilisateurs utilisent le terme interface pour d\u00e9crire ce qu&rsquo;ils voient et comment ils interagissent avec l&rsquo;application. Cela inclut des \u00e9l\u00e9ments tels que des boutons, des listes d\u00e9roulantes et d&rsquo;autres \u00e9l\u00e9ments que nous pouvons &quot;toucher&quot;.<\/li>\n<li>Les programmeurs utilisent le terme pour d\u00e9signer les fonctions qu&rsquo;une sous-classe doit impl\u00e9menter pour adh\u00e9rer \u00e0 une interface. C&rsquo;est ce qu&rsquo;on appelle la &quot;programmation sur une interface&quot;.<\/li>\n<\/ul>\n<p>Ce dernier est ce qui va \u00eatre discut\u00e9 dans cet article. Et non, nous n&rsquo;allons pas utiliser d&rsquo;exemples typiques comme la programmation d&rsquo;une interface <strong>Animal ou autre.<\/strong> Au lieu de cela, nous verrons comment le faire \u00e0 partir d&rsquo;\u00e9chantillons de code r\u00e9els.<\/p>\n<h3>Programmation sur une interface<\/h3>\n<p>Nous d\u00e9finissons la &quot;programmation sur une interface&quot; comme un moyen pour nous d&rsquo;\u00e9crire du code qui impl\u00e9mente les signatures des fonctions d\u00e9finies dans ladite interface.<\/p>\n<p>Mais que sont les signatures de m\u00e9thode? En termes simples, les signatures de m\u00e9thode incluent\u00a0:<\/p>\n<ul>\n<li>le nom du nom de la fonction,<\/li>\n<li>les arguments qu&rsquo;il prend,<\/li>\n<li>le modificateur de visibilit\u00e9<\/li>\n<\/ul>\n<p>Dans le contexte d&rsquo;une classe, vous le verrez <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-00-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">comme ceci :<\/a><\/p>\n<pre><code>&lt;?php\n\nclass Cache \n{\n  public function set($key, $value) \n  {\n    \/\/ method implementation\n  }\n}\n<\/code><\/pre>\n<p>Facile, non ?<\/p>\n<p>Dans le code ci-dessus, nous pouvons voir que la fonction <strong>set<\/strong> accepte une <strong>cl\u00e9<\/strong> et une <strong>valeur<\/strong> qui seront utilis\u00e9es et la fonction est accessible par tout objet qui a une r\u00e9f\u00e9rence \u00e0 la classe.<\/p>\n<p>Mais les interfaces peuvent \u00e9galement inclure cela. Il y a cependant une mise en garde: les interfaces n&rsquo;ont pas d&rsquo;impl\u00e9mentation de m\u00e9thode.<\/p>\n<p>Donc plut\u00f4t que quelque chose <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-01-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">comme \u00e7a :<\/a><\/p>\n<pre><code>&lt;?php\n\nclass Cache \n{\n  public function set($key, $value) {\n    set_transient($key, $value);\n  }\n}\n<\/code><\/pre>\n<p>Vous verrez <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-02-cacheinterface-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ceci\u00a0:<\/a><\/p>\n<pre><code>&lt;?php\n\ninterface iCache \n{\n  public function set($key, $value);\n  public function get($key);\n  public function has($key);\n}\n<\/code><\/pre>\n<p>Mais il y a aussi quelques subtilit\u00e9s \u00e0 noter dans le code ci-dessus.<\/p>\n<ul>\n<li>Ce code ne le d\u00e9finit pas comme une classe. Au lieu de cela, il l&rsquo;appelle une <strong>interface<\/strong>.<\/li>\n<li>Le nom de la classe est pr\u00e9c\u00e9d\u00e9 d&rsquo;un &lsquo;i&rsquo; pour indiquer qu&rsquo;il s&rsquo;agit d&rsquo;une interface. Ce n&rsquo;est pas obligatoire ; c&rsquo;est une convention.<\/li>\n<li>La m\u00e9thode n&rsquo;a pas d&rsquo;impl\u00e9mentation. Il n&rsquo;a rien d&rsquo;autre qu&rsquo;une signature.<\/li>\n<\/ul>\n<p>Lorsque nous cr\u00e9ons une interface, nous disons, comme mentionn\u00e9 ci-dessus, que quelle que soit la classe impl\u00e9mentant l&rsquo;interface, elle d\u00e9finira les m\u00e9thodes qu&rsquo;elle inclut.<\/p>\n<p>Donc, si nous devions lier tout ce que nous avons vu ci-dessus, l&rsquo;impl\u00e9mentation finale ressemblerait <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-03-simplecache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci<\/a> (m\u00eame si nous devrions id\u00e9alement conserver cela dans des fichiers s\u00e9par\u00e9s) :<\/p>\n<pre><code>&lt;?php\n\ninterface iCache {\n  public function set($key, $value);\n  public function get($key);\n  public function has($key);\n}\n\npublic class SimpleCache implemnents iCache\n{\n  public function set($key, $value)\n  {\n    set_transient($key, $value, DAY_IN_SECONDS);\n  }\n\n  public function get($key)\n  {\n    if (!$this-&gt;has($key))\n    {\n      return false;\n    }\n    return get_transient($key);\n  }\n\n  public function has($key)\n  {\n    return false !== get_transient($key);\n  }\n}\n<\/code><\/pre>\n<p>Et c&rsquo;est ainsi que les interfaces et les classes s&rsquo;imbriquent.<\/p>\n<h2>C&rsquo;est \u00e7a?<\/h2>\n<p>En termes simples, oui. Mais d&rsquo;apr\u00e8s mon exp\u00e9rience, j&rsquo;ai d\u00e9couvert qu&rsquo;il ne suffit pas de d\u00e9finir les m\u00e9thodes et de les mettre en \u0153uvre.<\/p>\n<p>Souvent, il est facile de d\u00e9finir des classes, puis de d\u00e9finir l&rsquo;interface, puis de mettre en \u0153uvre l&rsquo;interface. Mais c&rsquo;est <strong>compl\u00e8tement<\/strong> \u00e0 l&rsquo; envers. Au lieu de cela, nous devons penser de mani\u00e8re plus strat\u00e9gique \u00e0 notre travail.<\/p>\n<p>Plut\u00f4t que de reculer dans une interface, ce qui va compl\u00e8tement \u00e0 l&rsquo;encontre de l&rsquo;objectif, nous devons commencer large afin que nos classes puissent se sp\u00e9cialiser dans ce qu&rsquo;elles font tout en impl\u00e9mentant des fonctionnalit\u00e9s communes non seulement \u00e0 cette classe, mais \u00e0 d&rsquo;autres classes qui peuvent avoir besoin de la m\u00eame fonctionnalit\u00e9.<\/p>\n<p>En utilisant l&rsquo;exemple ci-dessus, nous pouvons avoir un <strong>SimpleCache,<\/strong> un <strong>TransientCache<\/strong> ou un autre type de cache. Quel que soit le type de cache que nous impl\u00e9mentons, ils impl\u00e9menteront l&rsquo;interface et la fonctionnalit\u00e9 sera laiss\u00e9e \u00e0 la classe impl\u00e9mentant l&rsquo;interface.<\/p>\n<p>Nous d\u00e9finissons donc \u00e0 quoi un cache pourrait ressembler \u00e0 un niveau \u00e9lev\u00e9, mais les classes d&rsquo;impl\u00e9mentation d\u00e9finiront exactement comment elles fonctionnent.<\/p>\n<hr \/>\n<p>Si vous \u00eates un d\u00e9veloppeur WordPress et que vous cherchez \u00e0 apprendre \u00e0 cr\u00e9er des choses au-dessus de l&rsquo;application en utilisant des techniques pratiques orient\u00e9es objet, alors <a href=\"https:\/\/tommcfarlin.com\/registration-info\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pourquoi ne pas rejoindre le site ?<\/a><\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Une d\u00e9finition d&rsquo;une interface de programmation est qu&rsquo;il s&rsquo;agit d&rsquo;un contrat. Je pense que cela laisse beaucoup \u00e0 d\u00e9sirer lors de la compr\u00e9hension des interfaces.<\/p>\n","protected":false},"author":1,"featured_media":164880,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,841],"tags":[1167],"class_list":["post-230084","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-tutoriels","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230084","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=230084"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230084\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/164880"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230084"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230084"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230084"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}