Warum sollten Sie über funktionale Programmierung nachdenken?

Hallo Habr! Ich präsentiere Ihnen die Übersetzung meines Artikels „Warum Sie über funktionale Programmierung nachdenken sollten“ , der sich der funktionalen Programmierung widmet.

Bild

Warum sollten Sie über funktionale Programmierung nachdenken? Beantworten wir die folgenden Fragen:

  • Sind Ihre Projekte immer pünktlich?
  • Hatten Benutzer Beschwerden?
  • Hat die Projektunterstützung jemals lange gedauert?
  • Passt neue Funktionalität immer gut zur vorhandenen Architektur?

Wenn die Antworten auf alle oben genannten Fragen positiv sind, müssen Sie nichts ändern. Ihr Team ist ein seltenes Beispiel für harmonische Mitarbeiter, Methoden und Werkzeuge. Andernfalls sollten Sie offen sein für neue Ansätze zur Lösung Ihrer Probleme, einschließlich eines kritischen Blicks auf die verwendete Hardware und die verwendeten Programmiersprachen.

Erster Blick


Wie Sie wissen, sind Programmierer äußerst kreative Menschen, aber gleichzeitig tendieren sie dazu, bei der Auswahl einer Programmiersprache einigen Trends zu folgen. Unter einer Vielzahl von Sprachen werden funktionale Sprachen bei Fans immer beliebter und Unternehmen auf der ganzen Welt setzen sie sicherer ein. Die Verwendung funktionaler Sprachen kann die Produktivität und Qualität der Arbeit von Programmierern erheblich steigern. Dies hängt natürlich von einer Kombination aus Aufgaben, Sprache und Programmierkenntnissen ab. In diesem Fall beschreibt der Programmierer einfach, was er möchte, anstatt die Reihenfolge der Aktionen aufzulisten, die erforderlich sind, um das Ergebnis zu erhalten. Daher konzentriert sich der Entwickler auf das „Was benötigt wird“ auf hoher Ebene, anstatt sich auf das „Wie geht das?“ Auf niedriger Ebene zu beschränken.

Funktionale Programmierung ist der Stil des Schreibens von Programmen durch Kompilieren einer Reihe von Funktionen. Das Grundprinzip besteht darin, fast alles in eine Funktion zu packen, viele kleine wiederverwendbare Funktionen zu schreiben und sie dann einfach nacheinander aufzurufen. Darüber hinaus muss die Struktur dieser Funktionen bestimmten Regeln entsprechen und einige Probleme lösen.

Wenn also ein Problem durch Kombinieren von Aufrufen mehrerer Funktionen gelöst werden kann, dann:

  1. Wie implementiere ich if-else-Bedingungen?
  2. Wie löse ich Tricks mit Null Exception?
  3. Wie kann sichergestellt werden, dass die Funktion wirklich „wiederverwendbar“ ist und überall verwendet werden kann?
  4. Wie kann sichergestellt werden, dass die an unsere Funktionen übertragenen Daten geändert werden und an anderen Orten verwendet werden können?
  5. Wenn eine Funktion mehrere Werte annimmt, Sie sie jedoch in einer Kette kombinieren, können Sie nur eine Funktion übergeben. Wie machen wir diese Funktion dann zu einem Teil der Kette?

Um all diese Probleme zu lösen, bieten funktionale Sprachen Werkzeuge und Lösungen aus der Mathematik wie Monaden, Funktoren usw.

Die Vorteile der funktionalen Programmierung sind in der Öffentlichkeit seit langem anerkannt. Eine erfolgreiche Softwareentwicklung beruht häufig auf der Vereinfachung bestehender Mechanismen, mit denen sich neue Anwendungen an die Anforderungen moderner Benutzer anpassen können. Gleichzeitig müssen wir uns beeilen, nachdem wir es geschafft haben, unseren Kunden in kurzer Zeit Produkte mit unbegrenzten Möglichkeiten zu präsentieren. Sich ändernde Anforderungen sind viel einfacher zu verfolgen, wenn entwickelte Anwendungen in mehrere einfache Funktionen unterteilt werden können, die einfach zu testen sind. Solche Algorithmen haben keine kniffligen Nebenwirkungen und abstrakten Formulierungen, die für Ergebnisse auf globaler Ebene bestimmt sind.

Warum übersehen Experten die funktionale Programmierung so lange? Und warum wird es heute so üblich?

Wo wird funktionale Programmierung in der realen Welt eingesetzt?


