Funktionale Programmierung und Imperative Programmierung (C#)Functional Programming vs. Imperative Programming (C#)

In diesem Thema werden die Gemeinsamkeiten und die Unterschiede der funktionalen Programmierung und der herkömmlichen imperativen (prozeduralen) Programmierung erläutert.This topic compares and contrasts functional programming with more traditional imperative (procedural) programming.

Funktionale Programmierung und Imperative ProgrammierungFunctional Programming vs. Imperative Programming

Explizite Aufgabe der funktionalen Programmierung ist die Unterstützung eines reinen funktionalen Ansatzes bei der Problemlösung.The functional programming paradigm was explicitly created to support a pure functional approach to problem solving. Die funktionale Programmierung ist eine Form der deklarativen Programmierung.Functional programming is a form of declarative programming. Im Unterschied dazu unterstützen die meisten normalen Programmiersprachen, darunter auch OOP-Sprachen wie C#, Visual Basic, C++ und Java, in erster Linie die imperative (prozedurale) Programmierung.In contrast, most mainstream languages, including object-oriented programming (OOP) languages such as C#, Visual Basic, C++, and Java, were designed to primarily support imperative (procedural) programming.

Beim imperativen Ansatz schreibt ein Entwickler Code, der detailliert die Schritte beschreibt, die der Computer zur Erfüllung der Aufgabe ausführen muss.With an imperative approach, a developer writes code that describes in exacting detail the steps that the computer must take to accomplish the goal. Diese Form der Programmierung wird mitunter auch als algorithmische Programmierung bezeichnet.This is sometimes referred to as algorithmic programming. Beim funktionalen Ansatz hingegen wird das Problem als Satz von auszuführenden Funktionen formuliert.In contrast, a functional approach involves composing the problem as a set of functions to be executed. Sie definieren sorgfältig, was für jede Funktion eingegeben wird und was die jeweilige Funktion zurückgibt.You define carefully the input to each function, and what each function returns. In der folgenden Tabelle werden einige der allgemeinen Unterschiede zwischen diesen beiden Ansätzen beschrieben:The following table describes some of the general differences between these two approaches.

MerkmalCharacteristic Imperativer AnsatzImperative approach Funktionaler AnsatzFunctional approach
Schwerpunkt bei der ProgrammierungProgrammer focus Art und Weise der Ausführung von Aufgaben (Algorithmen) und der Überwachung von StatusänderungenHow to perform tasks (algorithms) and how to track changes in state. Art der gewünschten Informationen und der erforderlichen TransformationenWhat information is desired and what transformations are required.
StatusänderungenState changes wichtigImportant. nicht existentNon-existent.
Reihenfolge der AusführungOrder of execution wichtigImportant. weniger wichtigLow importance.
Primäre DatenflusskontrollePrimary flow control Schleifen, Bedingungen und Funktions- (Methoden-)AufrufeLoops, conditionals, and function (method) calls. Funktionsaufrufe, einschließlich RekursionFunction calls, including recursion.
Primäre ManipulationseinheitPrimary manipulation unit Instanzen von Strukturen oder KlassenInstances of structures or classes. Funktionen als erstklassige Objekte und DatensammlungenFunctions as first-class objects and data collections.

Die meisten Sprachen unterstützen zwar ein bestimmtes Programmierparadigma, viele allgemeine Sprachen sind aber ausreichend flexibel, um mehrere Paradigmen zu unterstützen.Although most languages were designed to support a specific programming paradigm, many general languages are flexible enough to support multiple paradigms. So können z. B. die meisten Sprachen, die Funktionszeiger enthalten, zur glaubwürdigen Unterstützung der funktionalen Programmierung verwendet werden.For example, most languages that contain function pointers can be used to credibly support functional programming. Darüber hinaus enthält C# auch explizite Spracherweiterungen, darunter Lambda-Ausdrücke und Typableitung, die die funktionale Programmierung unterstützen.Furthermore, C# includes explicit language extensions to support functional programming, including lambda expressions and type inference. Eine Form der deklarativen, funktionalen Programmierung ist die LINQ-Technologie.LINQ technology is a form of declarative, functional programming.

Funktionale Programmierung mit XSLTFunctional Programming Using XSLT

Viele XSLT-Entwickler sind mit dem reinen funktionalen Ansatz vertraut.Many XSLT developers are familiar with the pure functional approach. Der effektivste Weg bei der Entwicklung eines XSLT-Stylesheets besteht darin, jede Vorlage als isolierte, zusammensetzbare Transformation zu behandeln.The most effective way to develop an XSLT style sheet is to treat each template as an isolated, composable transformation. Die Reihenfolge der Ausführung ist dabei ohne jede Bedeutung.The order of execution is completely de-emphasized. XSLT lässt keine Nebenwirkungen zu (lediglich die Escapemechanismen für die Ausführung von prozeduralem Code können Nebenwirkungen mit sich bringen, die zu funktionaler Unreinheit führen).XSLT does not allow side effects (with the exception that escaping mechanisms for executing procedural code can introduce side effects that result in functional impurity). XSLT ist zwar ein wirksames Tool, dennoch sind einige seiner Eigenschaften nicht optimal.However, although XSLT is an effective tool, some of its characteristics are not optimal. So führt z. B. das Ausdrücken von Programmierkonstrukten in XML dazu, dass Code relativ weitschweifig und damit schwierig zu unterhalten ist.For example, expressing programming constructs in XML makes code relatively verbose, and therefore difficult to maintain. Auch die schwere Abhängigkeit von der Rekursion zur Flusssteuerung kann dazu führen, dass Code schwer lesbar ist.Also, the heavy reliance on recursion for flow control can result in code that is hard to read. Weitere Informationen zu XSLT finden Sie unter XSLT-Transformationen.For more information about XSLT, see XSLT Transformations.

Dennoch hat XSLT bewiesen, dass die Verwendung eines reinen funktionalen Ansatzes bei der Transformierung von XML von einer Form in eine andere sinnvoll ist.However, XSLT has proved the value of using a pure functional approach for transforming XML from one shape to another. Die reine funktionale Programmierung mit LINQ to XML ähnelt in vielerlei Hinsicht XSLT.Pure functional programming with LINQ to XML is similar in many ways to XSLT. Mit den Programmierkonstrukten von LINQ to XML und C# können Sie reine funktionale Transformationen schreiben, die besser lesbar und verwaltbar sind als XSLT.However, the programming constructs introduced by LINQ to XML and C# allow you to write pure functional transformations that are more readable and maintainable than XSLT.

Vorteile von reinen FunktionenAdvantages of Pure Functions

Der Hauptgrund für die Implementierung von funktionalen Transformationen als reinen Funktionen (Pure-Funktionen) besteht darin, dass reine Funktionen zusammenstellbar sind, d. h., sie sind in sich abgeschlossen und zustandslos.The primary reason to implement functional transformations as pure functions is that pure functions are composable: that is, self-contained and stateless. Diese Eigenschaften bieten u. a. die folgenden Vorteile:These characteristics bring a number of benefits, including the following:

  • Bessere Lesbarkeit und Verwaltbarkeit:Increased readability and maintainability. Jede Funktion ist für die Erledigung einer bestimmten Aufgabe anhand ihrer Argumente vorgesehen,This is because each function is designed to accomplish a specific task given its arguments. ohne sich dabei auf einen externen Zustand zu verlassen.The function does not rely on any external state.

  • Einfachere reiterative Entwicklung:Easier reiterative development. Da der Code einfacher umgestaltet werden kann, können Änderungen am Entwurf oft leichter implementiert werden.Because the code is easier to refactor, changes to design are often easier to implement. Nehmen wir z. B. an, Sie schreiben eine komplizierte Transformation und stellen dann fest, dass sich ein Teil des Codes in der Transformation mehrmals wiederholt.For example, suppose you write a complicated transformation, and then realize that some code is repeated several times in the transformation. Bei der Umgestaltung mit einer reinen Methode können Sie Ihre reine Methode ganz nach Belieben aufrufen, ohne auf irgendwelche Nebenwirkungen Rücksicht nehmen zu müssen.If you refactor through a pure method, you can call your pure method at will without worrying about side effects.

  • Einfacheres Testen und Debuggen:Easier testing and debugging. Da reine Funktionen einfacher in Isolation getestet werden können, können Sie Testcode schreiben, der die reine Funktion mit typischen Werten, gültigen Randfällen und ungültigen Randfällen aufruft.Because pure functions can more easily be tested in isolation, you can write test code that calls the pure function with typical values, valid edge cases, and invalid edge cases.

Was müssen OOP-Entwickler beachten?Transitioning for OOP Developers

Bei der traditionellen objektorientierten Programmierung (OOP) verwenden die meisten Entwickler beim Programmieren den imperativen/prozeduralen Stil.In traditional object-oriented programming (OOP), most developers are accustomed to programming in the imperative/procedural style. Für den Umstieg auf die Entwicklung in einem reinen funktionalen Stil müssen die Entwickler umdenken und ihre Herangehensweise an die Entwicklung ändern.To switch to developing in a pure functional style, they have to make a transition in their thinking and their approach to development.

Zur Lösung von Problemen entwerfen OOP-Entwickler Klassenhierarchien, konzentrieren sich auf die richtige Kapselung und denken in Klassenvertragskategorien.To solve problems, OOP developers design class hierarchies, focus on proper encapsulation, and think in terms of class contracts. Im Vordergrund stehen das Verhalten und der Status von Objekttypen, und zu diesem Zweck werden Sprachfunktionen wie Klassen, Schnittstellen, Vererbung und Polymorphie bereitgestellt.The behavior and state of object types are paramount, and language features, such as classes, interfaces, inheritance, and polymorphism, are provided to address these concerns.

Dagegen werden die Berechnungsprobleme bei der funktionalen Programmierung als Übung für die Auswertung reiner funktionaler Transformationen von Datensammlungen angesehen.In contrast, functional programming approaches computational problems as an exercise in the evaluation of pure functional transformations of data collections. Bei der funktionalen Programmierung werden Zustands- und änderbare Daten vermieden, stattdessen steht die Anwendung von Funktionen im Mittelpunkt.Functional programming avoids state and mutable data, and instead emphasizes the application of functions.

Glücklicherweise erfordert C# keinen kompletten Umstieg auf die funktionale Programmierung, da sowohl der imperative als auch der funktionale Programmierungsansatz unterstützt wird.Fortunately, C# doesn't require the full leap to functional programming, because it supports both imperative and functional programming approaches. Der Entwickler kann daher selbst entscheiden, welcher Ansatz für ein bestimmtes Szenario am geeignetsten ist.A developer can choose which approach is most appropriate for a particular scenario. Bei vielen Programme werden beide Ansätze häufig miteinander kombiniert.In fact, programs often combine both approaches.

Siehe auchSee Also

Introduction to Pure Functional Transformations (C#) (Einführung in reine funktionale Transformationen (c#))Introduction to Pure Functional Transformations (C#)
XSLT Transformations (XSLT-Transformationen)XSLT Transformations
Refactoring in reine Funktionen (C#)Refactoring Into Pure Functions (C#)