1.1 Einführung in Muster

Wie bereits erwähnt, beginnt ein Programmierer mit der Arbeit an einem Programm, indem er sein Modell entwirft: das Zusammenstellen einer Liste von Entitäten, mit denen das Programm arbeiten wird. Und je mehr Entitäten das Programm enthält, desto komplexer ist das Programm.

Um die Komplexität des Programms zu reduzieren, versuchen sie daher, die Interaktionen von Objekten zu standardisieren. Und hier helfen Entwurfsmuster oder Entwurfsmuster dem Programmierer sehr . Aus dem englischen Designmuster .

Wichtig! Im Russischen bedeutet das Wort Design meist Grafikdesign, im Englischen ist dies nicht der Fall. Das englische Wort „design“ ähnelt in seiner Bedeutung eher dem Wort „design“ und/oder „device“. Das Design eines Motors ist beispielsweise nicht auf sein Aussehen, sondern auf seinen inneren Aufbau zurückzuführen.

Daher ist ein Entwurfsmuster genau ein Entwurfsmuster/Muster. Ich empfehle Ihnen, das Wort Design im Sinne von „Aussehen“ ganz nicht mehr zu verwenden. Sie sind der zukünftige Softwareentwickler, und für Sie ist Design genau Design.

Was ist also dieses Designmuster? Zunächst einmal ist ein Entwurfsmuster eine Standardlösung für ein Standardproblem . Eine gute, effektive und bewährte Lösung.

Nehmen wir an, Sie wurden gebeten, ein Fahrrad zu entwerfen. Sie können es mit zwei, drei oder sogar fünf Rädern machen. Das war übrigens auch so, in den Anfängen des Designs. Der bewährte Ansatz besteht jedoch aus zwei Rädern. Aber der derzeit offensichtliche Ansatz war mit Schmerzen und Fehlern verbunden:

Normalerweise ist eine Vorlage keine vollständige Lösung, die direkt in Code umgewandelt werden kann, sondern lediglich ein Beispiel für eine gute Lösung eines Problems, das in verschiedenen Situationen verwendet werden kann.

Objektorientierte Muster zeigen Beziehungen und Interaktionen zwischen Klassen oder Objekten , ohne anzugeben, welche endgültigen Klassen oder Anwendungsobjekte verwendet werden.

1.2 Geschichte der Designmuster

Bereits in den 70er Jahren standen Programmierer vor der Notwendigkeit, große Programme zu entwickeln, an denen ganze Entwicklungsteams arbeiten mussten. Es wurden verschiedene Methoden der Arbeitsorganisation ausprobiert, aber die Bauindustrie hatte den größten Einfluss auf die Entwicklung.

Um die Arbeit einer großen Gruppe von Menschen zu organisieren, wurden Praktiken und Ansätze aus der Baubranche genutzt. Von dort kamen übrigens Begriffe wie Assembly (Build), Software Developer (Builder) und das Konzept der Architektur in die Programmierung.

Und wie Sie schon ahnen können, stammt die Idee des Designmusters auch aus der Baubranche. Das Konzept der Muster wurde erstmals von Christopher Alexander in The Pattern Language beschrieben. Städte. Gebäude. Konstruktion". In diesem Buch wurde eine spezielle Sprache, Muster, verwendet, um die Prozesse der Stadtgestaltung zu beschreiben.

Muster im Bauwesen beschrieben typische, bewährte Entscheidungen: Wie hoch sollten Fenster sein, wie viele Stockwerke sollte das Gebäude haben, wie viel Fläche im Mikrobezirk sollte für Bäume und Rasenflächen reserviert werden.

Daher ist es nicht verwunderlich, dass 1994 das Buch „Techniques of Object-Oriented Design. Design Patterns“, das 23 Muster umfasst, die verschiedene Probleme des objektorientierten Designs lösen.

Das Buch wurde von vier Autoren geschrieben: Erich Gamma, Richard Helm, Ralph Johnson und John Vlissides. Der Titel des Buches war zu lang, als dass sich irgendjemand daran erinnern könnte. Deshalb nannten es bald alle „Buch der Viererbande“, also „Buch einer Viererbande“ und dann sogar „GoF-Buch“.

Und seitdem wurden weitere Designmuster entdeckt. Der „Muster“-Ansatz hat sich in allen Bereichen der Programmierung durchgesetzt, sodass man mittlerweile auch außerhalb des Objektdesigns alle möglichen Muster finden kann.

Wichtig! Muster sind keine superoriginellen Lösungen, sondern im Gegenteil häufig anzutreffende, typische Lösungen für das gleiche Problem. Gute bewährte Lösungen.

1.3 Liste der Muster

Viele Programmierer haben in ihrem ganzen Leben kein einziges Muster erlernt, was sie jedoch nicht davon abhält, diese zu verwenden. Wie wir bereits sagten, sind Muster gute, bewährte Lösungen, und wenn der Programmierer kein Dummkopf ist, dann findet er mit Erfahrung selbst solche Lösungen.

Aber warum durch Dutzende von Versuchen und Irrtümern zu optimalen Lösungen kommen, wenn es Menschen gibt, die diesen Weg bereits gegangen sind und Bücher mit der Quintessenz ihrer Erfahrung und Lebensweisheit geschrieben haben?

