Konzepte und Begriffe (funktionale Transformation)

Aktualisiert: November 2007

Dieses Thema führt Sie in die Konzepte und Begriffe ein, die im Zusammenhang mit reinen funktionalen Transformationen verwendet werden. Bei Verwendung der funktionalen Transformation zum Transformieren von Daten erhalten Sie Code, der häufig schneller programmiert werden kann, ausdrucksstärker ist und einfacher von Fehlern bereinigt und verwaltet werden kann als Code, der auf die herkömmliche imperative Methode zurückzuführen ist.

Beachten Sie, dass die Themen in diesem Abschnitt keine vollständige Erläuterung der funktionalen Programmierung darstellen. In diesen Themen werden vielmehr einige der Funktionen zur funktionalen Programmierung beschrieben, die das Transformieren von XML von einer Form in eine andere erleichtern.

Was ist die reine funktionale Transformation?

Bei der reinen funktionalen Transformation definiert ein Satz von Funktionen, die sogenannten reinen Funktionen, wie ein Satz strukturierter Daten aus ihrer Originalform in eine andere Form transformiert werden soll. Das Wort "rein" bedeutet dabei, dass die Funktionen zusammensetzbar sind. Dazu müssen sie die folgenden Voraussetzungen erfüllen:

  • Sie müssen eigenständig sein, damit sie frei und ohne jede Verflechtungen oder Abhängigkeiten vom Rest des Programms geordnet und umgeordnet werden können. Reine Transformationen existieren komplett unabhängig von ihrer Umgebung und beeinflussen diese auch nicht. Damit haben die in der Transformation verwendeten Funktionen keinerlei Nebenwirkungen.

  • Sie müssen zustandslos sein, damit das Ausführen ein und derselben Funktion oder eines bestimmten Satzes von Funktionen bei ein und derselben Eingabe auch immer zur selben Ausgabe führt. Reine Transformationen besitzen keine "Erinnerung" an ihre vorherige Verwendung.

Wichtiger Hinweis:

Im übrigen Teil dieses Lernprogramms wird der Begriff "reine Funktion" allgemein als Bezeichnung für einen Programmieransatz und nicht als Bezeichnung für ein bestimmtes Sprachfeature verwendet.

Beachten Sie, dass reine Funktionen in C# als Methoden und in Visual Basic als Funktionen implementiert werden müssen. (In Visual Basic können Unterroutinen keinen Wert zurückgeben, weshalb sie auch nicht zum Schreiben reiner funktionaler Transformationen verwendet werden.)

Verwechseln Sie bitte auch nicht die reinen Funktionen mit den reinen virtuellen Methoden in C++. Die reinen virtuellen Methoden in C++ geben an, dass die enthaltene Klasse abstrakt ist und dass kein Methodentext angegeben wird.

Funktionale Programmierung

Die funktionale Programmierung (FP) ist ein Programmieransatz, der die reine funktionale Transformation direkt unterstützt.

In der Vergangenheit standen Allzwecksprachen zur funktionalen Programmierung, wie ML, Scheme, Haskell und F# (von Microsoft Research), im Mittelpunkt des wissenschaftlichen Interesses. Es war zwar immer möglich, in C# und Visual Basic reine funktionale Transformationen zu schreiben, die damit verbundenen Schwierigkeiten ließen aber die meisten Programmierer davor zurückschrecken. Seit der Einführung von C# 3.0 und Visual Basic 9.0 stehen jedoch neue Sprachkonstrukte, z. B. Lambdaausdrücke und Typableitung, zur Verfügung, mit denen die funktionale Programmierung wesentlich einfacher und produktiver wurde.

Weitere Informationen zum funktionalen Programmieren finden Sie unter Funktionale Programmierung oder imperative Programmierung?.

Domänenspezifische FP-Sprachen

