Question

J'ai été exposé principalement à la programmation orientée objet jusqu'à présent et je suis impatient d'apprendre un langage fonctionnel. Mes questions sont les suivantes:

  • Quand choisissez-vous sur la programmation fonctionnelle orientée objet?
  • Quelles sont les définitions de problèmes typiques où la programmation fonctionnelle est un meilleur choix?
Était-ce utile?

La solution

  

Lorsque vous choisissez la programmation fonctionnelle sur orienté objet?

Lorsque vous anticipez un autre type d'évolution du logiciel:

  • Les langages orientés objet sont bonnes lorsque vous disposez d'un ensemble fixe de opérations sur choses , et que votre code évolue, vous ajoutez principalement de nouvelles choses. Ceci peut être accompli en ajoutant de nouvelles classes qui mettent en œuvre des méthodes existantes, et les classes existantes sont laissés seuls.

  • Les langages fonctionnels sont bons lorsque vous disposez d'un ensemble fixe de choses , et que votre code évolue, vous ajoutez principalement nouveau opérations sur des choses existantes. Ceci peut être accompli en ajoutant de nouvelles fonctions qui calculent avec des types de données existantes et les fonctions existantes sont laissés seuls.

Quand l'évolution va dans le mauvais sens, vous avez des problèmes:

  • Ajout d'une nouvelle opération à un programme orienté objet peut nécessiter la modification de nombreuses définitions de classe pour ajouter une nouvelle méthode.

  • Ajout d'un nouveau genre de chose à un programme fonctionnel peut nécessiter la modification de nombreuses définitions de fonction pour ajouter un nouveau cas.

Ce problème est bien connu depuis de nombreuses années; en 1998, Phil Wadler surnommé le "problème d'expression" . Bien que certains chercheurs pensent que le problème d'expression peut être traitée avec de telles caractéristiques linguistiques que mixins, une solution largement acceptée n'a pas encore touché le grand public.

  

Quelles sont les définitions de problèmes typiques où la programmation fonctionnelle est un meilleur choix?

Les langages fonctionnels excellent à la manipulation de données symboliques sous forme d'arborescence. Un exemple préféré est compilateurs, où les langues source et intermédiaires changent rarement (surtout les mêmes choses ), mais les auteurs du compilateur ajoutent toujours de nouvelles traductions et améliorations du code ou des optimisations (nouvelles opérations sur des choses). Compilation et traduction plus sont généralement « killer apps » pour les langages fonctionnels.

Autres conseils

Vous ne devez pas nécessairement choisir entre les deux paradigmes. Vous pouvez écrire un logiciel avec une architecture orientée objet en utilisant de nombreux concepts fonctionnels. FP et POO sont orthogonales dans la nature .

Prenons par exemple C #. On pourrait dire qu'il est la plupart du temps POO, mais il y a beaucoup de concepts de PF et des constructions. Si vous considérez Linq , les plus importantes constructions qui permettent Linq d'exister sont fonctionnels dans la nature. expressions lambda

Un autre exemple, F #. On pourrait dire qu'il est la plupart du temps FP, mais il y a beaucoup de concepts OOP et constructions disponibles. Vous pouvez définir des classes, des classes abstraites, interfaces, face à l'héritage. Vous pouvez même utiliser mutabilité quand il rend votre code plus clair ou quand il augmente considérablement les performances.

De nombreuses langues modernes sont multi-paradigme.

Lectures recommandées

Comme je suis dans le même bateau (fond POO, apprentissage FP), je vous suggère quelques lectures que j'ai ai vraiment apprécié:

Programmation orientée objet offres:

  1. Encapsulation, à
    • mutation de contrôle de l'état interne
    • couplage de réponse à la représentation interne
  2. Le sous-typage, ce qui permet:
    • substitution des types compatibles (polymorphisme)
    • un moyen brut de partage de la mise en œuvre entre les classes (l'héritage d'implémentation)

Programmation fonctionnelle, en Haskell ou même à Scala, peut permettre une substitution par un mécanisme plus général des classes de type. état interne Mutable est soit découragée ou interdite. Encapsulation de la représentation interne peut également être réalisée. Voir Haskell vs POO pour une bonne comparaison.

L'affirmation de Norman que « Ajout d'un nouveau genre de chose à un programme fonctionnel peut nécessiter la modification de nombreuses définitions de fonction pour ajouter un nouveau cas. » dépend de la façon dont le code fonctionnel a employé des classes de type. Si motif correspondant sur un particulier type de données abstrait est répartie dans une base de code, vous souffrez en effet de ce problème, mais il est peut-être un design pauvre pour commencer.

ÉDITÉ Suppression de la référence à des conversions implicites lors de l'examen des classes de type. En Scala, les classes de type sont codés avec des paramètres implicites, non conversions, bien que les conversions implicites sont un autre moyen de substitution acheiving des types compatibles.

  1. Si vous êtes dans un environnement fortement concurrent, alors pur programmation fonctionnelle est utile. L'absence d'état mutable fait presque trivial concurrency. Voir Erlang.

  2. Dans un langage multi paradigme, vous voudrez peut-être modéliser certaines choses fonctionnellement si l'existence de l'Etat est mutable doit un détail de mise en œuvre, et donc FP est un bon modèle pour le domaine de problème. Par exemple, voir la liste en compréhensions Python ou std.range dans le langage de programmation D . Ceux-ci sont inspirés par la programmation fonctionnelle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top