Man kann einen Nagel mit einem Schraubenschlüssel einschlagen, aber warum? Wenn Sie sich anstrengen, können Sie sogar eine Bohrmaschine verwenden. Aber gerade der gute und bewusste Umgang mit dem Instrument unterscheidet einen Profi vom Amateur. Und der Profi weiß, dass darin überhaupt nicht das Hauptmerkmal der Bohrmaschine liegt. Warum müssen Sie also Muster kennen?

  • Bewährte Lösungen. Sie verbringen weniger Zeit damit, Standardlösungen zu verwenden, anstatt das Rad neu zu erfinden. Manche Entscheidungen könnten Sie selbst treffen, aber viele könnten eine Entdeckung für Sie sein.
  • Code-Standardisierung. Durch die Verwendung typischer einheitlicher Lösungen machen Sie beim Entwerfen weniger Fehleinschätzungen, da alle darin verborgenen Probleme längst erkannt wurden.
  • Allgemeines Programmierwörterbuch. Sie sagen den Namen des Musters, anstatt anderen Programmierern eine Stunde lang zu erklären, was für ein cooles Design Sie sich ausgedacht haben und welche Klassen dafür benötigt werden.

Was sind die Muster?

Muster unterscheiden sich im Grad der Komplexität, Detailliertheit und Abdeckung des entworfenen Systems. In Analogie zum Bau können Sie die Sicherheit einer Kreuzung erhöhen, indem Sie eine Ampel errichten, oder Sie können die Kreuzung durch ein ganzes Autokreuz mit Unterführungen ersetzen.

Die einfachsten und einfachsten Muster sind Redewendungen. Sie sind nicht universell, da sie nur im Rahmen einer Programmiersprache anwendbar sind.

Am vielseitigsten sind Architekturmuster, die in nahezu jeder Sprache implementiert werden können. Sie werden für die Gestaltung des gesamten Programms und nicht seiner einzelnen Elemente benötigt.

Hauptsache aber, die Muster unterscheiden sich im Zweck. Die Muster, die wir kennenlernen werden, lassen sich in drei Hauptgruppen einteilen:

  • Erstellungsmuster sorgen für die flexible Erstellung von Objekten, ohne unnötige Abhängigkeiten in das Programm einzuführen.
  • Strukturmuster zeigen unterschiedliche Möglichkeiten, Beziehungen zwischen Objekten aufzubauen.
  • Verhaltensmuster sorgen für eine effiziente Kommunikation zwischen Objekten.

1.4 Einführung in UML

Schauen wir uns zunächst die gleichen 23 Muster an, die im Buch „Gang of Four“ beschrieben wurden. Sowohl die Muster selbst als auch ihre Namen sind selbst einem unerfahrenen Programmierer vertraut. Ich werde sie Ihnen vorstellen, aber ich empfehle dringend, genau dieses Buch über Muster zu lesen.

Entwurfsmuster sind nicht an eine bestimmte Programmiersprache gebunden, daher wird zu ihrer Beschreibung meist die UML verwendet. Vor 20 Jahren war es sehr beliebt, aber auch heute noch wird es manchmal verwendet. Übrigens ist die Beschreibung von Mustern genau der Ort, an dem die Verwendung von UML der Standard ist.

Mit UML können Sie Beziehungen zwischen verschiedenen Entitäten beschreiben. In unserem Fall sind das Objekte und Klassen.

Beziehungen zwischen Klassen werden durch vier Arten von Pfeilen beschrieben:

Zusammensetzung (Zusammensetzung) - eine Unterart der Aggregation, in der „Teile“ nicht getrennt vom „Ganzen“ existieren können.
Aggregation – beschreibt die Beziehung „Teil“ – „Ganzes“, bei der der „Teil“ getrennt vom „Ganzen“ existieren kann. Die Raute wird von der „ganzen“ Seite angezeigt.
Abhängigkeit – eine Änderung in einer Entität (unabhängig) kann den Zustand oder das Verhalten einer anderen Entität (abhängig) beeinflussen. Auf der Seite des Pfeils wird eine unabhängige Entität angezeigt.
Verallgemeinerung – die Beziehung der Vererbung oder Implementierung einer Schnittstelle. Auf der Seite des Pfeils befindet sich die Superklasse oder Schnittstelle.

Tatsächlich ist hier alles sehr einfach. Der letzte Pfeil bedeutet tatsächlich, dass eine Klasse von einer anderen Klasse geerbt wird. Und der erste und zweite Pfeil bedeuten, dass ein Objekt einen Link zum zweiten Objekt speichert. Und das ist alles.

Wenn die Verbindungsraute schwarz ist, ist die Verbindung schwach: Objekte können ohne einander existieren. Wenn die Raute weiß ist, sind die Objekte eng miteinander verbunden, beispielsweise eine Klasse HttpRequestund ihre untergeordnete Klasse HttpRequest.Builder.

1.5 Liste der Muster

Musterarten werden durch unterschiedliche Farben und Buchstaben gekennzeichnet:

B- verhaltensbezogen (verhaltensbezogen);

C- Generieren (kreativ);

S- strukturell (strukturell).

Und zum Schluss noch eine Liste von 23 Designmustern:

C- Abstrakte Fabrik

S- Adapter

S- Brücke

C- Baumeister

B- Verantwortungskette

B- Team

S- Linker

S- Dekorateur

S- Fassade

C- Fabrikmethode

S- opportunistisch

B- Dolmetscher

B- Iterator

B- Vermittler

B- Der Torwart

C- Prototyp

S- Stellvertreter

B– Beobachter

C– Einzelgänger

B- Zustand

B- Strategie

B— Vorlagenmethode

B- Besucher