<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>{ rawsrc::code() } &#187; conception</title>
	<atom:link href="https://blog.developpez.com/rawsrc/pcategory/conception/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/rawsrc</link>
	<description></description>
	<lastBuildDate>Fri, 07 Sep 2012 20:16:17 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Dépendances et couplage des classes en POO</title>
		<link>https://blog.developpez.com/rawsrc/p10377/conception/dependances_et_couplage_des_classes_poo</link>
		<comments>https://blog.developpez.com/rawsrc/p10377/conception/dependances_et_couplage_des_classes_poo#comments</comments>
		<pubDate>Fri, 07 Oct 2011 23:00:00 +0000</pubDate>
		<dc:creator><![CDATA[rawsrc]]></dc:creator>
				<category><![CDATA[conception]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans le cadre d’une discussion j’ai été amené à faire une digression sur les dépendances entre les classes dans la programmation orientée objet. A des fins d’éclaircissement, je vous propose donc un récapitulatif des quatre manières possibles de coupler deux classes entre-elles. Les interfaces seront abordées ultérieurement. Pour illustrer les propos, nous allons travailler sur un exemple parlant à tous : le corps humain, ses organes et ses accessoires. A noter que le code d’exemple [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Dans le cadre d’une discussion j’ai été amené à faire une digression sur les dépendances entre les classes dans la programmation orientée objet.<br />
A des fins d’éclaircissement, je vous propose donc un récapitulatif des quatre manières possibles de coupler deux classes entre-elles.<br />
Les interfaces seront abordées ultérieurement.<br />
<span id="more-1"></span><br />
Pour illustrer les propos, nous allons travailler sur un exemple parlant à tous : le corps humain, ses organes et ses accessoires.<br />
A noter que le code d’exemple sera en PHP.</p>
<p><strong>1. Aperçu rapide des couplages possibles avec la notation UML correspondante</strong></p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/recap.png" alt="Récapitulatif des méthodes de couplage des classes entre-elles" title="Couplages des classes" /><br />
La notation UML n’est qu’à titre de rappel, ce n’est pas le propos de cet article.</p>
<p><strong>2. HERITAGE OU DERIVATION</strong></p>
<p>De tous les liens possibles, c’est le plus fort. Le concept d’héritage s’insère dans une approche très pragmatique de notre environnement à savoir : la généricité et la spécialisation. L’héritage permet dans un sens la factorisation (généricité, abstraction) et dans l&rsquo;autre, la spécialisation (héritage, dérivation) des classes. De ce lien découle une contrainte très forte à laquelle il est essentiel de s’y conformer : les classes dérivées doivent obligatoirement être de même nature que leur classe mère.<br />
<strong>En clair, il doit être toujours possible de considérer que la classe dérivée est une classe mère spécialisée.</strong> </p>
<p>Pour un organisme cela donnerait par exemple ceci :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/heritage_uml.png" alt="Exemple d'héritage" title="Héritage" /><br />
En conséquence, il est tout à fait possible de dire que la classe Poumon est une instance de la classe Organe. Les classes Rein et Estomac sont également des instances de la classe Organe.</p>
<p>Et voici le code PHP correspondant :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/heritage_php.png" alt="Code PHP - Héritage" title="PHP Héritage" /></p>
<p><strong>HERITAGE FONCTIONNEL : ATTENTION DANGER</strong><br />
L&rsquo;héritage n&rsquo;est qu&rsquo;une forme de couplage parmi d&rsquo;autres, dès que la contrainte sur la nature des classes mères et dérivées n&rsquo;est plus respectée, il faut absolument changer la manière de coupler les classes entre elles. Dériver les classes n&rsquo;importe comment &#8211; sans justifier d&rsquo;un quelconque lien conceptuel &#8211; dans le but de récupérer les fonctions d&rsquo;une classe est un abus sévère du concept d&rsquo;héritage. Cette méthode s&rsquo;appelle : héritage fonctionnel et est à proscrire.</p>
<p>L&rsquo;erreur la plus courante consiste à dériver la classe d&rsquo;accès aux données afin que le concept ainsi créé puisse accéder aux fonctions d&rsquo;écriture, de lecture&#8230; de la base de données. En plus d&rsquo;être une ineptie &#8211; conceptuellement parlant &#8211;  cela dégrade grandement les performances parce que chaque instanciation de classe va probablement ouvrir une connexion avec la base de données, alors que généralement, une seule connexion suffit amplement.</p>
<p>Dans notre cas cela donnerait ceci :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/heritage_fonctionnel_uml.png" alt="Exemple d'héritage fonctionnel" title="Héritage fonctionnel" /></p>
<p>Et voici le code PHP correspondant :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/heritage_fonctionnel_php.png" alt="Code PHP - Héritage fonctionnel" title="PHP Héritage fonctionnel" /></p>
<p><strong>3. COMPOSITION</strong></p>
<p>C&rsquo;est un lien très fort entre les classes.<br />
La composition définit par principe que les classes composites ne peuvent exister en dehors de la classe composée.<br />
Le corollaire est que la destruction de la classe composée implique la destruction des classes composites.<br />
Pour faire plus clair : le corps humain ne peut exister sans ses organes et réciproquement les organes ne peuvent exister en-dehors du corps humain.<br />
Donc, la classe composée contrôle la totalité de la vie de ses composites (de leur naissance à leur mort), son constructeur doit se charger de les instancier et son destructeur de les détruire. L&rsquo;accès aux composites est limité et toujours sous contrôle de la classe composée.</p>
<p>Pour un corps humain cela donnerait par exemple ceci :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/composition_uml.png" alt="Exemple de composition" title="Composition" /></p>
<p>Et voici le code PHP correspondant :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/composition_php.png" alt="Code PHP - Composition" title="PHP Composition" /></p>
<p><strong>3. AGREGATION</strong></p>
<p>C&rsquo;est un lien fort entre les classes.<br />
L&rsquo;agrégation définit par principe que les classes agrégées ont une existance indépendante de la classe agrégat.<br />
Généralement cela se traduit au sein de la classe agrégat : par le passage au constructeur des instances des classes à agréger ou par la définition de mutateurs avec des paramètres typés.<br />
Ex : <code class="codecolorer text default"><span class="text">setPoumons(Poumon $poumon) { }</span></code><br />
Pour suivre notre exemple, il faut se placer dans un futur proche dans lequel il serait possible de remplacer ses organes à la carte.<br />
Cela impliquerait que les organes pourraient exister en dehors du corps humain qui ne ferait du coup que les agréger pour assurer son fonctionnement.</p>
<p>Pour un corps humain cela donnerait par exemple ceci :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/agregation_uml.png" alt="Exemple d'agrégation" title="Agrégation" /></p>
<p>Et voici le code PHP correspondant :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/agregation_php.png" alt="Code PHP - Agrégation" title="PHP Agrégation" /></p>
<p><strong>4. ASSOCIATION</strong></p>
<p>C&rsquo;est un lien faible entre les classes.<br />
L&rsquo;association se résume à un paramètre typé que l&rsquo;on passe à une fonction d&rsquo;une classe.<br />
La classe qui exécute la fonction se sert du paramètre mais ne garde aucune trace de ce dernier.</p>
<p>Pour un corps humain cela donnerait par exemple ceci :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/association_uml.png" alt="Exemple d'association" title="Association" /></p>
<p>Et voici le code PHP correspondant :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/couplage/img/association_php.png" alt="Code PHP - Association" title="PHP Association" /></p>
<p><strong>5. CONCLUSION</strong></p>
<p>Vous avez eu un aperçu des différents couplages possibles en programmation orientée objet. On pourrait encore en écrire beaucoup dessus.<br />
A noter que la tendance actuelle est au découplage et à l&rsquo;injection dynamique des dépendances afin de faciliter la portabilité et la maintenance des application.<br />
Enfin un dernier point, notez que dans tous les cas, l&rsquo;organisation et la décomposition de vos classes reste subjective.<br />
Outre une compréhension exacte de la problématique, c&rsquo;est un mélange de finesse et d&rsquo;expérience.<br />
Dans la plupart des cas, votre architecture sera discutable mais le plus important est de rester clair, concis et apte à justifier ses choix.<br />
Un vrai travail de concepteur.</p>
<p>Attention toutefois, si vous commencez à tout séparer et hiérarchiser dans votre vie (copine, amis, collègues&#8230;), c&rsquo;est qu&rsquo;il est temps d&rsquo;aller consulter&#8230;</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
