Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/02/2013, à 08:40

Morgiver

[POO]Question de point de vue - L'encapsulation

Salut smile

Je me suis mi en tête de réviser mes bases de la POO, donc j'me retape pas mal de truc.

En relisant les différents cours sur la POO et le principe d'encapsulation, je me suis fait une image en tête et j'aimerais savoir si vous la trouvez juste.

Prenons pour objet une voiture :

Un moteur de voiture est fortement fermé, avec des boulons et des visses. A moins de démonter le moteur, personne n'a d'accès direct aux pistons, ni aux roulements et très certainement plein d'autres pièces que je ne connais pas du tout tongue
Avec ça, j'illustre le mot clé Private.

Certaines pièces sont parfois directement accessible, comme les bougies, démontables et remplaçables directement en les dévissant.
On peut également avoir un accès via la tige, au niveau d'huile du moteur.
Ces deux exemples ne concerne QUE le moteur et ne sont accessible QUE à partir du moteur.
Avec ces exemples, j'illustre le mot clé Protected

Certaines autres choses sont accessible directement et ne nécessite pas de contrôle, ou très peu, par exemple le réservoir d'essence, beaucoup de camionneurs se font voler leur essences sur les autoroutes (les automobiliste aussi d'ailleurs). Le réservoir est accessible assez facilement. Tout comme le réservoir d'eau sous le capot. On peu y ajouter ou enlever de l'essence/de l'eau, à souhait (contrairement à l'huile ou il faut d'office faire une vidange par exemple).
Avec ces deux exemples, j'illustre le mot clé Public

Que pensez-vous de ces trois images ? Sont-elles justes ? Vont-elles suffisamment loin ? Ou sont-elles trop compliquées ? Ou totalement fausses ? tongue

Voilà, hésitez donc pas à dire ce que vous en pensez wink

Morgiver

EDIT : N'hésitez pas à donner l'image qui vous permet de vous illustrer ce genre de principe smile

Dernière modification par Morgiver (Le 19/02/2013, à 08:44)

Hors ligne

#2 Le 19/02/2013, à 09:16

tiramiseb

Re : [POO]Question de point de vue - L'encapsulation

Moi j'aime pas le principe des trucs privés, protégés et publics.

Quand tu programmes un logiciel, tu te fais confiance à toi-même ou tu fais confiance à l'équipe de développement. Quel est l'intérêt d'interdire un accès à quelque chose dans ce cadre ?

Et dans le cas d'une bibliothèque, si elle est bien documentée et qu'elle dit qu'il faut utiliser uniquement les méthodes X et Y, bah si quelqu'un va utiliser la méthode Z et qu'un jour celle-ci change, tant pis pour lui.

C'est tellement plus simple...


Sinon, pour faire un autre parallèle :
- ton visage est Public
- ta bite est Protected
- ton foie est Private
... amis de la poésie, bonjour ! smile

Hors ligne

#3 Le 19/02/2013, à 09:34

Morgiver

Re : [POO]Question de point de vue - L'encapsulation

tiramiseb a écrit :

Sinon, pour faire un autre parallèle :
- ton visage est Public
- ta bite est Protected
- ton foie est Private
... amis de la poésie, bonjour ! smile

J'ai ri lol lol

Le principe d'encapsulation c'est pas plutôt une question d'accès aux données non pas aux programmeurs mais à l'utilisateur ?
J'entends par là que le fait de laisser libre accès aux variables pourrait permettre, via un formulaire par exemple, de modifier ces données et donc d'influencer le bon déroulement du programme.

Il n'y a qu'a voir comment on peut modifier à sa guise une requête SQL rien qu'avec une injection si le formulaire et la requête ne sont pas protégé.
On pourrait partir du même principe en injectant du code directement pour modifier les objets, non ?

Hors ligne

#4 Le 19/02/2013, à 09:43

tiramiseb

Re : [POO]Question de point de vue - L'encapsulation

Si un simple formulaire permet à l'utilisateur de ton programme d'accéder à des méthodes qui ne sont normalement pas pointées, laisse-moi douter de tes capacités de programmeur smile
Toute entrée utilisateur doit être vérifiée, filtrée, sécurisée.

L'injection SQL est possible car il y a de mauvais programmeurs qui prennent directement les entrées des utilisateurs pour taper dans la base SQL, sans vérifier si ce qu'a tapé l'utilisateur est correct. Mais les bonnes bibliothèques et les bons frameworks web protègent tout ça et empêchent ce genre d'approches.

Pour un programme de type "client lourd" c'est encore plus vrai : tu prends une entrée utilisateur, tu la stocke dans une variable... J'espère que tu n'utilises pas le *contenu* de cette variable pour identifier le nom de la méthode que tu vas appeler !

Hors ligne

#5 Le 19/02/2013, à 10:06

Morgiver

Re : [POO]Question de point de vue - L'encapsulation

En fait, je pars du principe que personne n'est infaillible et que aussi soigneux qu'on peux l'être, une personne désireuse de modifier le comportement d'un programme, arrivera toujours à trouver une faille.
Je prenais l'exemple de l'utilisation de formulaire, mais quand on voit ce que peuvent faire certaine personne, j'ose imaginer qu'il n'y a pas que les formulaire pour avoir accès aux données tongue

Hors ligne

#6 Le 19/02/2013, à 10:52

tiramiseb

Re : [POO]Question de point de vue - L'encapsulation

Je doute fort que l'encapsulation protège de cela...

Hors ligne

#7 Le 22/02/2013, à 15:53

compte supprimé

Re : [POO]Question de point de vue - L'encapsulation

Laissez-moi apporter mon petit point de vue minable de débutant cool

Déjà, faudrait s'accorder sur ce qu'on appelle l'"utilisateur" : le programmeur qui utilisera la classe ou l'utilisateur du programme ?

Si on parle de l'utilisateur final, je vois pas vraiment le rapport avec les données Private/Public : comme l'a si bien dit tiramiseb,

tiramiseb a écrit :

Toute entrée utilisateur doit être vérifiée, filtrée, sécurisée.

Les variables du programme n'ont donc (ou du moins ne doivent avoir) aucun rapport avec les entrées de l'utilisateur. Un programme où l'utilisateur a directement accès aux variables est généralement un mauvais programme. Quant aux exploits, injections, buffer overflows et autres joyeusetés, je doute que les droits d'accès y changent grand-chose, ces techniques se passant à beaucoup plus bas niveau, où les notions de droits d'accès, de classes ou même de variables n'existent pas : on accède à un emplacement mémoire, on y écrit un truc, et c'est tout.

Le système des droits d'accès est juste censé favoriser (voire imposer) un style de programmation particulier où toutes les interactions entre objets sont contrôlées et ne dépassent pas du cadre prévu par leur concepteur, ceci devant améliorer la qualité des programmes en évitant bon nombre de bugs dus à une mauvaise utilisation d'une classe ou d'une méthode par un programmeur. D'ailleurs, l'état Protected va un peu à l'encontre des règles de base de la POO, puisqu'il suffit de dériver une classe pour accéder à des membres censés être privés. Mais comme dit plus haut, c'est seulement un problème de confiance entre programmeurs, et chacun en fait l'usage qu'il veut.


Quant à ta voiture, même s'il y a du juste, je ne suis pas d'accord avec quelques trucs :
Private : Les pièces que tu cites sont en effet uniquement accessibles au concepteur de la voiture (ici le fabricant, auquel on peut ajouter le garagiste), l'accès Private est donc justifié. Mais j'y placerai aussi toutes les autres pièces faisant partie du fonctionnement interne du véhicule et non nécessaires à son utilisation (plutôt à sa maintenance), donc théoriquement toutes celles que tu as placées en Protected.

Protected : En fait, cet état un peu "hybride" n'est pas vraiment adapté à ton parallèle avec un véhicule, la dérivation de véhicule n'existant pas encore. D'ailleurs, comme je l'ai écrit plus haut, il ne fait pas vraiment partie de la POO "pure", où seul le concepteur d'un élément doit avoir accès à ses éléments privés. En programmation, je te conseillerai, comme je le fais moi-même, de l'éviter autant que possible à partir du moment où tu veux écrire un code objet potable, sauf si tu sais ce que tu fais. Perso, je ne l'utilise que très rarement, quand avoir accès à des éléments simples et essentiels d'une classe directement à partir d'une classe dérivée peut réduire la lourdeur du code et/ou améliorer les performances, sans rendre le tout bancal.

Enfin, je placerai en Public tout ce qui est directement accessible au conducteur, et qui lui sert uniquement à utiliser le véhicule (ainsi qu'à une maintenance de base, qu'il doit pouvoir faire régulièrement, ici l'entrée du réservoir d'essence) : volant, pédales, commandes de la radio, des essuie-glaces, des feux, des vitres, etc. Tout ceci est actionné quotidiennement par l'utilisateur et lui permet d'utiliser son véhicule.


