Question

" L'abstraction " et l'encapsulation sont des concepts complémentaires: l'abstraction se concentre sur le comportement observable d'un objet ... l'encapsulation se concentre sur l'implémentation qui donne lieu à ce comportement ... l'encapsulation est le plus souvent réalisée par le biais d'une dissimulation d'informations , qui consiste à masquer tous les secrets d'un objet qui ne contribuent pas à ses caractéristiques essentielles. " - < strong> Grady Booch dans l'analyse et la conception orientées objet

Pouvez-vous me montrer des exemples convaincants des avantages de l'encapsulation par la dissimulation d'informations?

Était-ce utile?

La solution

L'exemple donné dans ma première classe OO:

Imaginez un lecteur multimédia. Il résume les concepts de lecture, pause, avance rapide, etc. En tant qu'utilisateur, vous pouvez l'utiliser pour faire fonctionner l'appareil.

Votre magnétoscope a implémenté cette interface et a masqué ou encapsulé les détails des lecteurs mécaniques et des bandes.

Lorsqu'une nouvelle implémentation d'un lecteur multimédia arrive (par exemple, un lecteur DVD qui utilise des disques plutôt que des bandes), elle peut remplacer la mise en œuvre encapsulée dans le lecteur multimédia et les utilisateurs peuvent continuer à l'utiliser comme ils le faisaient avec leur magnétoscope (mêmes opérations telles que lecture, pause, etc.).

C’est le concept de masquage d’informations par le biais de abstraction . Il permet aux détails de la mise en œuvre de changer sans que les utilisateurs aient à connaître et favorise le faible couplage de code.

Autres conseils

L'abstraction * nix des flux de caractères (fichiers disque, pipes, sockets, ttys, etc.) en une seule entité (le modèle "tout est un fichier") permet d'appliquer un large éventail d'outils à une large gamme de sources / puits de données d’une manière qui ne serait tout simplement pas possible sans l’encapsulation.

De même, le concept de flux dans différentes langues, résumant sur des listes, des tableaux, des fichiers, etc.

De plus, des concepts tels que les nombres (résumer sur des nombres entiers, une demi-douzaine de types de flotteurs, les rationnels, etc.) imaginent ce que ce serait un cauchemar si le code de niveau supérieur était doté du format mantisse, etc., puis laissé à lui-même .

Je sais qu'il existe déjà une réponse acceptée, mais je voulais en lancer une autre: OpenGL / DirectX

Aucune de ces API n'est une implémentation complète (bien que DirectX soit certainement un peu plus lourde à cet égard), mais des méthodes génériques de communication des commandes de rendu sur une carte graphique.

Les fournisseurs de cartes sont ceux qui fournissent l'implémentation (pilote) d'une carte spécifique, qui dans de nombreux cas est très spécifique au matériel, mais vous, en tant qu'utilisateur, ne devez jamais vous soucier qu'un utilisateur exécute un GeForce ABC et l'autre un. Radeon XYZ parce que l'implémentation exacte est cachée derrière l'API de haut niveau. Si ce n’était pas le cas, vous auriez besoin d’un chemin de code dans vos jeux pour chaque carte du marché que vous souhaitiez prendre en charge, ce qui serait totalement ingérable dès le premier jour. Un autre avantage non négligeable de cette approche est que Nvidia / ATI peut version plus récente et plus efficace de leurs pilotes et vous en profiterez automatiquement sans aucun effort de votre part.

Le même principe est en vigueur pour le son, le réseau, la souris, le clavier ... essentiellement n'importe quel composant de votre ordinateur. Que l'encapsulation se produise au niveau du matériel ou dans un pilote logiciel, toutes les spécificités du périphérique sont masquées pour vous permettre de traiter n'importe quel clavier, par exemple, comme un simple clavier et non comme un clavier Microsoft Ergonomic Media Explorer Deluxe Revision 2 .

Lorsque vous regardez les choses sous cet angle, il devient rapidement évident que sans une forme quelconque d’ordinateur d’encapsulation / abstraction telle que nous la connaissons aujourd’hui, cela ne fonctionnerait tout simplement pas. Est-ce assez brillant pour vous?

Presque toutes les bases de code Java, C # et C ++ du monde cachent des informations: c'est aussi simple que les sections privées: des classes.

Le monde extérieur ne pouvant pas voir les membres privés, un développeur peut donc les modifier sans avoir à s'inquiéter du reste du code non compilé.

Quoi? Vous n'êtes pas encore convaincu?

Il est plus facile de montrer le contraire. Nous avions l'habitude d'écrire du code qui ne contrôlait pas qui pouvait accéder aux détails de son implémentation. Cela rendait presque parfois impossible de déterminer quel code modifiait une variable.

De plus, vous ne pouvez pas vraiment faire abstraction de quelque chose si chaque élément de code du monde dépend éventuellement de la mise en oeuvre de classes concrètes spécifiques.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top