379 votes

Différence entre abstraction et encapsulation ?

Quelle est la différence précise entre encapsulation et abstraction ?

0 votes

J'ai écrit une réponse qui répond à votre question.

281voto

Konrad Rudolph Points 231505

La plupart des réponses ici se concentrent sur la POO mais l'encapsulation commence bien plus tôt :

  • Chaque fonction est un encapsulation ; en pseudo-code :

    point x = { 1, 4 }
    point y = { 23, 42 }
    
    numeric d = distance(x, y)

    Ici, distance encapsule le calcul de la distance (euclidienne) entre deux points d'un plan : il cache les détails de mise en œuvre. C'est de l'encapsulation pure et simple.

  • Abstraction est le processus de généralisation Il s'agit de prendre une mise en œuvre concrète et de la rendre applicable à des types de données différents, bien que quelque peu liés. L'exemple classique de l'abstraction est le langage C qsort pour trier les données :

    Le truc à propos de qsort est qu'il ne se soucie pas des données qu'il trie - en fait, il ne sait pas les données qu'il trie. Plutôt, son type d'entrée est un pointeur sans typage ( void* ), ce qui est la façon dont C dit "Je ne me soucie pas du type de données" (ceci est également appelé effacement de type). Le point important est que l'implémentation de qsort reste toujours le même, quel que soit le type de données. La seule chose qui a à modifier est la fonction de comparaison, qui diffère d'un type de données à l'autre. qsort s'attend donc à ce que l'utilisateur fournisse ladite fonction de comparaison comme argument de fonction.

L'encapsulation et l'abstraction vont de pair, à tel point que l'on pourrait dire qu'elles sont véritablement inséparables. Pour des raisons pratiques, c'est probablement vrai ; ceci dit, voici une encapsulation qui n'est pas vraiment une abstraction :

class point {
    numeric x
    numeric y
}

Nous encapsulons les coordonnées du point, mais nous ne les abstrayons pas matériellement, au-delà de leur regroupement logique.

Et voici un exemple d'abstraction qui n'est pas de l'encapsulation :

T pi<T> = 3.1415926535

Il s'agit d'un variable générique pi avec une valeur donnée (π), et la déclaration ne se soucie pas du type exact de la variable. Certes, j'aurais du mal à trouver quelque chose comme ça dans du code réel : l'abstraction utilise pratiquement toujours l'encapsulation. Cependant, l'exemple ci-dessus fait existent en fait en C++(14), par l'intermédiaire de modèles de variables (= modèles génériques pour les variables) ; avec une syntaxe légèrement plus complexe, par ex :

template <typename T> constexpr T pi = T{3.1415926535};

29 votes

Bien que chaque méthode soit une encapsulation, elle est également une abstraction, car chaque fois que vous rassemblez des éléments et leur donnez un nom, vous créez un nouveau concept (abstrait). L'encapsulation sans abstraction est inutile. Il n'est donc pas vrai qu'elles n'ont rien en commun.

0 votes

