{"id":291,"date":"2013-04-18T16:53:57","date_gmt":"2013-04-18T14:53:57","guid":{"rendered":"http:\/\/www.lafabriquedecode.com\/blog\/?p=291"},"modified":"2013-04-18T17:37:01","modified_gmt":"2013-04-18T15:37:01","slug":"php-la-loi-de-demeter-en-quelques-exemples","status":"publish","type":"post","link":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-la-loi-de-demeter-en-quelques-exemples\/","title":{"rendered":"PHP : La loi de D\u00e9m\u00e9ter en quelques exemples"},"content":{"rendered":"<p>La loi de D\u00e9m\u00e9ter (LoD en anglais, pour<em> Law of Demeter<\/em>) est un principe de design de syst\u00e8mes dits \u00ab\u00a0orient\u00e9s objet\u00a0\u00bb. Son principe \u00e9l\u00e9mentaire tient en une phrase :<\/p>\n<blockquote><p>\u00ab\u00a0Ne parle qu&rsquo;\u00e0 tes amis\u00a0\u00bb<\/p><\/blockquote>\n<p>Ce principe de conception orient\u00e9e objet \u00e0 \u00e9t\u00e9 \u00e9voqu\u00e9 pour la premi\u00e8re fois en 1987 \u00e0 la Northeastern University de Boston (Massachussets) par Ian Holland qui travaillait alors sur un projet du nom de <a href=\"http:\/\/www.ccs.neu.edu\/home\/lieber\/team-members.html\" target=\"_blank\">Demeter<\/a>. Le but de cette \u00ab\u00a0loi\u00a0\u00bb est de maintenir un couplage la\u0109he entre les classes.<\/p>\n<h1>Ce que permet LoD<\/h1>\n<p>LoD nous donne pour principe la chose suivante :<\/p>\n<blockquote><p>Une m\u00e9thode dans un objet donn\u00e9 doit seulement invoquer les m\u00e9thodes des types d&rsquo;objets suivants : l&rsquo;objet lui-m\u00eame, ses objets param\u00e8tres, les objets qu&rsquo;il cr\u00e9e, les objets qu&rsquo;il a en composition<\/p><\/blockquote>\n<h2>L&rsquo;objet lui-m\u00eame<\/h2>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n\r\nclass A {\r\n    public function __construct() {\r\n        $this-&gt;_faireUnTruc();\r\n    }\r\n\r\n    protected function _faireUnTruc() {}\r\n}\r\n\r\n<\/pre>\n<p>L&rsquo;objet instance de A sera autoris\u00e9 \u00e0 appeler ses propres fonctions (tout de m\u00eame&#8230;)<\/p>\n<h2>Ses param\u00e8tres<\/h2>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n\r\nclass B {\r\n    public function faireQuelqueChose() {}\r\n}\r\n\r\nclass A {\r\n    public function __construct(B $b) {\r\n        $b-&gt;faireQuelqueChose();\r\n    }\r\n\r\n    protected function _faireUnTruc() {}\r\n}\r\n<\/pre>\n<h2>N&rsquo;importe quel objet cr\u00e9\u00e9 dans la classe<\/h2>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\nclass C {\r\n    public function faireDesMiracles() {}\r\n}\r\n\r\nclass A {\r\n    public function __construct() {\r\n        \t\t$c = new C;\r\n        \t\t$c-&gt;faireDesMiracles();\r\n    }\r\n}\r\n<\/pre>\n<h2>Les objets en composition<\/h2>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\nclass D {\r\n    public function faireAutreChose() {}\r\n}\r\n\r\nclass A {\r\n    private $_d;\r\n\r\n    public function __construct() {\r\n        $c = new D;\r\n    }\r\n\r\n    public function faireDesChoses() {\r\n        $this-&gt;_d-&gt;faireAutreChose();\r\n    }\r\n}\r\n<\/pre>\n<h1>Ce qui remet en cause LoD<\/h1>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\nclass C {\r\n    public function faireBeaucoupDeChoses() {}\r\n}\r\n\r\nclass B {\r\n    private $_c;\r\n\r\n    public function __construct(C $c) {\r\n        $this-&gt;_c = $c;\r\n    }\r\n\r\n    public function getC() {\r\n        return $this-&gt;_c;\r\n    }\r\n}\r\n\r\nclass A {\r\n    private $_d;\r\n\r\n    public function __construct() {\r\n        $c = new C;\r\n        $b = new B($c);\r\n        $b-&gt;getC()-&gt;faireBeaucoupDeChoses();\r\n    }\r\n}\r\n<\/pre>\n<p>Dans cet exemple, ce n&rsquo;est pas le cha\u00eenage des m\u00e9thodes en lui-m\u00eame qui pose un probl\u00e8me mais le fait que A fasse appel \u00e0 C \u00e0 travers B. Id\u00e9alement, A fait appel \u00e0 B qui lui, d\u00e9l\u00e8gue le service demand\u00e9 \u00e0 C de sorte que nous n&rsquo;aurions plus que :<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">$b-&gt;faireBeaucoupDeChoses();<\/pre>\n<p>et<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n\r\nclass B {\r\n    private $_c;\r\n\r\n    public function __construct(C $c) {\r\n        $this-&gt;_c = $c;\r\n    }\r\n\r\n    public function faireBeaucoupDeChoses() {\r\n        return $this-&gt;_c-&gt;faireBeaucoupDeChoses();\r\n    }\r\n}\r\n\r\n<\/pre>\n<p>Ici, chaque classe parle \u00e0 ses amis les plus proches (A \u00e0 B, B \u00e0 C) et D\u00e9m\u00e9ter n&rsquo;en sera pas offusqu\u00e9e !<\/p>\n<h1>Pour en savoir plus&#8230;<\/h1>\n<p>Un billet du blog d&rsquo;<a href=\"http:\/\/devblog.avdi.org\/2011\/07\/05\/demeter-its-not-just-a-good-idea-its-the-law\/\" target=\"_blank\">Avdi Grimm<\/a>\u00a0(anglais)<\/p>\n<p>La page du projet <a href=\"http:\/\/www.ccs.neu.edu\/home\/lieber\/LoD.html\" target=\"_blank\">Demeter<\/a>\u00a0(anglais)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La loi de D\u00e9m\u00e9ter (LoD en anglais, pour Law of Demeter) est un principe de design de syst\u00e8mes dits \u00ab\u00a0orient\u00e9s objet\u00a0\u00bb. Son principe \u00e9l\u00e9mentaire tient en une phrase : \u00ab\u00a0Ne parle qu&rsquo;\u00e0 tes amis\u00a0\u00bb Ce principe de conception orient\u00e9e objet \u00e0 \u00e9t\u00e9 \u00e9voqu\u00e9 pour la premi\u00e8re fois en 1987 \u00e0 la Northeastern University de Boston [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[14],"tags":[30,31,13],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.6.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PHP : La loi de D\u00e9m\u00e9ter en quelques exemples - La Fabrique de code - Tech blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-la-loi-de-demeter-en-quelques-exemples\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PHP : La loi de D\u00e9m\u00e9ter en quelques exemples - La Fabrique de code - Tech blog\" \/>\n<meta property=\"og:description\" content=\"La loi de D\u00e9m\u00e9ter (LoD en anglais, pour Law of Demeter) est un principe de design de syst\u00e8mes dits \u00ab\u00a0orient\u00e9s objet\u00a0\u00bb. Son principe \u00e9l\u00e9mentaire tient en une phrase : \u00ab\u00a0Ne parle qu&rsquo;\u00e0 tes amis\u00a0\u00bb Ce principe de conception orient\u00e9e objet \u00e0 \u00e9t\u00e9 \u00e9voqu\u00e9 pour la premi\u00e8re fois en 1987 \u00e0 la Northeastern University de Boston [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-la-loi-de-demeter-en-quelques-exemples\/\" \/>\n<meta property=\"og:site_name\" content=\"La Fabrique de code - Tech blog\" \/>\n<meta property=\"article:published_time\" content=\"2013-04-18T14:53:57+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-04-18T15:37:01+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:creator\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:site\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-la-loi-de-demeter-en-quelques-exemples\/\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-la-loi-de-demeter-en-quelques-exemples\/\",\"name\":\"PHP : La loi de D\u00e9m\u00e9ter en quelques exemples - La Fabrique de code - Tech blog\",\"isPartOf\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\"},\"datePublished\":\"2013-04-18T14:53:57+00:00\",\"dateModified\":\"2013-04-18T15:37:01+00:00\",\"author\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\"},\"breadcrumb\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-la-loi-de-demeter-en-quelques-exemples\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-la-loi-de-demeter-en-quelques-exemples\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-la-loi-de-demeter-en-quelques-exemples\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"http:\/\/www.lafabriquedecode.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP : La loi de D\u00e9m\u00e9ter en quelques exemples\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/\",\"name\":\"La Fabrique de code - Tech blog\",\"description\":\"PHP objet, MySQL, Design Patterns, OOP...et plus !\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"caption\":\"admin\"},\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"PHP : La loi de D\u00e9m\u00e9ter en quelques exemples - La Fabrique de code - Tech blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-la-loi-de-demeter-en-quelques-exemples\/","og_locale":"fr_FR","og_type":"article","og_title":"PHP : La loi de D\u00e9m\u00e9ter en quelques exemples - La Fabrique de code - Tech blog","og_description":"La loi de D\u00e9m\u00e9ter (LoD en anglais, pour Law of Demeter) est un principe de design de syst\u00e8mes dits \u00ab\u00a0orient\u00e9s objet\u00a0\u00bb. Son principe \u00e9l\u00e9mentaire tient en une phrase : \u00ab\u00a0Ne parle qu&rsquo;\u00e0 tes amis\u00a0\u00bb Ce principe de conception orient\u00e9e objet \u00e0 \u00e9t\u00e9 \u00e9voqu\u00e9 pour la premi\u00e8re fois en 1987 \u00e0 la Northeastern University de Boston [&hellip;]","og_url":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-la-loi-de-demeter-en-quelques-exemples\/","og_site_name":"La Fabrique de code - Tech blog","article_published_time":"2013-04-18T14:53:57+00:00","article_modified_time":"2013-04-18T15:37:01+00:00","author":"admin","twitter_card":"summary","twitter_creator":"@LaFabrique2Code","twitter_site":"@LaFabrique2Code","twitter_misc":{"\u00c9crit par":"admin","Dur\u00e9e de lecture estim\u00e9e":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-la-loi-de-demeter-en-quelques-exemples\/","url":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-la-loi-de-demeter-en-quelques-exemples\/","name":"PHP : La loi de D\u00e9m\u00e9ter en quelques exemples - La Fabrique de code - Tech blog","isPartOf":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website"},"datePublished":"2013-04-18T14:53:57+00:00","dateModified":"2013-04-18T15:37:01+00:00","author":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162"},"breadcrumb":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-la-loi-de-demeter-en-quelques-exemples\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-la-loi-de-demeter-en-quelques-exemples\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/php-la-loi-de-demeter-en-quelques-exemples\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"http:\/\/www.lafabriquedecode.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PHP : La loi de D\u00e9m\u00e9ter en quelques exemples"}]},{"@type":"WebSite","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website","url":"http:\/\/www.lafabriquedecode.com\/blog\/","name":"La Fabrique de code - Tech blog","description":"PHP objet, MySQL, Design Patterns, OOP...et plus !","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162","name":"admin","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/","url":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","contentUrl":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","caption":"admin"},"url":"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/"}]}},"_links":{"self":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/291"}],"collection":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/comments?post=291"}],"version-history":[{"count":22,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/291\/revisions"}],"predecessor-version":[{"id":313,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/291\/revisions\/313"}],"wp:attachment":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/media?parent=291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/categories?post=291"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/tags?post=291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}