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?
La dissimulation de données et d'informations est une notion plus large que l'on retrouve dans les sciences informatiques et le génie logiciel. Il se réfère 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 des données dans des systèmes orientés objet.
L'encapsulation et le masquage des données sont des termes liés. Il est important de comprendre qu'ils surviennent par rapport à Abstraction. Booch et. dans 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 lieu à ce comportement. L'encapsulation est le plus souvent réalisée par le masquage d'informations (pas seulement le masquage de données), qui est le processus consistant à masquer 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.
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.
De Wikipedia :
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 nombreuses langues OOP masquage des composants n'est pas automatique ou peut être remplacée; , la dissimulation d'informations est donc définie comme une notion distincte par ceux qui préfèrent la seconde définition.
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 en tant que 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 protection 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.
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 obtenue grâce à 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 pouvez faire la même chose dans Java en faisant toutes vos variables membres public
, mais en plus de donner à tout le monde une crise cardiaque, vous perdriez l'avantage de cacher les données .. c'est-à-dire en préservant la sémantique d'un objet en restreignant l'accès à son état.
Dans O-O, Encapsulation est l'endroit où les informations sont conservées dans un objet. Par exemple, un Person
a un name
et les clients de la personne (c'est-à-dire vous) savent que la personne détient un nom , via des champs publics ou 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 la personne gère les noms: par exemple espace ou délimité par des virgules?
Masquage des données est l'endroit où Person
a un champ de nom, mais, au moins en théorie, personne ne 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 à un firstName
et 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. :-)