@proskor Je maintiens que les concepts sont orthogonaux même si leurs domaines se chevauchent. Il est peut-être même vrai que toute encapsulation est une abstraction (bien que je n'en sois pas convaincu) - mais même dans ce cas, je pense que cela serait accessoire plutôt qu'une propriété inhérente à l'un ou l'autre des concepts.

8 votes

Ils sont distincts, mais pas orthogonaux. En fait, je pense que l'encapsulation est effectivement un type particulier d'abstraction, à savoir une abstraction structurelle. En considérant une chose composée comme un tout, nous ignorons fondamentalement (nous nous abstrayons de) les détails de la façon dont elle est construite à partir d'autre chose, c'est-à-dire que nous ignorons sa structure interne.

140voto

dirkgently Points 56879

Encapsulation cache les détails de la mise en œuvre, qui peuvent ou non concerner un ou plusieurs comportements génériques ou spécialisés.

Abstraction est de fournir une généralisation (par exemple, sur un ensemble de comportements).

Voici une bonne lecture : Abstraction, encapsulation et dissimulation d'informations par Edward V. Berard de l'Agence Object.

6 votes

Le lien de Neha est aussi cassé maintenant, mais oui. on peut toujours googler le nom de l'article. c'est celui sur lequel je suis tombé tonymarston.co.uk/php-mysql/abstraction.txt

2 votes

Citation qui a rendu les choses claires pour moi : " Habituellement, l'abstraction n'est pas définie en termes de dissimulation d'information, par exemple, notez l'utilisation de mots tels que "ignorer" et "extraire". " Cependant, nous devrions également noter l'utilisation des mots "supprimer" et "supprimer" dans certains des exemples ci-dessus. En bref, on pourrait dire que l'abstraction dicte que certaines informations sont plus importantes que d'autres, mais ne spécifie pas (correctement) un mécanisme spécifique pour traiter les informations sans importance."

4 votes

L'encapsulation dans la POO ne consiste pas à cacher quelque chose. Il s'agit de combiner l'état et le comportement pour protéger les invariants.

107voto

Steven A. Lowe Points 40596

L'encapsulation met certaines choses dans une boîte et vous donne un judas ; cela vous empêche de toucher aux rouages.

l'abstraction ignore complètement les détails qui n'ont pas d'importance, comme le fait que les choses aient des engrenages, des cliquets, des volants d'inertie ou des noyaux nucléaires ; elles "marchent", c'est tout.

exemples d'encapsulation :

  • caleçon
  • boîte à outils
  • Portefeuille
  • sac à main
  • capsule
  • carbonite congelée
  • une boîte, avec ou sans bouton dessus
  • un burrito (techniquement, la tortilla qui entoure le burrito)

des exemples d'abstraction :

  • "groupes de choses" est une abstraction (que nous appelons agrégation)
  • "les choses qui contiennent d'autres choses" est une abstraction (que nous appelons composition)
  • Le terme "conteneur" est un autre type d'abstraction de "choses qui contiennent d'autres choses" ; notez que tous les exemples d'encapsulation sont des types de conteneurs, mais que tous les conteneurs ne présentent/proposent pas d'encapsulation. Un panier, par exemple, est un conteneur qui n'encapsule pas son contenu.

12 votes

Pourquoi ça a été rétrogradé ? C'est l'une des seules descriptions correctes dans cette grande mer de mauvaises réponses.

4 votes

Dans l'encapsulation en fournissant seulement le judas, n'avons-nous pas ignoré les détails qui n'ont pas d'importance pour l'utilisateur - c'est ce qu'est l'abstraction [comme vous l'avez dit]. En quoi ces deux choses sont-elles différentes ? Peut-être pouvez-vous élaborer davantage.

67 votes

@Sanjeev l'encapsulation est concrète, l'abstraction est... abstraite ! ;-) l'encapsulation est un objet que vous pouvez utiliser, l'abstraction est un idéal dont vous ne pouvez que discuter. l'encapsulation est la raison pour laquelle vous portez des sous-vêtements, l'abstraction est la façon dont vous expliquez la différence entre les sous-vêtements et les maillots de bain.

70voto

zzzz Points 2422

Encapsulation signifie cacher des données en utilisant des getter et setter, etc.

Abstraction signifie - cacher l'implémentation en utilisant des classes abstraites et des interfaces, etc.

0 votes

Comment votre réponse est liée à "L'abstraction est le processus de généralisation" - Comment nous pouvons réaliser la généralisation à l'aide de classes et d'interfaces abstraites. Avez-vous un exemple ?

29voto

jasonco Points 847
  • L'abstraction vous permet de vous concentrer sur ce que l'objet fait plutôt que sur la manière dont il le fait.
  • L'encapsulation consiste à cacher les détails internes ou la mécanique de la façon dont un objet fait quelque chose.

Comme lorsque vous conduisez une voiture, vous savez ce que fait la pédale d'accélérateur mais vous ne connaissez pas forcément le processus qui se cache derrière parce qu'il est encapsulé.

Laissez-moi vous donner un exemple en C#. Supposons que vous ayez un nombre entier :

int Number = 5;
string aStrNumber = Number.ToString();

vous pouvez utiliser une méthode comme Number.ToString() qui vous renvoie la représentation en caractères du nombre 5, et la stocke dans un objet chaîne. La méthode vous indique ce qu'elle fait et non comment elle le fait.

0 votes

J'ai failli upvooter pour la réponse courte et précise, mais j'ai revu la métaphore de la voiture qui m'a fait vomir - Oh, je suis un mec sympa :P +1

0 votes

Désolé mon pote hehe, j'ai ajouté une meilleure explication.

0 votes

Donc, les fonctions en C sont aussi de l'abstraction ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X