Klassifikation von Mustern in der Softwareentwicklung

Muster lassen sich ebenso klassifizieren wie Entwurfsmuster, und das Buch "Pattern-Oriented Software Architecture" bietet eine gute Grundlage.

In Pocket speichern vorlesen Druckansicht 4 Kommentare lesen

(Bild: Kenneth Summers / shutterstock.com)

Lesezeit: 7 Min.
Von
  • Rainer Grimm
Inhaltsverzeichnis

In meinem letzten Artikel habe ich die Klassifizierung von Entwurfsmustern vorgestellt, die auf dem wegweisenden Buch "Design Patterns: Elements of Reusable Object-Oriented Software" basieren. Heute stelle ich eine allgemeinere Klassifizierung von Mustern vor, die auf dem zweiten wegweisenden Buch "Pattern-Oriented Software Architecture, Volume 1" beruhen.

Die Klassifizierung in meinem letzten Artikel "Klassifizierung von Design Patterns in der Softwareentwicklung" bezog sich auf Entwurfsmuster, aber in diesem Artikel "Klassifizierung von Mustern" geht es um Muster. Das ist Absicht, denn die Klassifizierung von "Pattern-Oriented Software Architecture, Volume 1" (kurz POSA 1) ist allgemeiner als die von "Design Patterns: Elements of Reusable Object-Oriented Software". Um es kurz zu machen, enthält die heutige Klassifizierung die letzte.

Hier ist das große Bild der Muster, die in POSA 1 vorgestellt werden.

POSA 1 verwendet zwei Arten der Klassifizierung. Es klassifiziert die Muster nach ihrer strukturellen Kategorie und nach ihrer Problemkategorie. Bevor ich auf die beiden Klassifizierungen eingehe, möchte ich ein paar Worte zu den fettgedruckten Mustern in der Tabelle schreiben, auf die ich allesamt eingehen werde.

Modernes C++ – Rainer Grimm

Rainer Grimm ist seit vielen Jahren als Softwarearchitekt, Team- und Schulungsleiter tätig. Er schreibt gerne Artikel zu den Programmiersprachen C++, Python und Haskell, spricht aber auch gerne und häufig auf Fachkonferenzen. Auf seinem Blog Modernes C++ beschäftigt er sich intensiv mit seiner Leidenschaft C++.

Die Entwurfsmuster Proxy, Publish-Subscriber und Counted Pointer sind besonders. Proxy ist bereits Bestandteil des Buches "Design Patterns: Elements of Reusable Object-Oriented Software" und Publish-Subscriber ist dem Observer-Muster sehr ähnlich, das ebenfalls in dem bereits erwähnten Buch enthalten ist. Außerdem sollte man das Counter Pointer Idiom kennen und verwenden. In C++11 nennen wir es std::shared_ptr.

Die strukturelle Kategorisierung ist eine Kategorisierung nach ihrem Umfang und ihrer Abstraktion:

  • Architekturmuster beschreiben die grundlegende Struktur des gesamten Softwaresystems. Sie basieren oft auf Entwurfsmustern.
  • Entwurfsmuster definieren das Zusammenspiel der Komponenten und haben ihren Schwerpunkt auf Subsystemen.
  • Ein Idiom ist eine Implementierung einer Architektur oder eines Entwurfsmusters in einer konkreten Programmiersprache. Das beliebte Idiom in C++ ist Resource Acquisition Is Initialization (RAII). Container, Smart Pointer und Locks setzen dies um.

Ich möchte meine Gedanken über Architekturmuster, Entwurfsmuster und Idiome gerne nochmals auf den Punkt bringen:

  • Die Strukturkategorien gehen von abstrakt bis konkret. Idiome sind die konkretesten.
  • Sie wirken auf der Makroebene (Architekturmuster), der Mikroebene (Designmuster) und der Programmiersprache (Idiome).
  • Architekturmuster haben das System, Entwurfsmuster die Subsysteme und Idiome die Programmiersprache im Blick.

Schauen wir uns die verschiedenen Problemkategorien an.

