webentwicklung-frage-antwort-db.com.de

Wie unterscheiden sich Abstraktion und Kapselung?

Ich bereite mich auf ein Interview vor und entscheide mich, meine OOP Konzepte aufzufrischen. Es sind Hunderte von Artikeln verfügbar, aber es scheint, dass jeder sie anders beschreibt. Einige sagt

Abstraktion ist "der Prozess des Identifizierens gemeinsamer Muster mit systematischen Variationen; eine Abstraktion repräsentiert das gemeinsame Muster und bietet ein Mittel zum Spezifizieren der zu verwendenden Variation" (Richard Gabriel).

und wird durch abstrakte Klassen erreicht.

Einige andere sagt

Abstraktion bedeutet, dem Kunden des Objekts nur die notwendigen Details anzuzeigen

und

Angenommen, Sie haben eine Methode "CalculateSalary" in Ihrer Employee-Klasse, die EmployeeId als Parameter verwendet und das Gehalt des Mitarbeiters für den aktuellen Monat als Ganzzahlwert zurückgibt. Nun, wenn jemand diese Methode anwenden möchte. Er muss sich nicht darum kümmern, wie Employee Object das Gehalt berechnet. Er muss sich nur um den Namen der Methode, ihre Eingabeparameter und das Format des resultierenden Members kümmern.

Ich habe immer wieder gegoogelt und keines der Ergebnisse scheint mir eine richtige Antwort zu geben. Wo passt nun die Verkapselung in all diese? Ich habe eine Stapelüberlauf - Frage gesucht und gefunden. Sogar die Antworten auf diese Fragen waren verwirrend Hier , heißt es

Die Verkapselung ist eine Strategie, die als Teil der Abstraktion verwendet wird. Kapselung bezieht sich auf den Zustand von Objekten - Objekte kapseln ihren Zustand ein und verbergen ihn von außen; Externe Benutzer der Klasse interagieren mit ihr über ihre Methoden, können jedoch nicht direkt auf den Klassenstatus zugreifen. Daher abstrahiert die Klasse die Implementierungsdetails in Bezug auf ihren Status.

Und hier ein anderes angesehenes Mitglied sagt:

Sie sind unterschiedliche Konzepte.

Bei der Abstraktion werden alle nicht benötigten/unwichtigen Attribute eines Objekts verfeinert und nur die Merkmale beibehalten, die für Ihre Domain am besten geeignet sind.

Jetzt bin ich mit dem ganzen Konzept durcheinander. Ich kenne mich mit abstrakten Klassen, Vererbung, Zugriffsspezifizierern und allem aus. Ich möchte nur wissen, wie ich antworten soll, wenn ich in einem Interview nach Abstraktion und/oder Kapselung gefragt werde.

Bitte nicht als Duplikat markieren. Ich weiß, dass es mehrere ähnliche Fragen gibt. Aber ich möchte die Verwirrung zwischen den widersprüchlichen Erklärungen vermeiden. Kann jemand einen glaubwürdigen Link vorschlagen? Ein Link zur Stackoverflow-Frage ist ebenfalls willkommen, es sei denn, es kommt erneut zu Verwirrung. :)

BEARBEITEN: Ich brauche Antworten, ein bisschen c # -orientiert

60
Aparan

Abstraktion bedeutet, dem Kunden des Objekts nur die erforderlichen Details anzuzeigen

Eigentlich ist das die Kapselung. Siehe auch den ersten Teil des Wikipedia-Artikels, um nicht durch Kapselung und Datenverstecken zu verwechseln. http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)

denken Sie daran, dass durch die bloße Verdeckung aller Klassenmitglieder 1: 1 hinter Eigenschaften keine Kapselung entsteht. Bei der Kapselung geht es darum, Invarianten zu schützen und Details der Implementierung zu verbergen.

hier ein guter Artikel dazu . http://blog.ploeh.dk/2012/11/27/Encapsulationofproperties/ Schauen Sie sich auch die in diesem Artikel verlinkten Artikel an.

klassen, Eigenschaften und Zugriffsmodifizierer sind Werkzeuge, um die Kapselung in c # bereitzustellen.

sie kapseln, um die Komplexität zu reduzieren.

Abstraktion ist "der Prozess der Identifizierung allgemeiner Muster mit systematischen Variationen; eine Abstraktion stellt das gemeinsame Muster dar und stellt ein Mittel zur Verfügung, um anzugeben, welche Variation verwendet werden soll" (Richard Gabriel).

