Répondre:
Wikipedia a un excellent article sur la programmation fonctionnelle avec certains des exemples que vous demandez. @Konrad Rudolph a déjà fourni le lien vers l' article OOP .
Je ne pense pas qu'un paradigme soit un super-ensemble de l'autre. Ce sont des perspectives différentes sur la programmation et certains problèmes sont mieux résolus d'un point de vue et certains d'un autre.
Votre question est encore compliquée par toutes les implémentations de FP et OOP. Chaque langue a ses propres bizarreries qui sont pertinentes pour toute bonne réponse à votre question.
Randonnée de plus en plus tangentielle:
J'aime l'idée qu'une langue comme Scala essaie de vous donner le meilleur des deux mondes. Je crains que cela ne vous donne aussi les complications des deux mondes.
Java est un langage OO, mais la version 7 a ajouté une fonctionnalité "essayer avec des ressources" qui peut être utilisée pour imiter une sorte de fermeture. Ici, il imite la mise à jour d'une variable locale "a" au milieu d'une autre fonction, sans la rendre visible pour cette fonction. Dans ce cas, la première moitié de l'autre fonction est le constructeur ClosureTry () et la seconde moitié est la méthode 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...");
}
}
Sortie:
Start Stuff Goes Here...
Middle Stuff...
End Stuff Goes Here...
a: 2
Cela peut être utile pour son objectif prévu d'ouvrir un flux, d'écrire dans le flux et de le fermer de manière fiable, ou pour simplement associer deux fonctions d'une manière que vous n'oubliez pas d'appeler la seconde après avoir effectué un travail entre elles . Bien sûr, c'est tellement nouveau et inhabituel qu'un autre programmeur peut supprimer le bloc try sans se rendre compte qu'ils cassent quelque chose, c'est donc actuellement une sorte d'anti-pattern, mais intéressant que cela puisse être fait.
Vous pouvez exprimer n'importe quelle boucle dans la plupart des langues impératives comme une récursivité. Les objets et les variables peuvent être rendus immuables. Des procédures peuvent être écrites pour minimiser les effets secondaires (même si je dirais qu'une véritable fonction n'est pas possible sur un ordinateur - le temps qu'il faut pour exécuter et les ressources processeur / disque / système qu'il consomme sont des effets secondaires inévitables). Certains langages fonctionnels peuvent être conçus pour effectuer de nombreuses, sinon toutes, les opérations orientées objet. Ils ne doivent pas être mutuellement exclusifs, bien que certaines langues aient des limitations (comme interdire toute mise à jour des variables) qui empêchent certains modèles (comme les champs mutables).
Pour moi, les parties les plus utiles de la programmation orientée objet sont le masquage des données (encapsulation), le traitement d'objets suffisamment similaires comme les mêmes (polymorphisme) et la collecte de vos données et méthodes qui opèrent ensemble sur ces données (objets / classes). L'héritage est peut-être le fleuron de la POO, mais pour moi, c'est la partie la moins importante et la moins utilisée.
Les parties les plus utiles de la programmation fonctionnelle sont l'immuabilité (jetons / valeurs au lieu de variables), les fonctions (pas d'effets secondaires) et les fermetures.
Je ne pense pas que ce soit orienté objet, mais je dois dire que l'une des choses les plus utiles en informatique est la capacité de déclarer une interface, puis de disposer de diverses fonctionnalités et données pour implémenter cette interface. J'aime également avoir quelques données mutables avec lesquelles travailler, donc je suppose que je ne suis pas totalement à l'aise dans les langages exclusivement fonctionnels, même si j'essaie de limiter la mutabilité et les effets secondaires dans toutes mes conceptions de programmes.