Da funktionale Programmierung in erster Linie ein Ansatz zum Schreiben von Code ist, können Sie seine Prinzipien in jeder Sprache verwenden. Es gibt jedoch Sprachen, die speziell durch einen funktionalen Ansatz verfeinert wurden. Modernere funktionale Sprachen wie Elm und Elixir gewinnen laut GitHub und Stack Overflow allmählich und sicher an Popularität. Die wachsende Beliebtheit von JavaScript hat auch das Interesse an funktionalen Programmierkonzepten zur Verwendung in dieser Sprache erhöht. Darüber hinaus haben erfahrene Entwickler auf dem Gebiet der funktionalen Programmierung begonnen, an Single Web Application - SPA-Umgebungen zu arbeiten. Infolgedessen verfügen wir über Redux, React, MobX und andere Bibliotheken, die von Millionen von Menschen verwendet werden.

Bild

Beispiele aus dem wirklichen Leben:

  • Apache Funken
  • Verbrühung (von Twitter)
  • Apache kafka
  • Finagle (von Twitter)
  • Aka
  • Autocad
  • Emacs (LISP)

Was ist funktionale Programmierung, woher kommt ein solcher Boom und warum sollte er in Betracht gezogen werden? Lass es uns herausfinden.

Über funktionale Programmierung


Vor einigen Jahren hatten nur wenige Experten eine Idee zur funktionalen Programmierung, aber in den letzten drei Jahren hat fast jede Codebasis großer Anwendungen aktiv Ideen aus der Welt der funktionalen Programmierung verwendet. Und dafür gibt es objektive Gründe:

  • Mit der funktionalen Programmierung können Sie präziseren und vorhersehbareren Code schreiben
  • es ist einfacher zu überprüfen (obwohl es nicht einfach ist, von Grund auf zu lernen)

Hauptmerkmale der Softwareentwicklung mittels funktionaler Programmierung


  • Die Reinigungsfunktion ist sehr einfach. Es sollte immer das gleiche Ergebnis zurückgeben. Mit den gleichen Werten von X und Y erhalten wir immer das gleiche Ergebnis der Funktion. Die Vorhersagbarkeit spielt bei der Programmausführung eine wichtige Rolle bei der funktionalen Programmierung.
  • Vermeiden Sie allgemeine Bedingungen, flüchtige Daten und Nebenwirkungen.
    Ein unveränderliches Objekt ist ein Objekt, dessen Status nach seiner Erstellung nicht mehr geändert werden kann. Unveränderliche Objekte sind threadorientierter als veränderbare Objekte. Wenn die Funktion nicht vorhersehbar funktioniert, führt dies zu unerwünschten Nebenwirkungen. In imperativen Sprachen kann eine Funktion im Implementierungsprozess die Werte globaler Variablen lesen und ändern und die Eingabe / Ausgabe durchführen. Wenn wir dieselbe Funktion zweimal mit demselben Argument aufrufen, kann es daher vorkommen, dass wir zwei unterschiedliche Ergebnisse erhalten. Diese Funktion wird als Nebeneffekt bezeichnet.

    Die funktionale Programmierung hilft uns, threadorientierten Code zu schreiben.
  • Die Prävalenz eines deklarativen statt eines imperativen Ansatzes.

Funktionszusammensetzung


Die Funktionszusammensetzung ist ein funktionaler Programmieransatz, bei dem einige Funktionen als Argumente anderer aufgerufen werden, um eine komplexe Zusammensetzung einfacherer Funktionen zu erstellen. Mit dieser Layoutmethode können Sie zwei oder mehr einfache Funktionen zu einer komplexeren Funktion kombinieren, die Unterfunktionen in einer logischen Reihenfolge mit beliebigen Daten ausführt. Um dieses Ergebnis zu erhalten, fügen Sie eine Funktion in eine andere ein und führen Operationen mit externen Funktionen für das Ergebnis der internen Funktion aus, bis Sie das Ergebnis erhalten. Das Ergebnis kann je nach der Reihenfolge, in der die Funktionen angewendet werden, unterschiedlich sein.

Als Ergebnis erhalten wir mit einer anderen logischen Reihenfolge des Aufrufs reiner Funktionen und dem gleichen Wert des Arguments komplexere Funktionen, die das gewünschte Ergebnis liefern und vorhersehbar machen.

Bild

Vorteile der funktionalen Programmierung


Die funktionale Programmierung erleichtert das Verständnis, die Vorhersehbarkeit und das Lesen von Code. Die Verwendung der Prinzipien der funktionalen Programmierung hilft dabei, unnötige Abstraktionen mit unvorhersehbarem Verhalten zu beseitigen. Machen Sie das Programm daher vorhersehbarer und reduzieren Sie die Anzahl möglicher Fehler.