Ja, das ist eine gute Definition für die Abstraktion. 

Sie sind verschiedene Konzepte . Abstraktion ist der Prozess, bei dem alle nicht benötigten/unwichtigen Attribute eines Objekts verfeinert werden und nur die für Ihre Domäne am besten geeigneten Merkmale beibehalten werden.

Ja, das sind unterschiedliche Konzepte. Denken Sie daran, dass Abstraktion eigentlich das Gegenteil davon ist, dass Sie ein Objekt NUR für Ihre Domäne machen. es ist dazu gedacht, das Objekt allgemein für die Domain geeignet zu machen!

wenn Sie ein tatsächliches Problem haben und eine bestimmte Lösung bereitstellen, können Sie die Abstraktion verwenden, um eine allgemeinere Lösung zu formalisieren, die auch mehr Probleme mit demselben gemeinsamen Muster lösen kann. Auf diese Weise können Sie die Wiederverwendbarkeit Ihrer Komponenten erhöhen oder Komponenten verwenden, die von anderen Programmierern erstellt wurden, die für dieselbe Domäne oder sogar für andere Domänen erstellt wurden.

gute Beispiele sind Klassen, die vom .NET-Framework bereitgestellt werden, z. B. list oder collection. Dies sind sehr abstrakte Klassen, die Sie fast überall und in vielen Domänen verwenden können. Stellen Sie sich vor, dass .net nur eine EmployeeList-Klasse und eine CompanyList implementiert hat, die nur eine Liste von Mitarbeitern und Unternehmen mit bestimmten Eigenschaften enthalten könnte. Solche Klassen wären in vielen Fällen nutzlos. Was für ein Schmerz wäre es, wenn Sie beispielsweise die gesamte Funktionalität für eine CarList neu implementieren müssten. Die "Liste" ist also von Mitarbeitern, Unternehmen und PKW ABSTRAKTIERT. Die Liste an sich ist ein abstraktes Konzept, das von ihrer eigenen Klasse implementiert werden kann.

Schnittstellen, abstrakte Klassen oder Vererbung und Polymorphismus sind Werkzeuge zur Abstraktion in c #.

sie tun Abstraktion, um die Wiederverwendbarkeit zu gewährleisten.

44
Egi

Encapsulation : Daten mit Getigtern und Setters etc. verstecken.

Abstraktion : Implementierung mit abstrakten Klassen und Schnittstellen ausblenden usw.

88
Bunny

Abstraction & Encapsulation Example Bildquelle

Abstraktion: wird durch die Bilder oben links und rechts oben der Katze dargestellt. Der Chirurg und die alte Dame haben das Tier anders gestaltet (oder visualisiert). Auf dieselbe Weise würden Sie je nach den Anforderungen der Anwendung unterschiedliche Funktionen in die Cat-Klasse einbauen. Jede Katze hat eine Leber, eine Blase, ein Herz und eine Lunge, aber wenn Sie Ihre Katze nur zum "Schnurren" benötigen, werden Sie die Katze Ihrer Anwendung nach dem Muster oben links und nicht oben rechts abstrahieren.

Encapsulation: wird von der auf dem Tisch stehenden Katze dargestellt. Das ist , was jeder außerhalb der Katze die Katze als sehen sollte. Sie brauchen sich keine Sorgen zu machen, ob die tatsächliche Umsetzung der Katze oben links oder oben rechts oder sogar eine Kombination aus beiden ist.


PS: Gehen Sie here auf dieselbe Frage, um die vollständige Geschichte zu hören.

42
displayName

Ich werde versuchen, Encapsulation und Abstraction auf einfache Weise zu demonstrieren.

  • Das Einschließen von Daten und Funktionen in eine einzige Einheit ( Klasse) wird als Kapselung bezeichnet. Kapselung, die __.-Informationen zu einem Objekt enthält und verbirgt, z. B. interne Datenstrukturen und __.-Code.

Einkapselung ist -

  • Komplexität verstecken,
  • Daten und Funktion miteinander verbinden, 
  • Komplizierte Methode privat machen,
  • Instanzvariable als privat definieren,
  • Unnötige Daten und Funktionen vor dem Endbenutzer ausblenden.

Encapsulation implementiert Abstraktion.

Und Abstraktion ist - 

  • Zeigen, was nötig ist,
  • Daten müssen vom Endbenutzer abstrahieren,

Lass uns ein Beispiel sehen

Das Bild unten zeigt eine GUI von "Kundendaten, die in eine Datenbank aufgenommen werden sollen".

Customer Screen GUI

Wenn wir das Bild betrachten, können wir sagen, dass wir eine Kundenklasse brauchen.

Schritt - 1: Was braucht meine Kundenklasse?

d.h.

  • 2 Variablen zum Speichern von Kundencode und Kundenname.

  • 1 Funktion zum Hinzufügen des Kundencodes und des Kundennamens zur Datenbank.

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

Jetzt funktioniert nur die ADD-Methode hier nicht alleine.

Schritt -2: Wie funktioniert die Validierung, ADD Function?

Wir benötigen Datenbankverbindungscode und Validierungscode (zusätzliche Methoden).

     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();
    }
}

Jetzt müssen die Extra-Methoden (Validate(); CreateDBObject() [Complicated and Extra-Methode]) dem Endbenutzer nicht angezeigt werden. Der Endbenutzer muss lediglich den Kundencode, den Kundennamen und die Schaltfläche ADD sehen und kennen, mit denen der Datensatz hinzugefügt wird. Der Endbenutzer kümmert sich nicht darum, WIE er die Daten zur Datenbank hinzufügt.

Schritt -3: Privatisieren Sie die zusätzlichen und komplizierten Methoden, die keine Interaktion des Endbenutzers beinhalten.

Wenn Sie also die komplizierte und zusätzliche Methode als privat statt als öffentlich definieren (d. H. Diese Methoden ausblenden) und das obj.Validate();obj.CreateDBObject(); aus dem main in class-Programm löschen, erzielen Sie die Encapsulation.

Mit anderen Worten: Die Vereinfachung der Benutzeroberfläche für den Endbenutzer ist die Kapselung.

So sieht nun der vollständige Code wie folgt aus -

 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();
   }
}

Zusammenfassung :

Schritt -1: Was braucht meine Kundenklasse? ist Abstraktion.

Step -3: Step -3: Private Die zusätzlichen und komplizierten Methoden, bei denen die Interaktion des Endbenutzers nicht berücksichtigt wird, sind Encapsulation.

P.S. - Der obige Code ist hart und schnell. 

UPDATE: Es gibt ein Video unter diesem Link, um das Beispiel zu erklären: Was ist der Unterschied zwischen Abstraktion und Encapsulation

25
Sanchit

Ich denke, dass es etwas andere Konzepte sind, aber oft werden sie zusammen angewendet. Encapsulation ist eine Technik, um Implementierungsdetails vor dem Aufrufer zu verbergen, während Abstraktion eher eine Entwurfsphilosophie ist, bei der Objekte erstellt werden, die den bekannten Objekten/Prozessen entsprechen, um das Verständnis zu erleichtern. Die Einkapselung ist nur eine von vielen Techniken, mit denen eine Abstraktion erstellt werden kann.

Nehmen Sie zum Beispiel "Windows". Sie sind nicht wirklich Fenster im traditionellen Sinne, sie sind lediglich grafische Quadrate auf dem Bildschirm. Aber es ist nützlich, sie als Fenster zu betrachten. Das ist eine Abstraktion.

Wenn die "Windows-API" die Details verbirgt, wie Text oder Grafiken innerhalb der Grenzen eines Fensters physisch gerendert werden, handelt es sich um eine Kapselung.

9
Mike Panter