Je dirais que tu te fais une idée fausse des buts de la POO : il ne s'agit pas de sécurité, la sécurité relève du programmeur. Un programmeur mauvais produira toujours un code avec une mauvaise sécurité, qu'il code des classes, des procédures ou de l'assembleur. Les variables ne doivent de toute façon pas être accessibles directement à l'utilisateur final. Il s'agit plutôt d'un style de programmation original permettant d'améliorer la qualité, la lisibilité, la maintenabilité du code, en exprimant les instructions sous forme d'interactions entre différents éléments, et ce n'est pas un modèle applicable partout : pour certains programmes, il est beaucoup plus logique et cohérent d'utiliser uniquement des fonctions. Les droits d'accès te permettent seulement de mieux contrôler l'utilisation qui sera faire de tes classes, à toi et à ton bon sens d'en faire bon usage.

#8 Le 22/02/2013, à 17:08

Epehj

Re : [POO]Question de point de vue - L'encapsulation

Salut,

Je me greffe juste pour une question :

Sga64 a écrit :

l'état Protected va un peu à l'encontre des règles de base de la POO, puisqu'il suffit de dériver une classe pour accéder à des membres censés être privés

Je ne comprends pas trop, aurais tu un exemple ?


Linux user #447629 - Ubuntu user # 21770
C'est en sciant que Léonard devint scie

Hors ligne

#9 Le 22/02/2013, à 17:48

compte supprimé

Re : [POO]Question de point de vue - L'encapsulation

Epehj a écrit :

Salut,

Je me greffe juste pour une question :

Sga64 a écrit :

l'état Protected va un peu à l'encontre des règles de base de la POO, puisqu'il suffit de dériver une classe pour accéder à des membres censés être privés

Je ne comprends pas trop, aurais tu un exemple ?

Le principe de l'encapsulation (qui fait partie de la POO) est d'interdire à l'utilisateur d'une classe l'accès direct à ses membres privés, et de ne les modifier que par l'intermédiaire de fonctions publiques qui pourront faire les vérifications/préparations/postconditions nécessaires (valeur correcte, actualisation d'autres parties du programme, etc.). Si lesdits membres privés sont en fait protégés, l'utilisateur de la classe n'a qu'à créer une classe dérivée de celle-ci pour accéder à ces membres privés et en faire ce qu'il veut. Il peut alors en faire potentiellement n'importe quoi, en sortant du cadre prévu par le concepteur de la classe de base. Ça va à l'encontre du principe d'encapsulation et ça n'a pour moi d'intérêt que dans certains cas particuliers, en supposant qu'on veuille faire de la POO "classique" (rien n'empêche d'utiliser les classes autrement).

Alors oui, ce problème ne concerne que le guss qui s'est amusé à outrepasser les règles du concepteur, et ça sera de sa faute s'il se viande, mais c'est simplement pas respectueux des règles de l'encapsulation ; et pourquoi permettre une action qui semble stupide ? Si le concepteur d'une classe a considéré qu'un certain usage de sa classe était idiot, pourquoi l'autoriser ? Au pire, si on préfère une approche plus "libre", un langage comme Python (que je recommande d'ailleurs) serait peut-être plus adapté.

Mais encore une fois, chacun est libre de faire ce qu'il veut des outils d'un langage, on ne va pas décider à sa place de la meilleure méthode de programmation. Comme dit dans mon premier post, il m'arrive d'utiliser cet état Protected dans mes classes, quand ça peut m'éviter d'ajouter une lourdeur au code. Exemple : j'ai une classe qui représente une grille de Tic-Tac-Toe (en mode texte), où les variables qui représentent le contenu de la grille sont Protected, ce qui m'évitera, si je veux en dériver une version graphique, d'ajouter des getters et setters partout. Ça peut aussi être parfois intéressant d'un point de vue performances.

#10 Le 22/02/2013, à 18:32

Morgiver

Re : [POO]Question de point de vue - L'encapsulation

@Sga64:

Je te remercie grandement pour tes intervention, surtout sur ma manière de voir la POO, personne jusqu'à ce que je lise ce post n'avait analysé ma façon de faire ou voir la POO.
Quand on me parle de contrôle d'accès à des attributs ou des méthodes j'ai toujours eu tendance à y relier la sécurité contre un utilisateur mal intentionné (donc pas un programmeur mais un type qui veut modifier le comportement du programme). D'ailleurs je comprend bien mieux pourquoi j'ai eu quelques mal de crâne en essayant de comprendre, j'crois que chaque fois que je potassais la programmation j'ai du imaginer des trucs ou mal comprendre certaine tournure de concept, ça c'est sûrement dû au fait que j'ai toujours appris tout seul.

