Das Buch "Muster objektorientierten Designs"

BildHallo habrozhiteli! Mehr als 25 Jahre sind seit der ersten Auflage von Design Patterns vergangen. In dieser Zeit wurde das Buch des Volkes zum Kult. Überall auf der Welt wird empfohlen, es jedem vorzulesen, der das Leben mit Informationstechnologie und Programmierung verbinden möchte. Die von IT-Mitarbeitern verwendete "russische" Sprache hat sich geändert, viele englische Begriffe sind bekannt geworden, Muster sind in unser Leben eingedrungen.

Hier ist eine Jubiläumsausgabe mit einer aktualisierten Übersetzung des Buches, die für jeden Programmierer zu einem Muss geworden ist. "Muster des objektorientierten Designs" ersetzten die "Techniken des objektorientierten Designs".

Vier erstklassige Entwickler - eine vierköpfige Gruppe - machen Sie auf die Erfahrung von OOP in Form von dreiundzwanzig Mustern aufmerksam. Muster wurden angezeigt, weil Entwickler nach Möglichkeiten suchten, die Flexibilität und den Grad der Wiederverwendung ihrer Programme zu erhöhen. Die Autoren liefern nicht nur Prinzipien für die Verwendung von Entwurfsmustern, sondern systematisieren auch Informationen. Sie lernen die Rolle von Mustern in der Architektur komplexer Systeme kennen und können schnell und effizient Ihre eigenen Anwendungen erstellen, wobei alle Einschränkungen berücksichtigt werden, die bei der Entwicklung großer Projekte auftreten. Alle Vorlagen stammen aus realen Systemen und basieren auf realen Praktiken. Für jedes Muster wird C ++ - oder Smalltalk-Code angezeigt, der seine Funktionen demonstriert.

Vorwort


Das Buch beschreibt einfache und elegante Lösungen für typische Probleme, die beim objektorientierten Design auftreten.

Muster erschienen, weil viele Entwickler nach Möglichkeiten suchten, die Flexibilität und den Grad der Wiederverwendung ihrer Programme zu erhöhen. Die gefundenen Lösungen sind in einer prägnanten und leicht praktikablen Form dargestellt. Die Viererbande erklärt jedes Muster anhand eines einfachen Beispiels in einer klaren und verständlichen Sprache. Die Verwendung von Mustern bei der Entwicklung von Softwaresystemen ermöglicht es dem Designer, eine höhere Ebene der Projektentwicklung zu erreichen. Jetzt können der Architekt und der Programmierer mit bildlichen Musternamen arbeiten und in einer Sprache kommunizieren.

Somit löst das Buch zwei Probleme.

Zunächst wird die Rolle von Mustern bei der Erstellung der Architektur komplexer Systeme vorgestellt.

Zweitens können Designer auf einfache Weise ihre eigenen Anwendungen anhand der im Handbuch enthaltenen Muster entwickeln.

Was hat sich in der Ausgabe 2020 geändert?

  • Die Terminologie wurde aktualisiert (zum Beispiel hat der Begriff "Refactoring" bereits Wurzeln für die "Reorganisation" des Codes gelegt, für die Freigabe ist es "Freigabe" anstelle von "Trennung" und für das Mischen ist es "Beimischung");
  • aktualisierter Stil;
  • unnötig sperrige Wörter wurden entfernt (zum Beispiel "Spezifikation" oder "Instanziierung". Das erste kann angemessen durch "Definition" ersetzt werden, das zweite durch "Erstellen einer Instanz");
  • Das Buch heißt schließlich "Object Oriented Design Patterns".

MUSTERVORLAGENMETHODE (VORLAGENMETHODE)


Name und Klassifizierung des Musters Die

Vorlagenmethode ist das Muster des Klassenverhaltens.

Zweck Die

Template-Methode definiert die Basis des Algorithmus und ermöglicht es Unterklassen, einige Schritte des Algorithmus neu zu definieren, ohne seine Struktur als Ganzes zu ändern.

Motivation

Betrachten Sie das Anwendungsframework mit den Klassen Application und Document. Die Anwendungsklasse ist für das Öffnen vorhandener Dokumente verantwortlich, die in einem externen Format (z. B. in einer Datei) gespeichert sind. Ein Objekt der Document-Klasse repräsentiert Dokumentinformationen, nachdem sie aus einer Datei gelesen wurden.

Auf diesem Framework basierende Anwendungen können Unterklassen der Klassen Application und Document erzeugen, die bestimmte Anforderungen erfüllen.

Ein grafischer Editor definiert beispielsweise Unterklassen von DrawApplication und DrawDocument, und eine Tabelle definiert Unterklassen von SpreadsheetApplication und SpreadsheetDocument.

Bild

Die abstrakte Klasse Application definiert einen Algorithmus zum Öffnen und Lesen eines Dokuments in der OpenDocument-Operation:

