web-dev-qa-db-fra.com

Comment l'abstraction et l'encapsulation diffèrent?

Je me prépare pour une entrevue et a décidé de peaufiner mes OOP concepts. Des centaines d'articles sont disponibles, mais il semble que chacun les décrit différemment. Dit

L'abstraction est "le processus d'identification des modèles communs qui présentent des variations systématiques; une abstraction représente le modèle commun et fournit un moyen de spécifier quelle variation utiliser" (Richard Gabriel).

et est réalisé à travers des classes abstraites.

Certains autre dit

Abstraction signifie afficher uniquement les détails nécessaires au client de l'objet.

et

Supposons que vous ayez une méthode "CalculateSalary" dans votre classe Employee, qui prend EmployeeId en tant que paramètre et renvoie le salaire de l'employé pour le mois en cours sous forme de valeur entière. Maintenant, si quelqu'un veut utiliser cette méthode. Il n'a pas besoin de se soucier de la façon dont objet employé calcule le salaire? Une seule chose dont il doit s’inquiéter est le nom de la méthode, ses paramètres d’entrée et le format du membre résultant.

J'ai googlé encore et encore et aucun des résultats ne semble me donner une réponse correcte. Maintenant, où se situe l'encapsulation dans tout cela? J'ai cherché et trouvé une question de débordement de pile . Même les réponses à ces questions prêtaient à confusion Ici , il est dit

L'encapsulation est une stratégie utilisée dans le cadre de l'abstraction. L'encapsulation fait référence à l'état des objets - les objets encapsulent leur état et le cachent de l'extérieur; des utilisateurs extérieurs à la classe interagissent avec elle par le biais de ses méthodes, mais ne peuvent pas accéder directement à l'état des classes. La classe extrait donc les détails de l'implémentation liés à son état.

Et ici un autre membre réputé dit:

Ce sont des concepts différents.

L'abstraction est le processus qui permet d'affiner tous les attributs inutiles/sans importance d'un objet et de ne conserver que les caractéristiques les mieux adaptées à votre domaine.

Maintenant, je me suis planté dans l’ensemble du concept. Je connais les classes abstraites, l'héritage, les spécificateurs d'accès et tout. Je veux juste savoir comment dois-je répondre lorsque l’on me pose des questions sur l’abstraction et/ou l’encapsulation dans une interview.

_ {Veuillez ne pas le marquer comme un doublon}. Je sais qu'il y a plusieurs questions similaires. Mais je veux éviter la confusion entre les explications contradictoires. Quelqu'un peut-il suggérer un lien crédible? Un lien vers une question de stackoverflow est également le bienvenu, sauf s'il crée de nouveau une confusion. :)

EDIT: J'ai besoin de réponses, un peu orienté c #

60
Aparan

Abstraction signifie afficher uniquement les détails nécessaires au client de l'objet.

En fait, c'est l'encapsulation. Voir également la première partie de l'article de Wikipédia pour ne pas être confondu par l'encapsulation et la dissimulation de données. http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)

gardez à l'esprit qu'en masquant simplement tous les membres de votre groupe 1: 1 derrière les propriétés, vous ne faites pas du tout l'encapsulation. L'encapsulation consiste à protéger les invariants et à cacher les détails de la mise en œuvre.

voici un bon article à ce sujet . http://blog.ploeh.dk/2012/11/27/Encapsulationofproperties/ Consultez également les articles liés dans cet article.

les classes, propriétés et modificateurs d'accès sont des outils pour fournir une encapsulation en c #.

vous faites l’encapsulation afin de réduire la complexité.

L'abstraction est "le processus d'identification des modèles communs qui présentent des variations systématiques; une abstraction représente le modèle commun et fournit un moyen de spécifier quelle variation utiliser" (Richard Gabriel).

Oui, c'est une bonne définition de l'abstraction. 

Ce sont des concepts différents . L'abstraction est le processus qui permet d'affiner tous les attributs inutiles/sans importance d'un objet et de ne conserver que les caractéristiques les mieux adaptées à votre domaine.