Lol, en fait j'en rigole un peu là... J'me sens un peu con tongue

Merci encore, j'crois que ça va m'aider pour la suite smile

Hors ligne

#11 Le 22/02/2013, à 18:46

compte supprimé

Re : [POO]Question de point de vue - L'encapsulation

T'inquiète pas, j'ai aussi un peu galéré au début, le temps de comprendre à quoi ça servait... Ça dépend aussi grandement de la qualité du cours. Par curiosité, tu as appris comment ?

EDIT : Ravi d'avoir pu t'aider dans ton apprentissage wink

Dernière modification par Sga64 (Le 22/02/2013, à 18:47)

#12 Le 22/02/2013, à 19:13

Morgiver

Re : [POO]Question de point de vue - L'encapsulation

Ben j'ai toujours potasser tout seul, avec que des sources (tuto, article, etc.) du net et deux ou trois bouquins.

C'est souvent assez compliqué de savoir si je suis sur la bonne voie, si j'ai bien compris. J'essaye souvent de partager du code et de partager mon point de vue sur différents concept. Ça me permet de me prendre quelques claques et de me remettre en question, faire gaffe à pas m'enfoncer dans l'état d'esprit du gars trop sur de lui qui connaît tout.

Mais le truc le plus compliqué c'est de savoir si j'ai vraiment compris. C'est compliqué de savoir faire confiance en ce que je crois avoir compris tongue
Ajoute à cela le fait que tout le monde à sa propre compréhension des choses big_smile

Hors ligne

#13 Le 22/02/2013, à 19:18

grim7reaper

Re : [POO]Question de point de vue - L'encapsulation

Salut,

Un article intéressant sur l’encapsulation.
Et s’il ne fallait retenir qu’une chose :

Emmanuel Deloget a écrit :

On encapsule un comportement, pas des propriétés.

Beaucoup de gens passent à côté de ça.

Hors ligne

#14 Le 22/02/2013, à 19:39

compte supprimé

Re : [POO]Question de point de vue - L'encapsulation

Morgiver a écrit :

Ben j'ai toujours potasser tout seul, avec que des sources (tuto, article, etc.) du net et deux ou trois bouquins.

C'est souvent assez compliqué de savoir si je suis sur la bonne voie, si j'ai bien compris. J'essaye souvent de partager du code et de partager mon point de vue sur différents concept. Ça me permet de me prendre quelques claques et de me remettre en question, faire gaffe à pas m'enfoncer dans l'état d'esprit du gars trop sur de lui qui connaît tout.

Mais le truc le plus compliqué c'est de savoir si j'ai vraiment compris. C'est compliqué de savoir faire confiance en ce que je crois avoir compris tongue
Ajoute à cela le fait que tout le monde à sa propre compréhension des choses big_smile

Je suis exactement dans le même cas. C'est pour ça que les communautés et les forums existent wink

EDIT : Mais à un moment, faut quand même savoir avoir confiance en soi. Si on relit une explication et que tout colle avec ce qu'on pense avoir compris, c'est qu'on a probablement compris et qu'on peut approfondir.

EDIT 2 : @reaper : Merci, très intéressant, je le garde en bookmark au cas où.

Dernière modification par Sga64 (Le 22/02/2013, à 19:47)

#15 Le 22/02/2013, à 21:03

:!pakman

Re : [POO]Question de point de vue - L'encapsulation

Encapsulation implique passer par des accesseurs.
Passer par des accesseurs permet de contrôler les modifications des attributs.

Une exception : protected : les classes filles peuvent modifier directement les attributs hérités, sans devoir passer par les accesseurs.


...

Hors ligne

#16 Le 22/02/2013, à 21:10

Epehj

Re : [POO]Question de point de vue - L'encapsulation

@Sga64
Ok, en fait j'avais bien compris, c'est juste la tournure de phrase qui m'a perturbé smile

@:!pakman
Pas uniquement les classes filles, aussi les classes d'un même package.


Linux user #447629 - Ubuntu user # 21770
C'est en sciant que Léonard devint scie

Hors ligne

#17 Le 22/02/2013, à 21:24

compte supprimé

Re : [POO]Question de point de vue - L'encapsulation

Epehj a écrit :

@:!pakman
Pas uniquement les classes filles, aussi les classes d'un même package.

En Java, oui. Mais j'aime pas Java, je trouve certains aspects de Java bizarres, et de toute façon je ne crois pas que l'état Protected existe en POO théorique. C'est juste une concession pour certains usages où ça pourrait être pratique.