• [^] # Re: Oh vous savez, moi, l'objet...

    Posté par . En réponse au lien Un point sur la programmation objet (POO) – La POO, ses problèmes, et qu’en faire . Évalué à 4. Dernière modification le 22 juin 2023 à 23:07.

    Tu utilise pas un type somme pour ça ?

    En fait, ce type est équivalent à un type somme, ou plus exactement la limite d'une somme infinie (comme une série convergente, en gros). Pour l'écrire ainsi, il faut utiliser les types de données algébriques généralisés ou GADT. Lors de la première édition de l'ouvrage, il n'y a avait pas encore de GADT dans le langage, d'où l'usage de modules et de types abstraits. Mais on peut aussi définir le type existentiel de l'objet ainsi :

    (** le type des méthodes pour un type 'a donné *)
    type 'a meth = (module Query_handler with type t = 'a)
    (** le type de l'objet avec un GADT *)
    type t = Handler : {meth : 'a meth; this : 'a} -> t

    C'est une somme infinie indexée par les modules de méthodes. Si on pouvait utiliser une syntaxe à la Curry pour le constructeur de GADT (c'est ce qui se fait en Haskell en mixant type classes et GADT), cela donnerait :

    type t = Handler : 'a meth -> ('a -> t)

    autrement dit, c'est un type somme avec une infinité de constructeur, indexés par les modules des méthodes : chaque module de type 'a meth définit un constructeur qui injecte le type 'a dans la somme t. :-)

    Sur le forum OCaml, j'avais fait une synthèse de différentes implémentations du paradigme de la POO (avec comparaison des différentes implémentation) pour une personne qui voulait l'émuler mais ne pouvait pas utiliser la couche objet du langage. Le cas d'étude étant des données dont le comportement commun était de pouvoir être affichées et mises à jour (de manière immuable). En gros, elles devaient satisfaire cette interface :

    module type S = sig
     type t
     (** méthode d'affichage *)
     val print : t -> unit
     (** méthode de mise à jour *)
     val update : t -> t
    end

    Les quatres première propositions de mon commentaire caractérisent la nature d'un objet, au sens de la POO, et si l'on n'a pas besoin de les exprimer dans son code alors les objets ne servent à rien.

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.