In funktionalen Sprachen können Funktionen als Argument an andere Funktionen übergeben oder als Ergebnis zurückgegeben werden. Funktionen, die funktionale Argumente annehmen, werden Funktionen oder Funktionale höherer Ordnung genannt. Das beliebteste Feature ist die Karte. Eine Karte, die eine bestimmte Funktion auf alle Elemente der Liste anwendet und aus den Ergebnissen eine weitere Liste bildet.

Bei der rein funktionalen Programmierung fehlt der Zuweisungsoperator, Objekte können nicht geändert und zerstört werden, neue können nur durch Dekodieren und Synthetisieren vorhandener Objekte erstellt werden. Der eingebaute Garbage Collector kümmert sich um unnötige Objekte. Aus diesem Grund sind in einer reinen Funktionssprache alle Funktionen frei von Nebenwirkungen. Dies hindert diese Sprache jedoch nicht daran, einige nützliche imperative Eigenschaften wie Ausnahmen und veränderbare Arrays nachzuahmen. Natürlich gibt es dafür spezielle Tricks.

Nachteile der funktionalen Programmierung


  • Eines der Probleme der funktionalen Programmierung besteht darin, dass sie sich von dem unterscheidet, was Sie bereits wissen. Sie müssen viel von dem, was Sie bereits wissen, in einer zwingenden Umgebung neu lernen! Viele erfahrene Entwickler, die bereits wissen, was sie bereits wissen, werden Probleme nicht anders lösen. Es braucht Zeit und Mühe, um anders zu denken.
  • Es ist einfach, saubere Funktionen zu schreiben, aber wenn Sie sie zu einer vollständigen Anwendung kombinieren, werden die Dinge komplizierter.
  • Großes Problem mit vorhersehbarer Leistung. Die Verwendung nur unveränderlicher Werte und Rekursionen kann möglicherweise zu Leistungsproblemen führen, einschließlich RAM-Nutzung und Geschwindigkeit. Daher sind die meisten funktionalen Sprachen keine besonders gute Wahl für weiche oder harte Echtzeitsysteme oder Embedded Computing.
  • Funktionale Programmierung neigt dazu, Code in einer zu abstrakten Form zu schreiben, wenn der Programmierer selbst nach einer Weile nicht mehr versteht, was er geschrieben hat.
  • Reine Funktionen und E / A sind nicht wirklich gemischt.

Fazit


Wenn Sie und Ihr Entwicklungsteam den Eindruck haben, dass Ihr Codierungsstil Ihnen nicht das erforderliche Maß an Komplexitätsmanagement in Ihrem Geschäftsbereich bietet und Sie Ihren Code mit unnötigem Syntaxmüll verstopfen, was zu Zeitverlust führt, versuchen Sie es mit funktionaler Programmierung. In Bereichen, die sich auf eine große Anzahl von Berechnungen oder Datentransformationen beziehen, können Sie durch parallele / asynchrone Programmierung erhebliche Vorteile erzielen, die in die funktionale Programmierung eintauchen.

Wenn Sie Code in einer funktionalen Sprache schreiben, haben Sie die Möglichkeit, das Problem aus einer anderen Perspektive zu betrachten, wobei die Entwicklung Ihrer Lösung effizienter sein kann. Und es erhöht einfach die Anzahl der Möglichkeiten, Ihre Ideen auszudrücken.

Wenn Sie Ihre Lösung unter Verwendung des funktionalen Programmierparadigmas entwickeln, beschleunigen Sie den gesamten Entwicklungsprozess immer schneller und werden immer erfahrener. Es sieht so aus, als würden Sie Ihr Auto in einem hohen Gang fahren, verglichen mit der Art und Weise, wie sich zwingende Programmierer bewegen.

Funktionale Programmierung kann Ihren Codierungsstil zum Besseren verändern. Aber es zu meistern ist ziemlich schwierig und zeitaufwändig, und viele Beiträge und Tutorials berücksichtigen nicht die Details (z. B. Monaden, anwendbare Funktoren usw.) und geben keine praktischen Beispiele, die Anfängern helfen würden, jeden Tag leistungsstarke Methoden der funktionalen Programmierung anzuwenden. Sie können jedoch erfahrene Programmierer für das Team gewinnen, wodurch Sie Zeit, Mühe und Geld sparen.

Bild

Wenn Sie alles richtig machen, ist das Ergebnis verständlicher, prägnanter und Sie haben lesbaren Code. Wollen wir das nicht alle?

Roman Taluev,
Quasarbyte Softwareentwickler

Source: https://habr.com/ru/post/de438396/


All Articles