Oui, ce sont des concepts différents. Gardez à l'esprit que l'abstraction est en fait le contraire de rendre un objet adapté à VOTRE domaine UNIQUEMENT. c'est pour rendre l'objet approprié pour le domaine en général!

si vous avez un problème réel et si vous apportez une solution spécifique, vous pouvez utiliser l’abstraction pour formaliser une solution plus générique qui peut également résoudre davantage de problèmes ayant le même schéma commun. De cette façon, vous pouvez augmenter la possibilité de réutilisation de vos composants ou utiliser des composants créés par d'autres programmeurs et conçus pour le même domaine, voire pour des domaines différents.

de bons exemples sont les classes fournies par le framework .net, par exemple list ou collection. Ce sont des classes très abstraites que vous pouvez utiliser presque partout et dans beaucoup de domaines. Imaginez si .net implémentait uniquement une classe EmployeeList et une CompanyList pouvant uniquement contenir une liste d'employés et d'entreprises possédant des propriétés spécifiques. de telles classes seraient inutiles dans beaucoup de cas. et quel mal serait-il si vous deviez, par exemple, ré-implémenter toute la fonctionnalité d'une CarList. Donc, la "liste" est RÉSUMÉE loin de l'employé, de l'entreprise et de la voiture. La liste en elle-même est un concept abstrait pouvant être implémenté par sa propre classe.

Les interfaces, les classes abstraites ou l'héritage et le polymorphisme sont des outils permettant de fournir une abstraction en c #.

vous faites abstraction afin de fournir la réutilisabilité.

44
Egi

Encapsulation : masquage de données à l'aide de getters, setters, etc.

Abstraction : masquer l'implémentation à l'aide de classes abstraites et d'interfaces, etc.

88
Bunny

 Abstraction & Encapsulation Example source de l'image

(Abstraction:} _ est délimité par les images en haut à gauche et en haut à droite du chat. Le chirurgien et la vieille dame ont conçu (ou visualisé) l'animal différemment. De la même manière, vous mettriez différentes fonctionnalités dans la classe Cat, en fonction des besoins de l'application. Chaque chat a un foie, une vessie, un cœur et des poumons, mais si vous avez besoin que votre chat «ronronne» uniquement, vous résumerez le chat de votre application avec le motif en haut à gauche plutôt qu'en haut à droite.

(Encapsulation:} _ est souligné par le chat debout sur la table. C'est ce que tout le monde à l'extérieur du chat devrait voir comme tel}. Ils n'ont pas à s'inquiéter de savoir si la mise en œuvre réelle du chat est en haut à gauche, en haut à droite ou même une combinaison des deux.


PS: Allez ici sur cette même question pour entendre toute l'histoire.

42
displayName

Je vais essayer de démontrer l'encapsulation et l'abstraction d'une manière simple .. Voyons voir ..

  • Le regroupement de données et de fonctions dans une seule unité (appelée classe .__) est appelé encapsulation. Encapsulation contenant et masquant les informations Sur un objet, telles que les structures de données internes et le code

L'encapsulation est -

  • Cacher la complexité,
  • Reliant Données et Fonction ensemble, 
  • Rendre la méthode compliquée privée,
  • Rendre privé la variable d'instance,
  • Masquer les données et les fonctions inutiles de l'utilisateur final.

Encapsulation implémente l'abstraction.

Et l'abstraction est - 

  • Montrer ce qui est nécessaire,
  • Les données doivent être abstraites de l'utilisateur final,

Voyons un exemple

L'image ci-dessous montre une interface utilisateur graphique intitulée "Les détails du client à ajouter dans une base de données".

Customer Screen GUI

En regardant l'image, nous pouvons dire que nous avons besoin d'une classe de clientèle.

Étape 1: de quoi ma classe de clientèle a-t-elle besoin?

