{"id":64,"date":"2021-05-29T13:53:24","date_gmt":"2021-05-29T13:53:24","guid":{"rendered":"https:\/\/www.louismarchand.me\/?page_id=64"},"modified":"2022-02-21T14:50:43","modified_gmt":"2022-02-21T14:50:43","slug":"masquage-de-linformation","status":"publish","type":"page","link":"https:\/\/www.louismarchand.me\/index.php\/masquage-de-linformation\/","title":{"rendered":"Masquage de l&rsquo;information"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>Un des \u00e9l\u00e9ments fondamentaux de la programmation orient\u00e9e objet, est de permettre de laisser accessible au client de la classe, uniquement ce qui est n\u00e9cessaire afin d&rsquo;utiliser les fonctionnalit\u00e9s de la classe. Il est important de comprendre que les classes doivent \u00eatre robustes et que plus la classe laissa accessible de valeurs ou de fonctionnalit\u00e9s au client, plus elle sera \u00e0 risque de perdre cette robustesse.<\/p>\n<p>Inversement, une classe qui ne laisse rien accessible \u00e0 ses clients ne sert \u00e0 rien. L&rsquo;utilit\u00e9 d&rsquo;une classe r\u00e9side g\u00e9n\u00e9ralement dans les valeurs et les fonctionnalit\u00e9s que cette derni\u00e8re rend disponibles \u00e0 ses clients.<\/p>\n<p>On en d\u00e9duit donc que, comme bien des choses en informatique, il est important d&rsquo;aller chercher un \u00e9quilibre entre le nombre de valeurs et de fonctionnalit\u00e9s qui seront accessibles aux clients et la capacit\u00e9 de cette classe de rester robuste et coh\u00e9rente.<\/p>\n<p>Heureusement, certains m\u00e9canismes et standards classiques peuvent \u00eatre utilis\u00e9s afin de minimiser la difficult\u00e9 \u00e0 garder une classe robuste, tout en maximisant le nombre de valeurs et de fonctionnalit\u00e9s qu&rsquo;elle laisse accessible aux clients.<\/p>\n<h2>Port\u00e9e des attributs et des m\u00e9thodes<\/h2>\n<p>En programmation orient\u00e9e objet, les syst\u00e8mes de masquage de l&rsquo;information se font g\u00e9n\u00e9ralement sous la forme d&rsquo;une gestion de port\u00e9e des attributs et des m\u00e9thodes. Un langage orient\u00e9 objet devrait normalement permettre les types de gestion de port\u00e9e suivante:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Port\u00e9e priv\u00e9e: Accessible \u00e0 partir de l&rsquo;objet en cours seulement;<\/li>\n<li>Port\u00e9e publique: Accessible \u00e0 partir de tous les objets;<\/li>\n<li>Port\u00e9e amis: Accessible \u00e0 partir d&rsquo;un sous-ensemble bien d\u00e9fini d&rsquo;objets.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Java diverge l\u00e9g\u00e8rement de la th\u00e9orie orient\u00e9e objet sur ce point. En effet, les 3 gestions de port\u00e9e dans le langage Java se d\u00e9finissent comme suis:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Port\u00e9e priv\u00e9e: Accessible \u00e0 partir de la classe. N&rsquo;est pas accessible \u00e0 partir des enfants de la classe (nous reviendrons sur ce point lorsque nous verrons l&rsquo;h\u00e9ritage);\n<ul>\n<li>Il est \u00e0 noter que d&rsquo;un point de vue uniquement objet, ce type de port\u00e9 n&rsquo;est pas conforme au principe objet;<\/li>\n<li>En effet, d&rsquo;un point de vue strictement th\u00e9orique, un objet devrait toujours avoir acc\u00e8s aux \u00e9l\u00e9ments qui le composent.\n<ul>\n<li>En d&rsquo;autres mots, si un Chat est un Animal, Chat devrait avoir acc\u00e8s \u00e0 tout ce que Animal a acc\u00e8s.<\/li>\n<\/ul>\n<\/li>\n<li>La raison pour laquelle Java utilise ce type de gestion de port\u00e9e est pour s&rsquo;assurer de garder l&rsquo;int\u00e9grit\u00e9 et la robustesse des classes, m\u00eame dans un contexte d&rsquo;h\u00e9ritage;<\/li>\n<\/ul>\n<\/li>\n<li>Port\u00e9e prot\u00e9g\u00e9: Accessible \u00e0 partir de l&rsquo;objet en cours ainsi qu&rsquo;\u00e0 partir de n&rsquo;importe quelle classe dans le \u00ab\u00a0package\u00a0\u00bb en cours;\n<ul>\n<li>Sert en m\u00eame temps de port\u00e9e priv\u00e9e (tel que vu dans la th\u00e9orie objet plus haut) que de port\u00e9e amie;<\/li>\n<\/ul>\n<\/li>\n<li>Port\u00e9e publique: Accessible \u00e0 partir de tous les objets.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Voici une classe exemple contenant un attribut priv\u00e9, une m\u00e9thode prot\u00e9g\u00e9e et une autre m\u00e9thode ainsi qu&rsquo;un constructeur publique:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Permet d'effectuer des calculs d'entiers.<\/span>\r\n<span class=\"cm\"> * <\/span>\r\n<span class=\"cm\"> * @author Louis Marchand<\/span>\r\n<span class=\"cm\"> * @version %I%, %G%<\/span>\r\n<span class=\"cm\"> * <\/span>\r\n<span class=\"cm\"> * Distribu\u00e9 sous licence MIT.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Calcul<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Initialisation de la classe calcul.<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @param aNombres La liste de nombres \u00e0 traiter.<\/span>\r\n<span class=\"cm\">     * @see #nombres<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Calcul<\/span><span class=\"p\">(<\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aNombres<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">changerValeur<\/span><span class=\"p\">(<\/span><span class=\"n\">aNombres<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * La liste de nombre \u00e0 traiter dans les diff\u00e9rentes m\u00e9thodes de la classe.<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">nombres<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Calcul la somme des nombres.<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @return La somme des nombres<\/span>\r\n<span class=\"cm\">     * @see #nombres<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">somme<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"kt\">int<\/span> <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"n\">Integer<\/span> <span class=\"n\">element<\/span><span class=\"p\">:<\/span> <span class=\"n\">nombres<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lResultat<\/span> <span class=\"o\">+<\/span> <span class=\"n\">element<\/span><span class=\"p\">.<\/span><span class=\"na\">intValue<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"p\">}<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">lResultat<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    \r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Change le contenu de la liste de nombres<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @param aNombres Les valeurs de la nouvelle liste de nombres.<\/span>\r\n<span class=\"cm\">     * @see #nombres<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">protected<\/span> <span class=\"nf\">changerValeur<\/span><span class=\"p\">(<\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aNombres<\/span><span class=\"p\">){<\/span>\r\n        <span class=\"n\">nombres<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"n\">aNombres<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Ce qu&rsquo;il faut comprendre ici, c&rsquo;est que seulement l&rsquo;objet en cours peut avoir acc\u00e8s \u00e0 l&rsquo;attribut \u00ab\u00a0nombres\u00a0\u00bb et seulement \u00e0 partir des m\u00e9thodes de la classe en cours. Les enfants de la classe en cours (voir h\u00e9ritage dans quelques semaines), ainsi que les classes faisant partie du m\u00eame \u00ab\u00a0package\u00a0\u00bb peuvent modifier les valeurs contenues dans cet attribut \u00ab\u00a0nombre\u00a0\u00bb. Finalement, toutes les classes peuvent utiliser le constructeur ainsi que la m\u00e9thode \u00ab\u00a0somme\u00a0\u00bb de cette classe.<\/p>\n<h2>Protection des donn\u00e9es<\/h2>\n<p>Afin de garder une coh\u00e9rence et une rigueur au niveau des informations contenues dans la classe, il est une bonne pratique d&rsquo;\u00e9viter de laisser acc\u00e8s \u00e0 ces informations par les clients de la classe. En d&rsquo;autres mots, les attributs des classes doivent \u00eatre mis \u00ab\u00a0private\u00a0\u00bb.<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Personne<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">prenom<\/span><span class=\"p\">;<\/span>\r\n\r\n    ...\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<h2>Les \u00ab\u00a0getters\u00a0\u00bb<\/h2>\n<p>Il va de soi que si l&rsquo;attribut est \u00ab\u00a0private\u00a0\u00bb, le client de la classe ne peut pas y acc\u00e9der. Afin de permettre tout de m\u00eame au client d&rsquo;acc\u00e9der aux attributs de la classe, nous utilisons des \u00ab\u00a0getters\u00a0\u00bb.<\/p>\n<p>Un \u00ab\u00a0getter\u00a0\u00bb est une m\u00e9thode qui permet d&rsquo;acc\u00e9der aux informations de la classe. Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Personne<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">prenom<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getNom<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getPrenom<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">prenom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    ...\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>On voit ici que le client de la classe peut maintenant avoir acc\u00e8s aux attributs \u00ab\u00a0nom\u00a0\u00bb et \u00ab\u00a0prenom\u00a0\u00bb.<\/p>\n<p>Il est \u00e0 noter qu&rsquo;un \u00ab\u00a0getter\u00a0\u00bb peut servir \u00e0 obtenir d&rsquo;autres informations que seulement la valeur des attributs de la classe. Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Personne<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">prenom<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getNom<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getPrenom<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">prenom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getNomComplet<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">prenom<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    ...\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>On voit que la m\u00e9thode \u00ab\u00a0getNomComplet\u00a0\u00bb est un \u00ab\u00a0getter\u00a0\u00bb puisqu&rsquo;elle permet d&rsquo;avoir acc\u00e8s \u00e0 de l&rsquo;information de la classe, mais cette m\u00e9thode ne retourne pas directement un attribut. Il s&rsquo;agit tout de m\u00eame un \u00ab\u00a0getter\u00a0\u00bb puisque le client de la classe ne peut pas faire la diff\u00e9rence.<\/p>\n<h2>Les \u00ab\u00a0setters\u00a0\u00bb<\/h2>\n<p>De la m\u00eame mani\u00e8re, puisque l&rsquo;attribut n&rsquo;est pas accessible directement par le client de la classe, ce dernier ne peut pas assigner une nouvelle valeur \u00e0 cet attribut. Donc, pour permettre aux clients de la classe de modifier les informations, il est n\u00e9cessaire de cr\u00e9er des \u00ab\u00a0setters\u00a0\u00bb.<\/p>\n<p>Un \u00ab\u00a0setter\u00a0\u00bb est une m\u00e9thode de la classe qui permet de modifier ou d&rsquo;assigner une (ou plusieurs) information dans la classe. Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Personne<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getNom<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setNom<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">nom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">prenom<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getPrenom<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">prenom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setPrenom<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aPrenom<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">prenom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aPrenom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getNomComplet<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">prenom<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    ...\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>On voit ici que le client, en plus de pouvoir acc\u00e9der \u00e0 la valeur des attributs \u00ab\u00a0nom\u00a0\u00bb et \u00ab\u00a0prenom\u00a0\u00bb, il peut \u00e9galement assigner de nouvelles valeurs \u00e0 ces attributs.<\/p>\n<p>Un des avantages majeurs d&rsquo;utiliser des \u00ab\u00a0setters\u00a0\u00bb est de pouvoir valider les valeurs envoy\u00e9es de la part du client. Par exemple, si je veux m&rsquo;assurer que le client ne met jamais de valeur NULL dans les attributs \u00ab\u00a0nom\u00a0\u00bb et \u00ab\u00a0prenom\u00a0\u00bb, je peux utiliser le code suivant:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Personne<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getNom<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setNom<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"n\">IllegalArgumentException<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">aNom<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">){<\/span>\r\n            <span class=\"n\">nom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">IllegalArgumentException<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Le nom ne peut pas \u00eatre null\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">prenom<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getPrenom<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">prenom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setPrenom<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aPrenom<\/span><span class=\"p\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"n\">IllegalArgumentException<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">aPrenom<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">){<\/span>\r\n            <span class=\"n\">prenom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aPrenom<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">IllegalArgumentException<\/span><span class=\"p\">(<\/span>\r\n                    <span class=\"s\">\"Le prenom ne peut pas \u00eatre null\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getNomComplet<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">prenom<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    ...\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Prendre en note qu&rsquo;il est possible d&rsquo;appeler les \u00ab\u00a0setters\u00a0\u00bb dans un constructeur de classe. Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Personne<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getNom<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setNom<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"n\">IllegalArgumentException<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">aNom<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">){<\/span>\r\n            <span class=\"n\">nom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">IllegalArgumentException<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Le nom ne peut pas \u00eatre null\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">prenom<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getPrenom<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">prenom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setPrenom<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aPrenom<\/span><span class=\"p\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"n\">IllegalArgumentException<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">aPrenom<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">){<\/span>\r\n            <span class=\"n\">prenom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aPrenom<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">IllegalArgumentException<\/span><span class=\"p\">(<\/span>\r\n                    <span class=\"s\">\"Le prenom ne peut pas \u00eatre null\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getNomComplet<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">prenom<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Personne<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">,<\/span> <span class=\"n\">String<\/span> <span class=\"n\">aPrenom<\/span><span class=\"p\">)<\/span>\r\n            <span class=\"kd\">throws<\/span> <span class=\"n\">IllegalArgumentException<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">setNom<\/span><span class=\"p\">(<\/span><span class=\"n\">aNom<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">setPrenom<\/span><span class=\"p\">(<\/span><span class=\"n\">aPrenom<\/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>Il est \u00e9galement \u00e0 noter qu&rsquo;il est possible de faire des \u00ab\u00a0setter\u00a0\u00bb afin de placer une valeur dans la classe qui n&rsquo;est pas plac\u00e9e dans un attribut. Voici un exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Personne<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getNom<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setNom<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"n\">IllegalArgumentException<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">aNom<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">){<\/span>\r\n            <span class=\"n\">nom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">IllegalArgumentException<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Le nom ne peut pas \u00eatre null\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">prenom<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getPrenom<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">prenom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setPrenom<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aPrenom<\/span><span class=\"p\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"n\">IllegalArgumentException<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">aPrenom<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">){<\/span>\r\n            <span class=\"n\">prenom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aPrenom<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">IllegalArgumentException<\/span><span class=\"p\">(<\/span>\r\n                    <span class=\"s\">\"Le prenom ne peut pas \u00eatre null\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getNomComplet<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">prenom<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setNomComplet<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">,<\/span> <span class=\"n\">String<\/span> <span class=\"n\">aPrenom<\/span><span class=\"p\">)<\/span>\r\n            <span class=\"kd\">throws<\/span> <span class=\"n\">IllegalArgumentException<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">setNom<\/span><span class=\"p\">(<\/span><span class=\"n\">aNom<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">setPrenom<\/span><span class=\"p\">(<\/span><span class=\"n\">aPrenom<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Personne<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">,<\/span> <span class=\"n\">String<\/span> <span class=\"n\">aPrenom<\/span><span class=\"p\">)<\/span>\r\n            <span class=\"kd\">throws<\/span> <span class=\"n\">IllegalArgumentException<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">setNomComplet<\/span><span class=\"p\">(<\/span><span class=\"n\">aNom<\/span><span class=\"p\">,<\/span> <span class=\"n\">aPrenom<\/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>Dans cet exemple, on voit le \u00ab\u00a0setter\u00a0\u00bb nomm\u00e9 \u00ab\u00a0setNomComplet\u00a0\u00bb qui prend deux valeurs (le nom et le pr\u00e9nom) et qui les assigne correctement dans la classe. C&rsquo;est un exemple, mais il est important de comprendre qu&rsquo;il est possible d&rsquo;avoir d&rsquo;autres types de \u00ab\u00a0getter\u00a0\u00bb et de \u00ab\u00a0setter\u00a0\u00bb que seulement pour les repr\u00e9senter les attributs.<\/p>\n<p><a href=\"https:\/\/www.louismarchand.me\/index.php\/programmation-orientee-objet-1\/\">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>Introduction Un des \u00e9l\u00e9ments fondamentaux de la programmation orient\u00e9e objet, est de permettre de laisser accessible au client de la classe, uniquement ce qui est n\u00e9cessaire afin d&rsquo;utiliser les fonctionnalit\u00e9s de la classe. Il est important de comprendre que les classes doivent \u00eatre robustes et que plus la classe laissa accessible de valeurs ou de&hellip; <a class=\"more-link\" href=\"https:\/\/www.louismarchand.me\/index.php\/masquage-de-linformation\/\">Continue reading <span class=\"screen-reader-text\">Masquage de l&rsquo;information<\/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-64","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/64","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=64"}],"version-history":[{"count":2,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/64\/revisions"}],"predecessor-version":[{"id":599,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/64\/revisions\/599"}],"wp:attachment":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/media?parent=64"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}