4 votes

Comment modéliser les relations d'héritage en programmation fonctionnelle ?

Le paradigme de la programmation orientée objet utilise l'héritage pour modéliser les relations entre les entités qui suivent la relation Généralisation-Spécialisation. Ici, une classe de base est utilisée pour encapsuler les attributs et le comportement communs (généraux) d'un ensemble d'entités et les classes dérivées. étendre la classe de base en ajoutant des attributs supplémentaires et/ou en ajoutant/modifiant le comportement existant.

En tant que novice en programmation fonctionnelle, j'ai besoin de conseils pour modéliser de telles relations dans des langages fonctionnels comme F#.

Par exemple, quelle serait la meilleure approche pour modéliser une situation simple comme la suivante :

abstract class Tutorial { 
  private String topic;
  abstract public void learn();
}

class VideoTutorial extends Tutorial {
  private float duration;
  public void learn () {
    System.out.println ("Watch Video");
  }
}

class PDFTutorial extends Tutorial {
  private int pageCount;
  public void learn () {
    System.out.println ("Read PDF");
  }
}

puis, plus tard, utiliser une collection de Tutoriels et appeler apprendre pour observer un comportement polymorphe.

8voto

Tomas Petricek Points 118959

Dans le cadre de la conception fonctionnelle, vous envisagez les choses un peu différemment, de sorte que les idées ne se recoupent pas parfaitement. En général, la conception fonctionnelle se concentre davantage sur les types de données qui expriment les entités avec lesquelles vous travaillez. Dans votre cas, vous pourriez définir TutorialKind qui est soit une vidéo soit un PDF en utilisant une union discriminante et Tutorial serait alors un document composé d'un genre et de son sujet :

type TutorialKind = 
  | VideoTutorial of duration:float
  | PDFTutorial of pageCount:int

type Tutorial = 
  { Kind : TutorialKind
    Topic : string }

Notez que cela ne conserve que les données relatives aux tutoriels. Toute fonctionnalité peut être implémentée dans des fonctions qui correspondent au type de tutoriel :

let learn tutorial = 
  match tutorial.Kind with
  | VideoTutorial _ -> printfn "Watch video"
  | PDFTutorial _ -> printfn "Read PDF"

Notez que cette version est extensible dans une direction différente de celle de la version OO. En OO, vous pouvez facilement ajouter de nouvelles sous-classes ; ici, vous pouvez facilement ajouter de nouvelles fonctions. En pratique, les adeptes de la fonctionnalité sont généralement satisfaits de ce changement, mais F# est un langage mixte et si vous avez besoin d'une "extensibilité de style OO", vous pouvez facilement utiliser des interfaces.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X