void Application::OpenDocument (const char* name) {
      if (!CanOpenDocument(name)) {
          //   
          return;
      }

      Document* doc = DoCreateDocument();

      if (doc) {
          _docs->AddDocument(doc);
          AboutToOpenDocument(doc);
          doc->Open();
          doc->DoRead();
      }
}

Die OpenDocument-Operation definiert alle Schritte zum Öffnen eines Dokuments. Es prüft, ob es möglich ist, das Dokument zu öffnen, erstellt ein Objekt der Document-Klasse, fügt es dem Dokumentensatz hinzu und liest das Dokument aus der Datei.

Eine Operation des Formulars OpenDocument wird als Vorlagenmethode bezeichnet, die den Algorithmus in den Kategorien abstrakter Operationen beschreibt, die in Unterklassen ersetzt werden, um das gewünschte Verhalten zu erhalten. Unterklassen der Anwendungsklasse überprüfen, ob sie ein Dokument öffnen (CanOpenDocument) und erstellen können (DoCreateDocument). Unterklassen der Document-Klasse lesen das Dokument (DoRead). Die Vorlagenmethode definiert auch eine Operation, mit der Anwendungsunterklassen Informationen zum Abrufen eines Dokuments abrufen können (AboutToOpenDocument).

Die Template-Methode definiert einige Schritte des Algorithmus mithilfe abstrakter Operationen und erfasst deren Reihenfolge, ermöglicht jedoch die Implementierung in Unterklassen der Klassen Application und Document.

Anwendbarkeit

Grundvoraussetzungen für die Anwendung der Mustervorlagenmethode:

  • eine einmalige Verwendung der invarianten Teile des Algorithmus, während die Implementierung des sich ändernden Verhaltens im Ermessen der Unterklassen liegt;
  • die Notwendigkeit, das allen Unterklassen gemeinsame Verhalten in einer Klasse zu isolieren und zu lokalisieren, um Codeduplikationen zu vermeiden. Dies ist ein gutes Beispiel für die von William Opdyke und Ralph Johnson [ABl. 93] beschriebene Technik der „Klammerung zur Verallgemeinerung“. Zunächst werden Unterschiede im vorhandenen Code aufgedeckt, die dann auf separate Operationen übertragen werden. Letztendlich werden die verschiedenen Codefragmente durch die Vorlagenmethode ersetzt, von der aus neue Operationen aufgerufen werden.
  • Verwaltung von Unterklassenerweiterungen. Die Vorlagenmethode kann so definiert werden, dass sie an bestimmten Punkten Hooks auslöst (siehe Abschnitt Ergebnisse) und nur an diesen Punkten eine Erweiterung zulässt.

Struktur

Bild

Teilnehmer

AbstractClass (Application) - abstrakte Klasse:

  • definiert abstrakte primitive Operationen, die in bestimmten Unterklassen ersetzt werden, um die Schritte des Algorithmus zu implementieren;
  • implementiert eine Vorlagenmethode, die das Grundgerüst eines Algorithmus definiert. Die Template-Methode ruft primitive Operationen sowie Operationen auf, die in der AbstractClass-Klasse oder in anderen Objekten definiert sind.

ConcreteClass (MyApplication) - spezifische Klasse:

  • implementiert primitive Operationen, die die Schritte des Algorithmus in einer Weise ausführen, die von der Unterklasse abhängt.

Die

ConcreteClass- Beziehung setzt voraus, dass die invarianten Schritte des Algorithmus in AbstractClass ausgeführt werden.

Ergebnisse

Vorlagenmethoden sind eine der grundlegenden Techniken zur Wiederverwendung von Code. Sie spielen eine besonders wichtige Rolle in Klassenbibliotheken, da sie die Möglichkeit bieten, allgemeines Verhalten in Bibliotheksklassen hervorzuheben.

Vorlagenmethoden führen zu einer invertierten Codestruktur, die manchmal als Hollywood-Prinzip bezeichnet wird und den in diesem Filmimperium häufig verwendeten Ausdruck „Rufen Sie uns nicht an, wir rufen Sie an“ impliziert [Swe85]. In diesem Fall bedeutet dies, dass die übergeordnete Klasse Unterklassenoperationen aufruft und nicht umgekehrt.

Vorlagenmethoden rufen Operationen der folgenden Typen auf:

  • spezifische Operationen (entweder aus der ConcreteClass-Klasse oder aus den Client-Klassen);
  • spezifische Operationen aus der AbstractClass-Klasse (dh Operationen, die für alle Unterklassen nützlich sind);
  • primitive Operationen (d. h. abstrakte Operationen);
  • Fabrikmethoden (siehe Fabrikmethodenmuster (135));
  • Hook-Operationen, die Standardverhalten implementieren, das in Unterklassen erweitert werden kann. Oft führt eine solche Standardoperation nicht aus.