Während allgemeine FP-Sprachen keine große Verbreitung gefunden haben, konnten sich bestimmte domänenspezifische FP-Sprachen durchsetzen. So wird z. B. das Aussehen vieler Webseiten durch Cascading Style Sheets (CSS) gesteuert, während für die Bearbeitung von XML-Daten häufig XSLT-Stylesheets (Extensible Stylesheet Language Transformations) verwendet werden. Weitere Informationen zu XSLT finden Sie unter XSLT-Transformationen.

Begriffe

Im Folgenden finden Sie Definitionen für eine Reihe von Begriffen, die im Zusammenhang mit der funktionalen Transformation verwendet werden:

  • Funktion höherer Ordnung (Funktion erster Ordnung)
    Funktion, die als programmgesteuertes Objekt behandelt werden kann. So kann eine Funktion höherer Ordnung z. B. an andere Funktionen übergeben oder von anderen Funktionen zurückgegeben werden. Zu den Sprachfeatures in C# und Visual Basic, die Funktionen höherer Ordnung unterstützen, gehören Delegate und Lambdaausdrücke. Beim Schreiben einer Funktion höherer Ordnung deklarieren Sie für mindestens ein Argument, das diese Delegate akzeptiert, und beim Aufrufen einer solchen Funktion verwenden Sie häufig Lambdaausdrücke. Viele der Standardabfrageoperatoren sind Funktionen höherer Ordnung.

    Weitere Informationen dazu finden Sie unter Übersicht über Standardabfrageoperatoren.

  • Lambdaausdruck
    Im Wesentlichen eine anonyme Inlinefunktion, die überall dort verwendet werden kann, wo ein Delegattyp erwartet wird. Dies ist zwar eine vereinfachte Definition für Lambdaausdrücke, im Rahmen dieses Lernprogramms reicht sie aber aus.

    Weitere Informationen dazu finden Sie unter Lambda-Ausdrücke (C#-Programmierhandbuch) bzw. Lambda-Ausdrücke.

  • Auflistung
    Strukturierter Satz von Daten, die in der Regel alle denselben Typ haben. Zur Gewährleistung der Kompatibilität mit LINQ muss eine Auflistung die IEnumerable-Schnittstelle oder die IQueryable-Schnittstelle (oder eines ihrer generischen Gegenstücke, IEnumerator<T> bzw. IQueryable<T>) implementieren.

  • Tupel (anonyme Typen)
    Begriff aus der Mathematik, der eine endliche Abfolge von Objekten bezeichnet, die jeweils einen bestimmten Typ haben. Ein Tupel wird auch als geordnete Zusammenstellung bezeichnet. Dieses Konzept ist in Programmiersprachen als anonymer Typ implementiert, der es ermöglicht, einen nicht benannten Klassentyp zu deklarieren und gleichzeitig ein Objekt desselben Typs zu instanziieren.

    Weitere Informationen dazu finden Sie unter Anonyme Typen (C#-Programmierhandbuch) bzw. Anonyme Typen.

  • Typableitung (implizite Typisierung)
    Fähigkeit eines Compilers, den Typ einer Variablen in Abwesenheit einer expliziten Typdeklaration zu bestimmen.

    Weitere Informationen dazu finden Sie unter Implizit typisierte lokale Variablen (C#-Programmierhandbuch) bzw. Lokaler Typrückschluss.

  • Verzögerte Ausführung und verzögerte Auswertung
    Bei der verzögerten Auswertung (Lazy Evaluation) eines Ausdrucks wird mit der Auswertung so lange gewartet, bis der aufgelöste Wert tatsächlich benötigt wird. Die verzögerte Ausführung (Deferred Execution) wird in Auflistungen unterstützt.

    Weitere Informationen dazu finden Sie unter Einführung in LINQ-Abfragen und Verzögerte Ausführung und verzögerte Auswertung in LINQ to XML.

Diese Sprachfeatures werden in Codebeispielen im gesamten Abschnitt verwendet.

Siehe auch

Konzepte

Einführung in funktionale Transformationen mit reinen Funktionen

Funktionale Programmierung oder imperative Programmierung?

Einführung in LINQ-Abfragen

Verzögerte Ausführung und verzögerte Auswertung in LINQ to XML