8

"Abstraktion und Verkapselung komplementäre Konzepte sind: Abstraktion auf dem beobachtbaren Verhalten eines Objekts fokussiert ... Verkapselung auf die Umsetzung konzentriert, die zu diesem Verhalten gibt ... Verkapselung wird am häufigsten durch Informationen erreicht versteckt, das ist der Prozess des Versteckens aller Geheimnisse des Objekts, die nicht zu seinen wesentlichen Eigenschaften beitragen. " - Grady Booch in Object Oriented Analysis and DesignEin brillantes Beispiel für effektive Kapselung durch Informationsverbergung?

Können Sie mir zeigen einige stark überzeugende Beispiele für die Vorteile der Verkapselung durch Information Hiding?

Antwort

20

Das in meiner ersten OO-Klasse gegeben Beispiel:

einen Media-Player vorstellen. Es Abstracts die Konzepte des Abspielens, Pausieren, Vorspulen, etc. Als Benutzer können Sie dies verwenden, um das Gerät zu betreiben.

Ihr VCR implementiert diese Schnittstelle und versteckte oder die Details der mechanischen Antriebe und Bänder gekapselt.

Wenn eine neue Implementierung ein Media-Player kommt (zum Beispiel eines DVD-Player, die Scheiben statt Bänder verwenden) kann die Umsetzung ersetzen in dem Media-Player gekapselt und Benutzern weiter, es zu benutzen, so wie sie tat mit ihrem VCR (gleiche Operationen wie Play, Pause, etc ...).

Dies ist das Konzept von Informationen ausblenden bis Abstraktion. Es ermöglicht die Änderung von Implementierungsdetails, ohne dass die Benutzer den Code coupling kennen und fördern müssen.

0

Was? Du bist noch nicht überzeugt?

Es ist einfacher, das Gegenteil zu zeigen. Wir haben Code geschrieben, der keine Kontrolle darüber hatte, wer auf Details seiner Implementierung zugreifen konnte. Das machte es manchmal fast unmöglich zu bestimmen, welcher Code eine Variable modifiziert hat.

Auch können Sie nicht wirklich etwas abstrahieren, wenn jedes Stück Code in der Welt möglicherweise von der Implementierung bestimmter konkreter Klassen abhängig gewesen wäre.

9

Die * nix-Abstraktion von Zeichendatenströmen (Festplattendateien, Pipes, Sockets, ttys usw.) in einer einzigen Entität (das "alles ist eine Datei") ermöglicht eine breite Palette von Werkzeugen für eine breite Anwendung Palette von Datenquellen/Senken in einer Weise, die ohne die Kapselung einfach nicht möglich wäre.

Ebenso das Konzept der Ströme in verschiedenen Sprachen, abstrahiert über Listen, Arrays, Dateien usw.

Auch Begriffe wie Zahlen (ganze Zahlen abstrahieren über ein halbes Dutzend Arten von Schwimmern, rationals, etc.) Stellen Sie sich vor, was für ein Alptraum das wäre, wenn Code höherer Ebene das Mantissaformat und so weiter erhalten würde, um sich selbst zu überlassen.

0

Fast jede Java-, C# - und C++ - Codebasis der Welt hat Informationen versteckt: Es ist so einfach wie die privaten: Abschnitte der Klassen.

Die Außenwelt kann die privaten Mitglieder nicht sehen, daher kann ein Entwickler sie ändern, ohne sich darum kümmern zu müssen, dass der restliche Code nicht kompiliert wird.

+0

Ich weiß nicht, dass ich so weit gehen würde zu sagen "ohne sich darum kümmern zu müssen, dass der Rest des Codes nicht kompiliert wird". Sie können kompilieren, während Sie nur private Mitglieder ändern. Der Vorteil liegt eher darin, die Interna einer Klasse komplett neu schreiben zu können, solange Sie die externe Schnittstelle nicht ändern. Dies ist ideal für bestimmte Arten von Optimierungen. – Toji

2

ich weiß, dass es bereits eine akzeptierte Antwort, aber ich wollte es noch eine werfen:

OpenGL/DirectX

Keines dieser APIs sind vollständige Implementierungen (obwohl DirectX sicherlich ein bisschen kopflastig in dieser Hinsicht ist), sondern generische Methoden zur Übertragung von Renderbefehlen an eine Grafikkarte.

Die Kartenanbieter sind diejenigen, die die Implementierung (Treiber) für eine bestimmte Karte bieten, die in vielen Fällen sehr Hardware-spezifisch ist, aber Sie als Benutzer nie kümmern, dass ein Benutzer ein GeForce ABC und das andere ausführt eine Radeon XYZ, weil die genaue Implementierung hinter der High-Level-API versteckt ist. Wäre es nicht, müssten Sie einen Code-Pfad in Ihren Spielen für jede Karte auf dem Markt haben, die Sie unterstützen wollten, was vom ersten Tag an nicht mehr zu verwalten wäre. Ein weiterer großer Pluspunkt bei diesem Ansatz ist, dass Nvidia/ATI ein neuere, effizientere Version ihrer Treiber und Sie profitieren automatisch ohne Aufwand von Ihrer Seite.

Das gleiche Prinzip gilt für Sound, Netzwerk, Maus, Tastatur ... im Grunde jede Komponente Ihres Computers. Unabhängig davon, ob die Kapselung auf der Hardwareebene oder in einem Softwaretreiber erfolgt, werden irgendwann alle Geräteeigenschaften ausgeblendet, damit Sie jede Tastatur behandeln können, zum Beispiel nur eine Tastatur und keine Microsoft Ergonomic Media Explorer Deluxe Version 2

Wenn man es so betrachtet, wird schnell klar, dass ohne irgendeine Art von Verkapselung/Abstraktion Computer, wie wir sie heute kennen, einfach überhaupt nicht funktionieren würden. Ist das brilliant genug für dich?