Objektorientierte Analyse und Design (OOAD) basiert tatsächlich auf vier Prinzipien. Sie sind:

  • Abstraktion: bedeutet, dass Sie nur die Merkmale einer Entität einbeziehen, die in Ihrem Entwurf erforderlich sind. Wenn also für jedes Bankkonto ein Eröffnungsdatum festgelegt ist, Ihre Bewerbung jedoch nicht das Eröffnungsdatum eines Kontos kennen muss, fügen Sie einfach nicht das Feld OpeningDate in Ihr Objekt ein. Orientiertes Design der BankAccount-Klasse. Abstraktion in OOAD hat nichts mit abstrakten Klassen in der Programmierung zu tun. Nach diesem Prinzip sind Ihre Entitäten eine Abstraktion dessen, was sie tatsächlich sind. Sie entwerfen eine Abstraktion des Bankkontos nur bis zu dem Detailgrad, den Ihre Anwendung benötigt.

  • Vererbung: ist eher ein Trick als ein tatsächliches Prinzip, das Sie davor bewahrt, diese neu zu schreiben Funktionalitäten, die Sie woanders geschrieben haben. Das Einzige ist, dass es eine Beziehung zwischen dem neuen Code, den Sie schreiben, und dem alten Code geben muss, den Sie wiederverwenden möchten. So wie Sie das Vermögen Ihrer Eltern erben , können Sie Felder und Methoden von Ihrer Elternklasse erben . Es ist also Vererbung, alles zu nehmen, was die Elternklasse hat, und dann, falls nötig, noch etwas hinzuzufügen. Suchen Sie nicht nach Vererbung in Ihrem objektorientierten Design. Vererbung wird sich präsentieren.

  • Polymorphismus: ist eine Folge der Vererbung. Das Erben einer Methode vom übergeordneten Element ist nützlich, aber die Möglichkeit, eine Methode zu ändern, wenn die Situation dies erfordert, ist Polymorphismus. Sie können eine Methode in der Unterklasse mit genau der gleichen Signatur wie in der übergeordneten Klasse implementieren, sodass beim Aufruf die Methode aus der untergeordneten Klasse ausgeführt wird. Dies ist der Polymorphismus.

  • Kapselung: bedeutet, die zugehörige Funktionalität zu bündeln und nur auf das Notwendige zuzugreifen. Dieses Prinzip ist die Grundlage für das Entwerfen von Klassen im objektorientierten Entwurf , wobei:

    • sie stellen zusammengehörige Daten und Methoden zusammen. und,
    • möglicherweise sind nicht alle Daten und Methoden öffentlich.

Eine andere vereinfachte Antwort ist hier .


Leute, die argumentieren, dass "Abstraktion von OOAD zum abstrakten Schlüsselwort von OOP führt" ... Nun, das ist einfach nicht korrekt .

Beispiel: Wenn Sie eine Universität in einer Anwendung nach objektorientierten Prinzipien entwerfen, entwerfen Sie nur eine "Abstraktion" der Universität. Auch wenn es in der Regel an fast jeder Universität einen Geldautomaten gibt, können Sie diesen Umstand möglicherweise nicht berücksichtigen, wenn er für Ihre Bewerbung nicht benötigt wird. Und jetzt, wo Sie nur eine Abstraktion der Universität entworfen haben, müssen Sie nicht mehr setzen abstract in Ihrer Klassendeklaration. Ihr abstraktes Universitätsdesign wird eine normale Klasse in Ihrer Bewerbung sein.

6
displayName

mein 2c

der Zweck der Kapselung besteht darin, Implementierungsdetails vor dem Benutzer Ihrer Klasse auszublenden, z. Wenn Sie intern eine std :: -Liste mit Elementen in Ihrer Klasse führen und dann entscheiden, dass ein std :: -Vektor effektiver ist, können Sie dies ändern, ohne dass der Benutzer sich darum kümmert. Die Art und Weise, wie Sie mit einem der beiden stl-Container interagieren, beruht auf der Abstraktion. Sowohl Liste als auch Vektor können beispielsweise mit ähnlichen Methoden (Iteratoren) auf dieselbe Weise durchlaufen werden.

4
Anders

Ein Beispiel wurde mir im Zusammenhang mit der Abstraktion immer vorgebracht; das automatische vs. manuelle Getriebe von Autos. Das Handschaltgetriebe verbirgt einige Funktionen des Gangwechsels, aber Sie müssen immer noch als Fahrer kuppeln und schalten. Das Automatikgetriebe kapselt alle Details des Gangwechsels ein, d. H. Verbirgt es vor Ihnen, und es ist daher eine höhere Abstraktion des Prozesses des Gangwechsels.

2
Lorentz Vedeler

Encapsulation: Implementierungsdetails (HINWEIS: Daten UND/ODER-Methoden) so verbergen, dass nur das zugänglich ist, was für Externe sinnvoll lesbar/beschreibbar/verwendbar ist, alles andere ist direkt "unberührbar".

Abstraktion: Dies bezieht sich manchmal spezifisch auf einen Typ, der nicht instanziiert werden kann und der eine Vorlage für andere Typen bereitstellt, die normalerweise über Unterklassen erfolgen können. Allgemeiner bezieht sich "Abstraktion" darauf, etwas weniger detailliertes, weniger spezifisches, weniger granulares herzustellen/zu haben.

Es gibt einige Ähnlichkeiten, Überschneidungen zwischen den Begriffen, aber der beste Weg, sich daran zu erinnern, ist wie folgt: Bei der Kapselung geht es eher um versteckt die Details, während sich bei der Abstraktion mehr auf generalisieren die Details bezieht.