c'est à dire.

  • 2 variables pour stocker le code client et le nom du client.

  • 1 Fonction pour ajouter le code client et le nom du client dans la base de données.

  namespace CustomerContent
    {
       public class Customer
       {
           public string CustomerCode = "";
           public string CustomerName = "";
           public void ADD()
           {
              //my DB code will go here
           }

Maintenant, seule la méthode ADD ne fonctionnera pas ici seule.

Étape -2: Comment la validation fonctionnera-t-elle, fonction ADD?

Nous aurons besoin du code de connexion à la base de données et du code de validation (méthodes supplémentaires).

     public bool Validate()
     {
    //Granular Customer Code and Name
    return true;
     }

     public bool CreateDBObject()
     {
    //DB Connection Code
    return true;
     }


class Program
{
   static void main(String[] args)
   {
     CustomerComponent.Customer obj = new CustomerComponent.Customer;

     obj.CustomerCode = "s001";
     obj.CustomerName = "Mac";

     obj.Validate();
     obj.CreateDBObject();

     obj.ADD();
    }
}

Désormais, il n’est plus nécessaire d’afficher les méthodes supplémentaires (Validate(); CreateDBObject() [méthodes compliquées et supplémentaires]) à l’utilisateur final. L'utilisateur final ne se soucie pas de COMMENT il va ajouter les données à la base de données?.

Étape 3: Privilégiez les méthodes supplémentaires et compliquées qui n'impliquent pas l'interaction de l'utilisateur final.

Ainsi, en rendant les méthodes compliquées et supplémentaires privées au lieu de les rendre publiques (en les masquant), et en supprimant la fonction obj.Validate();obj.CreateDBObject(); du programme principal de classe, nous obtenons l’encapsulation.

En d'autres termes, simplifier l'interface pour l'utilisateur final est l'encapsulation.

Alors maintenant, le code complet se présente comme ci-dessous -

 namespace CustomerContent
 {
     public class Customer
     {
        public string CustomerCode = "";
        public string CustomerName = "";

        public void ADD()
        {
           //my DB code will go here
        }

        private bool Validate()
        {
           //Granular Customer Code and Name
           return true;
        }

        private bool CreateDBObject()
        {
           //DB Connection Code
           return true;
        }


  class Program
  {
     static void main(String[] args)
     {
        CustomerComponent.Customer obj = new CustomerComponent.Customer;

        obj.CustomerCode = "s001";

        obj.CustomerName = "Mac";

        obj.ADD();
   }
}

Résumé :

Étape -1: De quoi ma classe de clientèle a-t-elle besoin? est Abstraction.

Étape -3: Étape -3: Privilégiez les méthodes supplémentaires compliquées qui n'impliquent pas l'interaction de l'utilisateur final est Encapsulation.

P.S. - Le code ci-dessus est dur et rapide. 

MISE À JOUR: Il y a une vidéo sur ce lien pour expliquer l'exemple: Quelle est la différence entre Abstraction et Encapsulation

25
Sanchit

Je pense que ce sont des concepts légèrement différents, mais souvent ils sont appliqués ensemble. L'encapsulation est une technique permettant de cacher les détails d'implémentation à l'appelant, tandis que l'abstraction est davantage une philosophie de conception impliquant la création d'objets analogues aux objets/processus familiers, afin de faciliter la compréhension. L'encapsulation n'est qu'une des nombreuses techniques pouvant être utilisées pour créer une abstraction.

Par exemple, prenons "windows". Ce ne sont pas vraiment des fenêtres au sens traditionnel, ce ne sont que des carrés graphiques à l'écran. Mais il est utile de les considérer comme des fenêtres. C'est une abstraction.

Si "l'API Windows" masque les détails de la manière dont le texte ou les graphiques sont rendus physiquement dans les limites d'une fenêtre, c'est l'encapsulation.

9
Mike Panter

L'analyse et la conception orientées objet (OOAD) repose en fait sur quatre principes. Elles sont:

  • Abstraction: signifie que vous n'incorporez que les fonctionnalités d'une entité requises dans votre conception. Ainsi, si chaque compte bancaire a une date d'ouverture mais que votre application n'a pas besoin de connaître la date d'ouverture d'un compte, vous n'ajoutez pas simplement le champ OpeningDate dans votre conception orientée objet du compte bancaire. classe. L'abstraction dans OOAD n'a rien à voir avec les classes abstraites en programmation. Selon ce principe, vos entités sont une abstraction de ce qu'elles sont réellement. Vous concevez une abstraction de compte bancaire jusqu'au niveau de détail requis par votre application.

  • Héritage: ressemble plus à un astuce qu'à un principe réel, ce qui vous évite de réécrire les fonctionnalités que vous avez écrites ailleurs. La seule chose à faire est qu'il doit exister une relation entre le nouveau code que vous écrivez et l'ancien code que vous souhaitez réutiliser. Tout comme vous pouvez hériter de la richesse de vos parents, vous pouvez hériter des champs et méthodes de votre classe parent. Donc, prendre tout ce que la classe parent a et ensuite ajouter quelque chose de plus si besoin est, c'est héritage. Ne cherchez pas l'héritage dans votre conception orientée objet. L'héritage se présentera.

  • Polymorphisme: est une conséquence de l'héritage. L'héritage d'une méthode du parent est utile, mais le polymorphisme est le moyen de modifier une méthode si la situation l'exige. Vous pouvez implémenter une méthode dans la sous-classe avec exactement la même signature que dans la classe parente. Ainsi, lorsqu'elle est appelée, la méthode de la classe enfant est exécutée. C'est le polymorphisme.

  • Encapsulation: signifie regrouper les fonctionnalités associées et donner accès à niquement ​​le nécessaire. Ce principe est le base de la conception de classes en conception orientée objet ​​où:

    • vous rassemblez des données et des méthodes connexes; et,
    • toutes les données et méthodes ne sont pas nécessairement publiques.

Une autre réponse simplifiée est ici .


Les personnes qui affirment que "L'abstraction de OOAD donne le mot clé abstrait OO" ... Eh bien, c'est simplement pas correct.

Exemple: lorsque vous concevez une université dans une application en utilisant des principes orientés objet, vous ne concevez qu'une "abstraction" de l'université. Même s'il existe généralement un guichet automatique bancaire dans presque toutes les universités, vous ne pouvez pas l'intégrer si cela n'est pas nécessaire pour votre application. Et maintenant, bien que vous ayez conçu seulement une abstraction de l’université, vous n'êtes pas obligé de mettre abstract dans votre déclaration de classe. Votre conception abstraite de l’université sera un cours normal dans votre application.

6
displayName

mon 2c

le but de l’encapsulation est de cacher les détails d’implémentation à l’utilisateur de votre classe, par exemple. Si vous conservez en interne une liste d'éléments std :: dans votre classe, puis décidez qu'une stratégie std :: vector serait plus efficace, vous pouvez le modifier sans que l'utilisateur s'en soucie. Ceci dit, la façon dont vous interagissez avec le conteneur stl est, grâce à l’abstraction, que la liste et le vecteur peuvent par exemple être parcourus de la même manière en utilisant des méthodes similaires (itérateurs).

4
Anders

Un exemple m'a toujours été rapporté dans le contexte de l'abstraction; la transmission automatique vs manuelle sur les voitures. La boîte de vitesses manuelle cache certains rouages ​​du changement de vitesse, mais vous devez toujours vous embrayer et changer de vitesse en tant que conducteur. La transmission automatique englobe tous les détails des changements de vitesse, c'est-à-dire qu'elle vous les cache, et constitue donc une abstraction plus importante du processus de changement de vitesse.

2
Lorentz Vedeler

Encapsulation: masquer les détails de l’implémentation (REMARQUE: données ET/OU méthodes) de sorte que seuls ce qui est lisiblement lisible/inscriptible/utilisable par les externes leur soit accessible, tout le reste est directement "intouchable".

Abstraction: cela fait parfois parfois spécifiquement référence à un type qui ne peut pas être instancié et qui fournit un modèle pour d'autres types pouvant l'être, généralement via un sous-classement. Plus généralement, "abstraction" signifie créer/avoir quelque chose de moins détaillé, de moins spécifique, de moins granulaire.

Il existe certaines similitudes, certains chevauchements entre les concepts, mais la meilleure façon de s'en souvenir est la suivante: L'encapsulation concerne davantage masquage les détails, tandis que l'abstraction concerne davantage généralisant les détails.

1
Brad Thomas

Abstraction et Encapsulation sont des termes confus et dépendants l'un de l'autre. Prenons un exemple:

public class Person
    {
        private int Id { get; set; }
        private string Name { get; set; }
        private string CustomName()
        {
            return "Name:- " + Name + " and Id is:- " + Id;
        }
    }

Lorsque vous avez créé la classe Personne, vous avez encapsulé en écrivant des propriétés et des fonctions (Id, Nom, NomPersonnalisé). Vous effectuez une abstraction lorsque vous exposez cette classe au client en tant que

Person p = new Person();
p.CustomName();

Votre client ne sait rien de l'identifiant et du nom dans cette fonction. Maintenant si, votre client veut aussi connaître le nom de famille sans perturber l'appel de fonction. Vous faites l’encapsulation en ajoutant une propriété supplémentaire à la classe Personne comme ceci.

public class Person
        {
            private int Id { get; set; }
            private string Name { get; set; }
            private string LastName {get; set;}
            public string CustomName()
            {
                return "Name:- " + Name + " and Id is:- " + Id + "last name:- " + LastName;
            }
        }

Regardez, même après avoir ajouté une propriété supplémentaire en classe, votre client ne sait pas ce que vous avez fait avec votre code. C'est là que tu as fait de l'abstraction.

1
CredibleAshok

Abstraction

En Java, abstraction signifie cacher l'information au monde réel. Il établit le contrat entre les parties pour indiquer «que devons-nous faire pour utiliser le service».

Exemple, dans le développement d'API, seules les informations abstraites du service ont été révélées au monde, plutôt que la mise en œuvre réelle. L'interface en Java peut très bien aider à concrétiser ce concept.

Interface fournit un contrat entre les parties, par exemple, le producteur et le consommateur. Le producteur produit les marchandises sans informer le consommateur de la fabrication du produit. Mais, par l’interface, Producer informe tous les consommateurs du produit qu’il peut acheter. À l'aide de l'abstraction, le producteur peut commercialiser le produit auprès de ses consommateurs.

Encapsulation:

L'encapsulation est un niveau d'abstraction. La même société de produits essaie de protéger les informations de chaque autre groupe de production. Par exemple, si une entreprise produit du vin et du chocolat, l’encapsulation permet de protéger les informations relatives à la fabrication de chaque produit.

  1. Si j'ai un package individuel pour un vin et un autre pour Chocolate, et si toutes les classes sont déclarées dans le package en tant que modificateur d'accès par défaut , Nous donnons une encapsulation au niveau du package Pour toutes les classes.
  2. Dans un package, si nous déclarons chaque classe classée (champ membre) comme Private et disposant d'une méthode publique pour accéder à ces champs, de cette manièreen encapsulant au niveau de la classe ces champs
0
Shaan

J'y pense de cette façon, l'encapsulation cache la façon dont quelque chose est fait. Cela peut être une ou plusieurs actions. 

L'abstraction est liée au "pourquoi" je l'encapsule en premier lieu. 

En gros, je dis au client: "Vous n'avez pas besoin de savoir beaucoup sur la façon dont je traite le paiement et calcule les frais d'expédition, etc. Je veux juste que vous me disiez que vous voulez" Passer la commande "et que je m'occupe des détails pour vous. . "

De cette façon, j'ai encapsulé les détails en généralisant (résumant) dans la demande de paiement.

Je pense vraiment que l’abstraction et l’encapsulation vont de pair.

0
FrankO

Comme je le sais, l’encapsulation cache des données de classes en elles-mêmes et ne les rend accessibles que par des setters/getters, si elles doivent être accessibles depuis le monde extérieur.

L'abstraction est la conception de classe pour elle-même.

Cela signifie que vous créez votre arbre de classes, quelles méthodes sont générales, héritées, qui peuvent être remplacées, quels attributs ne se trouvent qu'au niveau privé ou protégé, classes, classes abstraites, implémentation d'interface.

L'abstraction est davantage placée dans la phase de conception, tandis que l'encapsulation entre également dans la phase de développement.

0
icbytes