Quelle est la différence entre «masquage de données» et «encapsulation»?

29

Je lis "Concurrence Java dans la pratique" et il est dit: "Heureusement, les mêmes techniques orientées objet qui vous aident à écrire des classes bien organisées et maintenables - telles que l'encapsulation et le masquage des données - peuvent également vous aider à créer des thread-safe Des classes."

Le problème # 1 - Je n'ai jamais entendu parler de la dissimulation de données et je ne sais pas ce que c'est.

Le problème # 2 - J'ai toujours pensé que l'encapsulation utilise le privé contre le public, et est en fait la dissimulation des données.

Pouvez-vous expliquer ce qu'est la dissimulation de données et en quoi elle diffère de l'encapsulation?

dhblah
la source
2
Lire Code Complete 2nd edition . Cela répondra à beaucoup de vos questions.
Shiplu Mokaddim
En ce qui concerne les informations cachées, voir: javaworld.com/jw-05-2001/jw-0518-encapsulation.html
Dave Jarvis
Ce lien contient des informations utiles sur ces informations. Masquer un principe de conception, spécifie qu'une décision de conception doit être cachée au reste du système pour éviter tout couplage involontaire. Cela devrait informer la façon dont vous encapsulez les choses, mais bien sûr, cela n'est pas obligatoire. L'encapsulation est une fonction du langage de programmation.
Abhijeet

Réponses:

19

La dissimulation de données et d'informations est une notion plus large, que l'on retrouve en informatique et en génie logiciel. Il fait référence au fait que les parties d'un programme informatique qui peuvent changer ne doivent pas être accessibles à partir d'autres modules / des clients.

L'encapsulation est un terme qui se trouve dans le paradigme orienté objet et fait référence à la conservation des données dans des champs privés et à leur modification uniquement par des méthodes.

Ainsi, l' encapsulation peut être considérée comme un moyen de masquer les données dans des systèmes orientés objet .

m3th0dman
la source
1
Merci de votre réponse. Je ne comprends toujours pas, pourquoi si le masquage des données est le même mais juste un peu plus large que l'encapsulation, il est fait référence dans le livre comme si elles étaient d'une largeur similaire et non pas l'une incluant l'autre.
dhblah
Les auteurs font probablement une différence entre le masquage de données et le masquage d'informations dans le sens où le masquage de données masque uniquement les structures de données - les champs privés - tandis que le masquage d'informations peut faire référence à l'encapsulation des détails de mise en œuvre (algorithmes utilisés par exemple) la communication se faisant uniquement via des interfaces.
m3th0dman
2
Vous pouvez en avoir un sans avoir l'autre - regardez Python, où aucune donnée ne se cache du tout (rien de tel qu'un attribut privé ou protégé).
Latty
Le point de @ Lattyware est très vrai et important. On peut également avoir une encapsulation (par votre définition, à laquelle je m'oppose à cause de ce que je décris ici) sans rien cacher, à savoir en exposant aveuglément un getter et un setter triviaux pour chaque membre. Cela ne cache rien et n'empêche rien, mais répond à la définition commune de l'encapsulation à la lettre.
1
L'encapsulation ne conserve pas les données dans un champ privé, c'est plus d'informations qui se cachent. L'encapsulation, d'une manière générale, est le concept de rassembler (encapsuler) des informations / données et des méthodes dans une classe.
nbro
6

L'encapsulation et le masquage des données sont des termes liés. Il est important de comprendre qu'ils surviennent en relation avec l' abstraction . Booch et. Al. en analyse et conception orientées objet avec applications explique,

L'abstraction et l'encapsulation sont des concepts complémentaires: l'abstraction se concentre sur le comportement observable d'un objet, tandis que l'encapsulation se concentre sur l'implémentation qui donne naissance à ce comportement. L'encapsulation est le plus souvent réalisée grâce à la dissimulation d'informations (pas seulement la dissimulation de données), qui est le processus de dissimulation de tous les secrets d'un objet qui ne contribuent pas à ses caractéristiques essentielles; généralement, la structure d'un objet est masquée, ainsi que la mise en œuvre de ses méthodes.

theD
la source
5

La création d'une classe inclut le concept d'encapsulation. Lorsque vous créez une classe, vous mettez des données et des comportements à l'intérieur de la classe et la classe devient une unité que nous appelons un objet. Le masquage des données fait donc partie de l'encapsulation.

Aleko Gharibashvili
la source
4

De Wikipédia :

Dans un langage de programmation, l' encapsulation est utilisée pour faire référence à l'une des deux notions liées mais distinctes, et parfois à leur combinaison:

  • Un mécanisme de langage pour restreindre l'accès à certains composants de l'objet.
  • Une construction de langage qui facilite le regroupement des données avec les méthodes (ou autres fonctions) opérant sur ces données.

Certains chercheurs et universitaires du langage de programmation utilisent le premier sens seul ou en combinaison avec le second comme caractéristique distinctive de la programmation orientée objet, tandis que d'autres langages de programmation qui fournissent des fermetures lexicales considèrent l'encapsulation comme une caractéristique du langage orthogonal à l'orientation objet.

La deuxième définition est motivée par le fait que dans de nombreux langages POO, le masquage des composants n'est pas automatique ou peut être ignoré; ainsi, la dissimulation d'informations est définie comme une notion distincte par ceux qui préfèrent la deuxième définition.

Michael Borgwardt
la source
Merci pour votre réponse. Questions de suivi: 1) le langage de programmation java possède-t-il des installations auxquelles se réfère la seconde notion liée à l'encapsulation? 2) Je ne comprends pas pourquoi le dépassement des données cachées est important. Par exemple, en java, vous pouvez accéder à n'importe quel domaine (public ou privé) grâce à la réflexion.
dhblah
@Software Engeneering Learner: les classes en tant que constructions de code source représentent la deuxième notion. En ce qui concerne la dissimulation d'informations, le fait est que la limitation de la portée des données repose souvent sur des mécanismes linguistiques spécifiques et distincts.
Michael Borgwardt
2