Es ist wichtig, dass die Vorlagenoperationen klar zwischen Hook-Operationen (die ersetzt werden können) und abstrakten Operationen (die ersetzt werden müssen) unterscheiden. Um eine abstrakte Klasse mit maximaler Effizienz wiederzuverwenden, müssen Unterklassenautoren verstehen, welche Operationen ersetzt werden sollen.

Eine Unterklasse kann das Verhalten einer Operation erweitern, indem sie ersetzt und die Operation explizit von der übergeordneten Klasse aufgerufen wird:

void DerivedClass::Operation () {
      //   DerivedClass
      ParentClass::Operation();
}

Leider ist es sehr leicht zu vergessen, dass eine geerbte Operation aufgerufen werden muss. Eine solche Operation kann in eine Boilerplate-Methode umgewandelt werden, um dem übergeordneten Element die Kontrolle darüber zu geben, wie Unterklassen sie erweitern. Die Idee ist, eine Hook-Operation über eine Vorlagenmethode in der übergeordneten Klasse aufzurufen. Dann können Unterklassen genau diesen Vorgang neu definieren:

void ParentClass::Operation () {
      //  ParentClass
      HookOperation();
}

In der übergeordneten Klasse ParentClass führt die HookOperation-Operation nichts aus:

void ParentClass::HookOperation () { }

Unterklassen überschreiben HookOperation, um ihr Verhalten zu erweitern:

void DerivedClass::HookOperation () {
   //    
}

Implementierung

Bei der Implementierung einer Mustervorlagenmethode sollten Sie die folgenden Aspekte berücksichtigen:

  • C++. , , . , . , , . , -;
  • . , . , ;
  • Namenskonvention. Sie können Vorgänge hervorheben, die ersetzt werden müssen, indem Sie ihren Namen ein Präfix hinzufügen. Im MacApp Framework für Macintosh-Anwendungen [App89] beginnen die Namen der Vorlagenmethoden beispielsweise mit dem Präfix Do: DoCreateDocument, DoRead usw.

Codebeispiel

Das folgende C ++ - Beispiel zeigt, wie eine übergeordnete Klasse ihren Unterklassen eine Invariante auferlegen kann. Ein Beispiel stammt aus der NeXT AppKit-Bibliothek [Add94]. Stellen Sie sich die View-Klasse vor, die das Zeichnen auf dem Bildschirm unterstützt, eine Art Invariante, die darin besteht, dass Unterklassen die Ansicht nur ändern können, wenn sie scharfgestellt ist. Dies erfordert, dass ein bestimmter Zeichnungskontext festgelegt wird (z. B. Farben und Schriftarten).

Sie können die Vorlagenanzeigemethode verwenden, um den Status festzulegen. Die View-Klasse definiert zwei spezifische Operationen (SetFocus und ResetFocus), mit denen der Zeichnungskontext festgelegt bzw. zurückgesetzt wird. Die View-Hook-Operation der View-Klasse führt die Zeichnung selbst aus. Display ruft SetFocus vor DoDisplay auf, um den Kontext vorzubereiten, und ResetFocus nach DoDisplay, um ihn zurückzusetzen:

void View::Display () {
      SetFocus();
      DoDisplay();
      ResetFocus();
}

Um die Invariante zu unterstützen, rufen View-Klassenclients immer Display auf, und View-Unterklassen ersetzen immer DoDisplay.

In der View-Klasse führt die DoDisplay-Operation nichts aus:

void View::DoDisplay () { }

Unterklassen überschreiben es, um ihr spezifisches Zeichenverhalten hinzuzufügen:

void MyView::DoDisplay () {
      //   
}

Bekannte Anwendungen

Vorlagenmethoden sind so grundlegend, dass sie in fast jeder abstrakten Klasse zu finden sind. Rebecca Wirfs-Brock et al. [WBWW90, WBJ90] diskutieren Vorlagenmethoden im Detail.

Verwandte Muster

Factory-Methoden (135) werden häufig von Boilerplate-Methoden aufgerufen. Im Beispiel im Abschnitt Motivation wurde die OpenDocument-Vorlagenmethode als Factory-DoCreateDocument-Methode bezeichnet.
Strategie (362): Vorlagenmethoden verwenden die Vererbung, um einen Teil des Algorithmus zu ändern. Strategien verwenden die Delegierung, um den Algorithmus als Ganzes zu ändern.

»Weitere Informationen zum Buch finden Sie auf der Website des Herausgebers.
» Inhaltsverzeichnis
» Auszug

für Khabrozhiteley 25% Rabatt auf den Gutschein - OOP

Nach Zahlung der Papierversion des Buches wird ein elektronisches Buch per E-Mail verschickt.

All Articles