1
Brad Thomas

Abstraktion und Verkapselung sind verwirrende Begriffe und voneinander abhängig. Nehmen wir es an einem Beispiel:

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

Beim Erstellen der Person-Klasse haben Sie die Kapselung durchgeführt, indem Sie Eigenschaften und Funktionen (Id, Name, CustomName) zusammengeschrieben haben. Sie führen eine Abstraktion durch, wenn Sie diese Klasse als Client verfügbar machen

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

Ihr Kunde kennt in dieser Funktion nichts über Id und Name. Wenn nun Ihr Client den Nachnamen wissen möchte, ohne den Funktionsaufruf zu stören. Sie kapseln ein, indem Sie der Person-Klasse eine weitere Eigenschaft hinzufügen.

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;
            }
        }

Selbst wenn Sie eine zusätzliche Eigenschaft in der Klasse hinzugefügt haben, weiß Ihr Client nicht, was Sie mit Ihrem Code gemacht haben. Hier haben Sie Abstraktion gemacht.

1
CredibleAshok

Abstraktion

In Java bedeutet Abstraktion, die Informationen vor der realen Welt zu verbergen. Es legt den Vertrag zwischen der Partei fest, um zu sagen, "was wir tun müssen, um den Dienst in Anspruch zu nehmen".

Beispiel: In der API-Entwicklung wurden der Welt nur abstrahierte Informationen des Dienstes und nicht die tatsächliche Implementierung offenbart. Eine Java-Schnittstelle kann dieses Konzept sehr gut erreichen.

Die Schnittstelle bietet einen Vertrag zwischen den Parteien, beispielsweise Hersteller und Verbraucher. Der Produzent produziert die Ware, ohne den Verbraucher darüber zu informieren, wie das Produkt hergestellt wird. Über die Schnittstelle ließ der Produzent jedoch alle Verbraucher wissen, welches Produkt gekauft werden kann. Mit Hilfe der Abstraktion kann der Produzent das Produkt an seine Verbraucher vermarkten.

Verkapselung:

Die Einkapselung ist eine Ebene der Abstraktion. Dieselbe Produktfirma versucht, Informationen von jeder anderen Produktionsgruppe abzuschirmen. Wenn beispielsweise ein Unternehmen Wein und Schokolade herstellt, hilft die Kapselung dabei, Informationen darüber zu schützen, wie die einzelnen Produkte voneinander hergestellt werden.

  1. Wenn ich ein einzelnes Paket für Wein und ein anderes für Chocolate habe und alle Klassen im Paket als Default-Zugriffsmodifizierer deklariert sind, geben wir für alle Klassen Paket-Encapsulation An.
  2. Wenn wir innerhalb eines Pakets jede Klasse (Member-Feld) als Als privat deklarieren und über eine öffentliche Methode verfügen, um auf diese Felder zuzugreifen, auf diese Weisegiving Klasse-Encapsulation auf diese Felder
0
Shaan

Ich denke so, die Einkapselung verbirgt die Art, wie etwas gemacht wird. Dies kann eine oder mehrere Aktionen sein. 

Die Abstraktion hängt mit dem "Warum" zusammen. Ich fasse es an erster Stelle ein. 

Im Grunde sage ich dem Kunden: "Sie müssen nicht viel darüber wissen, wie ich die Zahlung abwickle und den Versand berechnet, usw. Ich möchte nur, dass Sie mir sagen, dass Sie" Zur Kasse gehen "möchten, und ich werde mich um die Details kümmern . "

Auf diese Weise habe ich die Details durch Verallgemeinerung (Abstraktion) in die Checkout-Anfrage gekapselt.

Ich denke wirklich, dass Abstraktion und Verkapselung zusammengehören.

0
FrankO

Wie ich weiß, verbirgt die Kapselung Daten von Klassen in sich und macht sie nur über Setter/Getter zugänglich, wenn auf sie aus der Außenwelt zugegriffen werden muss.

Abstraktion ist das Klassendesign für sich.

Bedeutet, wie Sie Ihren Klassenbaum erstellen, welche Methoden allgemein sind, welche vererbt werden, die überschrieben werden können, welche Attribute nur auf privater Ebene oder auf geschützt sind Klassen, Abtract-Klassen, Schnittstellenimplementierung.

Die Abstraktion ist eher in der Oo-Design-Phase angesiedelt, während die Verkapselung auch in die Entwicklungsphase aufgenommen wird.

0
icbytes