Antworten:
Wikipedia hat einen großartigen Artikel über funktionale Programmierung mit einigen der Beispiele, nach denen Sie fragen. @Konrad Rudolph hat bereits den Link zum OOP-Artikel bereitgestellt .
Ich denke nicht, dass ein Paradigma eine Supermenge des anderen ist. Es handelt sich um unterschiedliche Programmierperspektiven, und einige Probleme lassen sich besser aus einer Perspektive und andere aus einer anderen Perspektive lösen.
Ihre Frage wird durch alle Implementierungen von FP und OOP noch komplizierter . Jede Sprache hat ihre eigenen Macken, die für eine gute Antwort auf Ihre Frage relevant sind.
Zunehmend tangentiales Wandern:
Ich mag die Idee, dass eine Sprache wie Scala versucht, Ihnen das Beste aus beiden Welten zu bieten. Ich mache mir Sorgen, dass es Ihnen die Komplikationen beider Welten gibt.
Java ist eine OO-Sprache, aber in Version 7 wurde eine "Try-with-Resources" -Funktion hinzugefügt, mit der eine Art Abschluss imitiert werden kann. Hier imitiert es das Aktualisieren einer lokalen Variablen "a" in der Mitte einer anderen Funktion, ohne sie für diese Funktion sichtbar zu machen. In diesem Fall ist die erste Hälfte der anderen Funktion der Konstruktor ClosureTry () und die zweite Hälfte die Methode close ().
public class ClosureTry implements AutoCloseable {
public static void main(String[] args) {
int a = 1;
try(ClosureTry ct = new ClosureTry()) {
System.out.println("Middle Stuff...");
a = 2;
}
System.out.println("a: " + a);
}
public ClosureTry() {
System.out.println("Start Stuff Goes Here...");
}
/** Interface throws exception, but we don't have to. */
public void close() {
System.out.println("End Stuff Goes Here...");
}
}
Ausgabe:
Start Stuff Goes Here...
Middle Stuff...
End Stuff Goes Here...
a: 2
Dies kann nützlich sein, um einen Stream zu öffnen, in den Stream zu schreiben und ihn zuverlässig zu schließen, oder um einfach zwei Funktionen so zu koppeln, dass Sie nicht vergessen, die zweite Funktion aufzurufen, nachdem Sie einige Arbeiten zwischen ihnen ausgeführt haben . Natürlich ist es so neu und ungewöhnlich, dass ein anderer Programmierer den try-Block entfernen könnte, ohne zu bemerken, dass er etwas kaputt macht. Daher ist es derzeit eine Art Anti-Pattern, aber interessant, dass dies möglich ist.
Sie können jede Schleife in den meisten imperativen Sprachen als Rekursion ausdrücken. Objekte und Variablen können unveränderlich gemacht werden. Verfahren können geschrieben werden, um Nebenwirkungen zu minimieren (obwohl ich behaupten würde, dass eine echte Funktion auf einem Computer nicht möglich ist - die Zeit, die für die Ausführung benötigt wird, und die verbrauchten Prozessor-, Festplatten- und Systemressourcen sind unvermeidbare Nebenwirkungen). Einige funktionale Sprachen können dazu gebracht werden, viele, wenn nicht sogar alle objektorientierten Operationen auszuführen. Sie müssen sich nicht gegenseitig ausschließen, obwohl einige Sprachen Einschränkungen aufweisen (z. B. dass keine Aktualisierung von Variablen zulässig ist), die bestimmte Muster verhindern (z. B. veränderbare Felder).
Für mich sind die nützlichsten Teile der objektorientierten Programmierung das Ausblenden (Einkapseln) von Daten, das Behandeln von Objekten mit ähnlichen Eigenschaften (Polymorphismus) und das Sammeln Ihrer Daten und Methoden, die diese Daten gemeinsam verarbeiten (Objekte / Klassen). Vererbung mag das Flaggschiff von OOP sein, aber für mich ist sie der am wenigsten wichtige und am wenigsten genutzte Teil.
Die nützlichsten Teile der funktionalen Programmierung sind Unveränderlichkeit (Token / Werte anstelle von Variablen), Funktionen (keine Nebenwirkungen) und Abschlüsse.
Ich denke nicht, dass es objektorientiert ist, aber ich muss sagen, dass eines der nützlichsten Dinge in der Informatik die Fähigkeit ist, eine Schnittstelle zu deklarieren, und dass dann verschiedene Teile der Funktionalität und Daten diese Schnittstelle implementieren. Ich mag es auch, ein paar veränderbare Daten zu haben, mit denen ich arbeiten kann. Ich glaube, ich fühle mich in ausschließlich funktionalen Sprachen nicht so wohl, obwohl ich versuche, die Veränderbarkeit und die Nebenwirkungen in all meinen Programmdesigns zu begrenzen.