Entspricht den SOLID-Prinzipien für die funktionale Programmierung

35

Ich fand die SOLID-Prinzipien recht nützlich, wenn ich über objektorientiertes Design nachdachte .

Gibt es ähnliche / äquivalente sprachunabhängige Prinzipien, die auf die funktionale Programmierung zugeschnitten sind?

mikera
quelle
12
FWIW, dies wurde vor einem Jahr kurz auf SO besprochen
StuartLC
In diesem Video sowie in diesen Folien werden die SOLID-Prinzipien für die funktionale Programmierung vorgestellt. Beide verwenden die Clojure-Sprache als Beispiel, aber die Prinzipien gelten auch in anderen Sprachen.
Maskottchen

Antworten:

14

Es ist ein bisschen schwierig, Äquivalente zu finden, aber ich kann versuchen:

  • S (SRP) In FP erzeugt eine Funktion IMMER die gleiche Ausgabe für die gleichen Argumente. Dies wird als referentielle Transparenz bezeichnet
  • O (OCP) In FP gibt es ein Konzept, das algebraische Datentypen genannt wird. Sehen Sie sich an, wie es mit Klassenhierarchien zusammenhängt und welches Problem beide zu lösen versuchen 1
  • L (LSP) Liskov-Substitutionsprinzip ist Kontravarianz 2
  • D (DIP) in der allgemeinen funktionalen Programmierung erreicht Abstraktion durch Funktionszusammensetzung, es gibt auch andere Mechanismen mit Hilfe der Kategorietheorie (zum Beispiel Monoid oder Funktor) für "Dependency Injection" 3
AndreasScheinert
quelle
21
Ich denke immer noch darüber nach, wie Sie vom Grundsatz der einheitlichen Verantwortung zur referenziellen Transparenz gekommen sind . Diese beiden haben nichts miteinander zu tun. SRP handelt von einer Funktion mit einem einzigen Zweck. Diesbezüglich kann es referenziell transparent sein oder nicht.
Goran Jovic
3
Ah, mein Schlimmes - ich verstehe es jetzt. Dies sind Äquivalente in dem Sinne, dass sie Prinzipien sind und dasselbe Akronym bilden, nicht in dem Sinne, dass sie dasselbe oder ähnliches bedeuten. Entschuldigung für die Ablehnung!
Goran Jovic
1
Richtig, das ist die beabsichtigte Art, es zu lesen. Ich habe versucht, eine Zuordnung für diese Begriffe im Kontext von fp zu beschreiben.
AndreasScheinert
Mann, ich hasse es, dass du einen Kommentar nicht bearbeiten kannst, in der Tat SOLLTEN die Dinge zumindest etwas Ähnliches bedeuten.
AndreasScheinert
Möglicherweise können Funktionen höherer Ordnung eine Art Abhängigkeitsinjektion bereitstellen: Sie injizieren eine konkrete Funktion als Parameter in eine generische Funktion (Funktion höherer Ordnung).
Giorgio
44

SOLID erweist sich auch für die funktionalen / imperativen Bereiche als gute Idee.

SRP - "Nur eines tun" wurde in erster Linie aus der imperativen Programmierung übernommen. Es ist gut, kleine, fokussierte Funktionen zu haben.

OCP - Es ist gut, das Verhalten zu ändern, ohne den Code zu ändern. Funktionale Programmierung verwendet Funktionen höherer Ordnung mehr als Vererbung, aber das Prinzip gilt.

LSP - Das Einhalten eines Schnittstellenvertrags ist in der funktionalen Programmierung genauso gut wie in der objektorientierten. Wenn eine Sortierfunktion einen Komparator verwendet, ist das Verhalten '0 ist gleich, liefert weniger als negative Ergebnisse, als positive Ergebnisse' zu erwarten.

ISP - Die meisten funktionalen Sprachen haben noch Strukturen. Die Angabe der kleinsten Datenmenge, die für eine Funktion erforderlich ist, ist immer noch eine gute Praxis. Das Erfordernis der am wenigsten spezifischen Schnittstelle zu den Daten (warum sollte man Listen von Ints verwenden, wenn Aufzählungen von T genauso gut funktionieren?) Ist immer noch eine gute Praxis.

DIP - Die Angabe von Parametern für eine Funktion (oder eine Funktion höherer Ordnung, um sie abzurufen) anstelle einer harten Codierung ist bei der funktionalen Programmierung genauso gut wie bei der objektorientierten Programmierung.

Und selbst bei der objektorientierten Programmierung gelten viele dieser Prinzipien für die Gestaltung von Methoden in den Objekten.

Telastyn
quelle