Pipeline Pattern - Eine Einführung mit Beispiel

Pipeline Pattern - Eine Einführung mit Beispiel

26. Aug. 2024 | Gregor Koletzki | 3 Min. Lesezeit

Das Pipeline Pattern ist ein Entwurfsmuster, das häufig verwendet wird, um eine Serie von Verarbeitungsschritten zu organisieren, die nacheinander auf eine Eingabe angewendet werden. Es eignet sich besonders gut für Szenarien, in denen eine Kette von Operationen auf Daten ausgeführt werden muss. Jeder Schritt in der Pipeline führt eine bestimmte Operation durch und gibt das Ergebnis an den nächsten Schritt weiter.

In diesem Artikel erkläre ich das Pipeline Pattern und zeige, wie es in C# implementiert werden kann.

Motivation

Das Pipeline Pattern erleichtert es, Prozesse modular zu gestalten, sodass sie leicht erweitert, wiederverwendet und gewartet werden können. Anstatt eine große Methode zu schreiben, die alle Schritte der Verarbeitung umfasst, wird jeder Schritt als eigenständige Komponente dargestellt. Dies verbessert die Lesbarkeit und Testbarkeit des Codes.

Beispiel: Implementierung des Pipeline Patterns in C#

Betrachten wir ein einfaches Beispiel. Angenommen, wir möchten eine Pipeline erstellen, die eine Zeichenkette verarbeitet. Die Pipeline soll folgende Schritte umfassen:

  1. Trimmen: Leerzeichen am Anfang und Ende der Zeichenkette entfernen.
  2. Großschreibung: Alle Zeichen in Großbuchstaben umwandeln.
  3. Sonderzeichen entfernen: Alle Sonderzeichen aus der Zeichenkette entfernen.

Schritt 1: Definition der Pipeline-Komponenten Zuerst definieren wir eine Schnittstelle IPipelineStep, die von jedem Schritt implementiert wird.

public interface IPipelineStep<T>
{
    T Process(T input);
}

Diese Schnittstelle enthält eine Methode Process, die den Eingabetyp (in diesem Fall T) akzeptiert und denselben Typ zurückgibt. Dies ermöglicht die Verarbeitung und Weitergabe der Daten an den nächsten Schritt in der Pipeline.

Schritt 2: Implementierung der Verarbeitungsschritte Jetzt implementieren wir die Verarbeitungsschritte als Klassen, die die Schnittstelle IPipelineStep implementieren.

public class TrimStep : IPipelineStep<string>
{
    public string Process(string input)
    {
        return input.Trim();
    }
}

public class ToUpperStep : IPipelineStep<string>
{
    public string Process(string input)
    {
        return input.ToUpper();
    }
}

public class RemoveSpecialCharactersStep : IPipelineStep<string>
{
    public string Process(string input)
    {
        return new string(input.Where(c => char.IsLetterOrDigit(c) || char.IsWhiteSpace(c)).ToArray());
    }
}

Jede dieser Klassen verarbeitet die Zeichenkette und gibt das Ergebnis für den nächsten Schritt zurück.

Schritt 3: Aufbau der Pipeline Nun erstellen wir die Pipeline selbst. Eine einfache Möglichkeit besteht darin, eine Klasse zu erstellen, die alle Schritte in der richtigen Reihenfolge ausführt.

public class Pipeline<T>
{
    private readonly List<IPipelineStep<T>> _steps = new List<IPipelineStep<T>>();

    public Pipeline<T> AddStep(IPipelineStep<T> step)
    {
        _steps.Add(step);
        return this; // Ermöglicht method chaining
    }

    public T Execute(T input)
    {
        T result = input;
        foreach (var step in _steps)
        {
            result = step.Process(result);
        }
        return result;
    }
}

Die Klasse Pipeline verwaltet eine Liste von Verarbeitungsschritten (_steps). Die Methode AddStep fügt neue Schritte zur Pipeline hinzu. Mit Execute wird die Eingabe durch alle Schritte der Pipeline verarbeitet.

Schritt 4: Nutzung der Pipeline Jetzt können wir die Pipeline verwenden, um eine Zeichenkette zu verarbeiten.

class Program
{
    static void Main(string[] args)
    {
        var pipeline = new Pipeline<string>()
            .AddStep(new TrimStep())
            .AddStep(new ToUpperStep())
            .AddStep(new RemoveSpecialCharactersStep());

        string input = "   Hallo, Welt!   ";
        string result = pipeline.Execute(input);

        Console.WriteLine(result);  // Ausgabe: "HALLO WELT"
    }
}

In diesem Beispiel wird die Zeichenkette " Hallo, Welt! " durch die Pipeline verarbeitet. Zuerst werden die überflüssigen Leerzeichen entfernt, dann wird die Zeichenkette in Großbuchstaben umgewandelt und schließlich werden die Sonderzeichen entfernt. Das Endergebnis ist "HALLO WELT".

Vorteile des Pipeline Patterns

Das Pipeline Pattern bietet einige wichtige Vorteile:

  • Modularität: Jeder Schritt der Verarbeitung ist eine separate Komponente, die unabhängig implementiert und getestet werden kann.
  • Erweiterbarkeit: Neue Schritte können leicht zur Pipeline hinzugefügt werden, ohne den bestehenden Code zu verändern.
  • Wiederverwendbarkeit: Verarbeitungsschritte können in verschiedenen Pipelines wiederverwendet werden.
  • Lesbarkeit: Der Code ist übersichtlicher, da die Logik in kleinere, verständlichere Einheiten zerlegt wird.

Fazit

Das Pipeline Pattern ist ein einfaches, aber leistungsstarkes Entwurfsmuster, das Ihnen hilft, komplexe Verarbeitungsketten zu organisieren und zu modularisieren. In unserem Beispiel haben wir eine Pipeline zur Zeichenkettenverarbeitung erstellt, die einfach erweitert und angepasst werden kann. Sie können das gleiche Muster auf eine Vielzahl von Anwendungsfällen anwenden, z.B. Datenvalidierung, Bildverarbeitung oder Geschäftslogik in größeren Anwendungen.

Mit dieser modularen Herangehensweise wird Ihr Code robuster, wartbarer und leichter verständlich.

Kategorien

Kontaktieren Sie uns:

Harksheider Weg 60H,
25451 Quickborn
+49 1520 40 73 253
info@gk-itsolutions.de

Schnellzugriff:

Folgt uns auf: