Ein brillantes Beispiel für eine effektive Kapselung durch Informationsverbergung?

8

" Abstraktion und Kapselung sind komplementäre Konzepte: Abstraktion konzentriert sich auf das beobachtbare Verhalten eines Objekts ... Kapselung konzentriert sich auf die Implementierung, die dies verursacht Verhalten ... Die Kapselung wird meistens durch das Verstecken von Informationen erreicht, bei dem alle Geheimnisse des Objekts versteckt werden, die nicht zu seinen wesentlichen Eigenschaften beitragen. " - Grady Booch in objektorientierter Analyse und Design

Können Sie mir einige überzeugend überzeugende Beispiele für die Vorteile der Kapselung durch Ausblenden von Informationen zeigen?

    
Roberto Russo 11.03.2009, 18:15
quelle

5 Antworten

20

Das Beispiel in meiner ersten OO-Klasse:

Stellen Sie sich einen Medienplayer vor. Es abstrahiert die Konzepte des Abspielens, Pausierens, Schnellvorlaufs usw. Als Benutzer können Sie damit das Gerät bedienen.

Ihr Videorecorder hat diese Schnittstelle implementiert und versteckte oder gekapselte Details der mechanischen Laufwerke und Bänder.

Wenn eine neue Implementierung eines Media Players eintrifft (z. B. ein DVD-Player, der Discs anstelle von Bändern verwendet), kann er die Implementierung gekapselt im Media Player ersetzen Benutzer können es weiterhin genauso verwenden, wie sie es mit ihrem Videorekorder getan haben (gleiche Operationen wie Wiedergabe, Pause, usw.).

Dies ist das Konzept von Verbergen von Informationen durch Abstraktion . Es ermöglicht eine Änderung der Implementierungsdetails, ohne dass die Benutzer eine Kopplung von Code kennen und fördern müssen.

>     
Ben S 11.03.2009, 18:23
quelle
9

Die * nix-Abstraktion von Zeichenströmen (Plattendateien, Pipes, Sockets, ttys usw.) in einer einzigen Entität (das "alles ist eine Datei") ermöglicht eine breite Palette von Werkzeugen, die auf eine große Bandbreite angewendet werden können von Datenquellen / Senken in einer Weise, die ohne die Kapselung einfach nicht möglich wäre.

Ebenso das Konzept von Streams in verschiedenen Sprachen, abstrahiert über Listen, Arrays, Dateien, etc.

Auch Konzepte wie Zahlen (abstrahieren über ganze Zahlen, ein halbes Dutzend Arten von Gleitkommazahlen, Rationales usw.) stellen sich vor, was für ein Albtraum dies wäre, wenn höherer Code dem Mantissaformat usw. gegeben würde und auf sich selbst gestellt wäre .

    
MarkusQ 11.03.2009 18:21
quelle
2

Ich weiß, dass es bereits eine akzeptierte Antwort gibt, aber ich wollte noch eine mehr da draußen: OpenGL / DirectX

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

Die Kartenanbieter sind diejenigen, die die Implementierung (Treiber) für eine bestimmte Karte bereitstellen, die in vielen Fällen sehr hardwarespezifisch ist, aber Sie als Benutzer müssen sich nicht darum kümmern, dass ein Benutzer ein GeForce-ABC und das andere a ausführt 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, die vom ersten Tag an nicht mehr zu verwalten wäre. Ein weiterer großer Vorteil dieses Ansatzes ist, dass Nvidia / ATI ein neuere, effizientere Version ihrer Treiber und Sie automatisch profitieren ohne Anstrengung von Ihrer Seite.

Dasselbe 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 anschaut, wird schnell klar, dass Computer ohne irgendeine Form von Verkapselung / Abstraktion, wie wir sie heute kennen, überhaupt nicht funktionieren würden. Ist das brilliant genug für dich?

    
Toji 18.01.2010 22:48
quelle
0

Fast jede Java-, C # - und C ++ - Codebasis in 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.

    
David Norman 11.03.2009 18:21
quelle
0

Was? Sie sind 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 festzustellen, welcher Code eine Variable modifiziert hat.

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

    
John Saunders 11.03.2009 18:19
quelle