In "Pattern-Oriented Software Architecture, Volume 1" gibt es zehn verschiedene Problemkategorien. Ich werde sie und ihre Muster in kompakter Form vorstellen, bevor ich in den nächsten Artikeln in einige von ihnen tiefer eintauche.

  • From Mud to Structure bietet eine kontrollierte Zerlegung einer Gesamtsystemaufgabe in kooperierende Teilsysteme an.
  • Layers: Zerlege eine Aufgabe in Schichten. Jede Schicht hat eine bestimmte Verantwortung und erbringt einen Dienst für eine höhere Schicht.
  • Pipes and Filters: Decompose a task that performs complex processing into a series of separate elements that can be reused. This can improve performance, scalability, and reusability by allowing task elements that perform the processing to be deployed and scaled independently (https://docs.microsoft.com/en-us/azure/architecture/patterns/pipes-and-filters)
  • Blackboard: Mehrere spezialisierte Subsysteme fügen ihr Wissen zusammen, um eine mögliche Teillösung zu erstellen. Sie wird für Probleme verwendet, für die keine deterministische Lösung bekannt ist.
  • Distributed Systems baut Systeme, deren Komponenten sich in verschiedenen Prozessen oder Adressräumen befinden.
  • Broker: Strukturiert verteilte Softwaresysteme, die mit entfernten Dienstaufrufen interagieren. Er ist für die Koordination der Kommunikation, ihrer Ergebnisse und Ausnahmen zuständig.
  • Interactive Systems baut ein System mit einer Mensch-Computer-Interaktion.
  • Model-View-Controller (MVC): Unterteilt die Programmlogik einer Benutzeroberfläche in die einzelnen Komponenten Model, View und Controller. Das Model verwaltet die Daten und Regeln der Anwendung. Die View stellt die Daten dar, und der Controller interagiert mit dem Benutzer.
  • Presentation-Abstraction-Controller (PAC): ist dem MVC ähnlich. Im Gegensatz zum MVC hat das PAC eine hierarchische Struktur von Agenten, wobei jeder Agent aus einem Präsentations-, Abstraktions- und Kontrollteil besteht.
  • Adaptable Systems macht eine Anwendung erweiterbar und anpassbar an neue Anforderungen.
  • Mikrokernel: Trennt einen minimalen Funktionskern von der erweiterten Funktionalität.
  • Reflection: Teilt ein System in zwei Teile: eine Metaebene und eine Basisebene. Die Metaebene unterstützt die Systemeigenschaften und macht es selbstreflexiv. Die Basisebene umfasst die Anwendungslogik.
  • Structural Decomposition zerlegt eines Systems in Subsysteme und komplexe Komponenten, in geeignet kooperierende Komponenten.
  • Whole-Part: Baut eine Aggregation von Komponenten, um aus den Teilen ein Ganzes zu machen. Bietet eine gemeinsame Schnittstelle für die Teile an. Dieses Entwurfsmuster ist dem Composite-Pattern aus dem Buch "Design Patterns: Elements of Reusable Object-Oriented Software".

arbeitet mit mehreren Komponenten zusammen, um einen komplexen Dienst anzubieten.

  • Master-Slave: Der Master verteilt seine Arbeit an seine Slaves und sammelt die Ergebnisse von ihnen ein.
  • Access Control schützt und kontrolliert den Zugang zu Diensten und Komponenten:
  • Proxy: Es handelt sich um einen Wrapper, der vom Client aufgerufen wird, um auf das eigentliche Objekt zuzugreifen. Ein Proxy fügt normalerweise zusätzliche Logik wie Caching, Sicherheit oder Verschlüsselung hinzu. Diese zusätzliche Logik wird vor dem Client verborgen.
  • Management verwaltet eine homogene Menge von Objekten, Diensten und Komponenten in ihrer Gesamtheit.
  • Command Processor: Verwandelt Befehle in Objekte, sodass ihre Ausführung geplant, gespeichert oder später rückgängig gemacht werden kann.
  • View Handler: ...helps to manage all views that a software system provides. A view handler component allows clients to open, manipulate and dispose of views. It also coordinates dependencies between views and organizes their update. ([Pattern-Oriented Software Architecture, Volume 1)
  • Communication Organisiert die Kommunikation zwischen den Komponenten.
  • Forwarder-Receiver: Provides transparent interprocess communication for software systems with a peer-to-peer interaction model. It introduces forwarders and receivers to decouple peers from the underlying communication mechanisms. (Pattern-Oriented Software Architecture, Volume 1)
  • Client-Dispatcher-Server: Führt den Dispatcher als Schicht zwischen Clients und Servern ein. Der Dispatcher sorgt für Transparenz zwischen den Clients und den Servern.
  • Publish-Subscriber: Ermöglicht es dem Publisher, alle Subscriber automatisch zu benachrichtigen. Dieses Entwurfsmuster ist dem Observer Desgn Pattern aus dem Buch "Design Patterns: Elements of Reusable Object-Oriented Software".

Resource Managment

hilft bei der Verwaltung gemeinsam genutzter Komponenten und Objekte.

  • Counted Pointer: Führt einen Referenzzähler für dynamisch zugewiesene gemeinsame Objekte ein. std::shared_ptr ist das prominente Beispiel in C++.

Mit diesem Artikel beende ich meine Einführung in Patterns. In meinem nächsten Artikel stelle ich die Struktur eines Design Patterns auf der Grundlage des Buches "Design Patterns: Elements of Reusable Object-Oriented Software" vor. (rme)