Ils sont souvent utilisés de manière interchangeable dans les discussions, et je pense souvent qu'ils travaillent ensemble pour atteindre le même objectif, et bien que les éléments suivants ne soient pas tout à fait exacts, ils peuvent fournir une distinction significative, si une distinction doit être faite:

Lorsque l'on parle d'encapsulation, elle est souvent mise en œuvre comme un mécanisme procédural / fonctionnel. Il existe un certain type de garde pour l'état sous-jacent, et l'accès via la garde nécessite que certains protocoles soient suivis pour avoir accès (lire ou modifier l'état souhaité). L'encapsulation offre également la possibilité d'effets secondaires dus à l'accès (comme un changement d'état en cascade, ou la notification / le déclenchement d'un événement / l'émission d'un signal lorsque la chose d'intérêt est lue ou modifiée) afin que des actions de suivi puissent être lancées. Encore une fois, je pense souvent à l'encapsulation comme un concept qui est mis en œuvre comme une procédure.

Je vois que le concept de masquage des données a un objectif similaire à celui de l'encapsulation; cependant, le mécanisme est structurel et fonctionne à un niveau différent. Dans la pratique, au lieu de fournir un mécanisme de garde et d'effets secondaires via la procédure, l'état est protégé et affecté par les mécanismes structurels du langage et de l'exécution. Ces types de gardes seraient des clauses de visibilité, des définitions de type, l'héritage et similaires. Les effets secondaires que vous pouvez exploiter à partir des objets structurellement protégés sont à nouveau quelque chose qui dépend du langage et de l'exécution: peut-être l'activation des objets, le nombre de références ou quelque chose dans ce sens.

JustinC
la source
0

Ils sont souvent, peut-être généralement, utilisés de manière interchangeable. Mais notez que la citation de Booch ci-dessus dit: "L'encapsulation est le plus souvent réalisée par la dissimulation d'informations ..." c'est-à-dire le plus souvent, mais pas toujours dans tous les cas.

Notez que Python permet de remonter les données dans les classes, mais n'autorise pas les variables privées. On pourrait donc dire que Python fournit l'encapsulation sans cacher les données.

Vous pourriez faire la même chose en Java en créant toutes vos variables membres public, mais en plus de donner à tout le monde une crise cardiaque, vous perdriez l'avantage de masquer les données ... c'est-à-dire en préservant la sémantique d'un objet en restreignant l'accès à son état.

Rob
la source
0

Dans OO, l' encapsulation est l'endroit où les informations sont conservées dans un objet. Par exemple, a Persona nameet les clients de Person (c'est-à-dire vous) savent que Person possède un nom, soit via des champs publics, soit via des méthodes d'accesseur. Et, espérons-le, vous n'avez pas besoin de conserver également les noms dans un tableau global de noms, etc. C'est donc une grande étape pour éviter le code spaghetti ingérable. Mais le client doit encore savoir quelque chose sur la façon dont Person gère les noms: par exemple, espace ou virgule délimitée?

Le masquage de données est l'endroit où Persona un champ de nom, mais, au moins en théorie, personne ne le sait . Le champ est privé, sans méthode d'accesseur public. Les clients peuvent transmettre un nom à partir d'un enregistrement de base de données, XML, HTTP POST, peu importe, mais le fonctionnement interne de la façon dont Person gère le nom est une «boîte noire». Les futures implémentations de Person sont libres de changer, par exemple, pour passer à avoir un firstNameet un lastName.

Dans un monde idéal, le masquage de données est supérieur à l'encapsulation, mais tous les mondes ne sont pas idéaux. :-)

user949300
la source