Précédent   Forum du club des développeurs et IT Pro > Général Développement > Langages de programmation
Langages de programmation Forum général sur les langages de programmation, sur la POO, opinions, choix, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 16/12/2012, 09h32   #1
synergy
Invité de passage
 
Homme Alain
gestionnaire d'exploitation informatique
Inscription : décembre 2012
Messages : 4
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 46
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : gestionnaire d'exploitation informatique
Secteur : Santé

Informations forums :
Inscription : décembre 2012
Messages : 4
Points : 0
Points : 0
Par défaut Implémentation système de l'encapsulation

Bonjour à tous,

quelqu'un pourrait-il m'éclaircir sur les dessous de l'encapsulation.
En java ou C#, par exemple on nous indique d'utiliser les mot-clés private, protected ou public pour instaurer un degré de "visibilité" de méthodes ou d'attributs d'un objet.
Mais que se passe-t-il alors au niveau de la compilation pour gérer cette encapsulation.?

Je me pose la question par comparaison à d'autres langages ou l'encapsulation n'est "pas gérée" car l'accès aux données que l'on aura cachées (utilisation du nommage en préfixe double underscore) reste toujours possible.

Se pourrait-il q'un accès aux données encapsulées considérées inaccessibles soit toujours possible dans les autres langages qui intègrent l'encapsulation (comme java, C#) mais que le manque d'informations nous fasse croire que c'est impossible.

Question d'un newbie qui garde une petite lanterne au plafond pour l'hiver.

Merci pour vos réponses et corrections.

Alain.
synergy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 19h54   #2
Médinoc
Expert Confirmé Sénior
 
Avatar de Médinoc
 
Homme
Développeur informatique
Inscription : septembre 2005
Messages : 22 390
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2005
Messages : 22 390
Points : 32 032
Points : 32 032
Envoyer un message via MSN à Médinoc
Déjà, je ne comprends pas ce que tu veux dire par "utilisation du nommage en préfixe double underscore".

Le principe des données private, c'est que le code ne compilera tout simplement pas si tu cherche à y faire référence par leur nom. Alors, tes recours dépendent de la plate-forme et du langage:
  • En C++ normal, tu peux faire des manipulations de pointeurs, donc tu peux accéder à n'importe quelle variable de la mémoire de ton programme du moment que tu trouves où elle est (et quand il s'agit d'un membre private d'un objet, si tu as un pointeur vers l'objet et un sizeof de sa classe, tu sais où chercher).
  • En C#, à moins d'avoir les droits UnmanagedCode, tu n'as aucune possibilité de manipulation de pointeurs: Tu ne peux accéder qu'à ce que tu peux nommer. Et même si tu essaies de tricher avec le compilo C#, ça pètera sur la traduction Just-In-Time du code managé en code natif. Le seul outil restant est la Réflexion, mais elle aussi nécessite un droit spécial (MemberAccess) pour accéder aux membres privés.
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone.
-- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Médinoc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2012, 17h00   #3
el_slapper
Expert Confirmé Sénior
 
Inscription : décembre 2007
Messages : 2 545
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 2 545
Points : 6 168
Points : 6 168
Pour reprendre ce que dit Médinoc, en dehors du périmètre de la donnée, le compilateur ne sait pas qu'elle existe. Pas de compilation, pas d’exécution. Ce qui permet paradoxalement d'utiliser le même nom de variable dans plusieurs domaines différents. Exemple(pourri) en VBA :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Option Explicit

Sub AfficheFactorielles()
    Dim i as Long
    For i = 1 To 10
        Msgbox(Factorielle(i))
    Next i
End Sub

Function Factorielle(i as Long) As Long
    If i > 1 Then 
        Factorielle = Factorielle (i - 1) *i
    Else
        Factorielle = 1
    End If
End Function
i existe indépendamment dans les deux espaces, parce que c'est dans les deux cas une variable interne, encapsulée. Le compilateur(ou l’interpréteur) sait qu'il existe une variable i dans ma procédure, et une autre dans ma fonction. Si je ne la définit pas dans la procédure(le Dim), alors le compilateur ne pourra pas s’exécuter et m'insultera(à juste titre). Si par contre je définit une variable globale i(une Public, en VBA), alors il aura la même valeur de i partout(et mon code ne marchera jamais).
__________________
Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
3)le temps de comprendre toutes les exigences, le projet est terminé
4)le temps de terminer le projet, les exigences ont changé
Et le serment de non-allégiance :
Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.
el_slapper est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 23h34   #4
Graffito
Expert Confirmé Sénior
 
Avatar de Graffito
 
Inscription : janvier 2006
Messages : 5 390
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 5 390
Points : 6 036
Points : 6 036
Citation:
Se pourrait-il q'un accès aux données encapsulées considérées inaccessibles soit toujours possible dans les autres langages qui intègrent l'encapsulation (comme java, C#)
En C#, avec la "reflection, on peut accéder à toutes les propriété et appeler toutes les méthodes quel que soit leur niveau de potection. (Voir "Type.GetProperties" ou "Type.GetMehod").
__________________
" Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson
Graffito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 11h21   #5
Médinoc
Expert Confirmé Sénior
 
Avatar de Médinoc
 
Homme
Développeur informatique
Inscription : septembre 2005
Messages : 22 390
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2005
Messages : 22 390
Points : 32 032
Points : 32 032
Envoyer un message via MSN à Médinoc
Citation:
Envoyé par Graffito Voir le message
En C#, avec la "reflection, on peut accéder à toutes les propriété et appeler toutes les méthodes quel que soit leur niveau de potection. (Voir "Type.GetProperties" ou "Type.GetMehod").

Citation:
Envoyé par Medinoc
Le seul outil restant est la Réflexion, mais elle aussi nécessite un droit spécial (MemberAccess) pour accéder aux membres privés.
ReflectionPermission class
ReflectionPermissionFlag enumeration
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone.
-- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Médinoc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2013, 09h08   #6
synergy
Invité de passage
 
Homme Alain
gestionnaire d'exploitation informatique
Inscription : décembre 2012
Messages : 4
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 46
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : gestionnaire d'exploitation informatique
Secteur : Santé

Informations forums :
Inscription : décembre 2012
Messages : 4
Points : 0
Points : 0
Je n'espérais pas de réponses, donc déjà merci
Elles confirment qu'il ne s'agit, suivant les langages considérés, que d'un degré de protection plus ou moins élevé et abscons (choisi par les concepteurs du langage) des données définies comme privées.

Comme j'ai affaire à des experts pourriez-vous me dire qu'elle est votre livre de référence pour la programmation orientée objet.
synergy est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 15h31.


 
 
 
 
Partenaires

Hébergement Web