Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 13 sur 13
  1. #1
    Max.Adorable
    Invité(e)

    Par défaut Records ou Classe

    Bonjour à tous,

    Dans mon étude du F# (et du paradigme fonctionnel par la même occasion) j'ai du mal à faire la distinction entre record et classe. A part l'héritage je ne vois aucune réelle différence. Alors quand utiliser l'un et pas l'autre ? Il y a-t-il des "règles" ou autre ?

    Merci d'avance.
    Max.

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro Nicolas Vallée
    Ingénieur d'études
    Inscrit en
    décembre 2005
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Nom : Homme Nicolas Vallée
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : décembre 2005
    Messages : 10 193
    Points : 16 751
    Points
    16 751

    Par défaut

    record, si mes souvenirs sont bons, ce sont des éléments du type :

    Code :
    {champ1 : type1 ; ... ; champN : typeN }

    ce ne sont pas des classes très clairement, bien que tu puisses ajouter des méthodes à n'importe quel type F#
    tu peux tester... il n'est pas autorisé de les caster vers obj, alors que s'il s'agissait de classes, on pourrait


    en gros, ce sont des tuples dont les éléments sont nommés... ça évite d'être dépendant de l'ordre dans lequel cela a été défini
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Max.Adorable
    Invité(e)

    Par défaut

    Merci bien pour cette petite précision. Donc si je veux créer un application 3-tiers (je ne sais pas si ça se fait en F#, mais pourquoi pas) j'utilise des objets et pas de records.

    Cependant j'ai encore du mal à transposer un application type 3-tiers dans un langage fonctionnel. Si tu avais un exemple ou quelques idée pour m'éclairer, ce serait gentil.

    Cordialement,
    Max.

  4. #4
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro Nicolas Vallée
    Ingénieur d'études
    Inscrit en
    décembre 2005
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Nom : Homme Nicolas Vallée
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : décembre 2005
    Messages : 10 193
    Points : 16 751
    Points
    16 751

    Par défaut

    jamais fait, il te sera difficile de trouver de la doc francophone


    commences ici :
    http://tomasp.net/blog/aspnet-fsharp-intro.aspx
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  5. #5
    LLB
    LLB est déconnecté
    Membre Expert
    Inscrit en
    mars 2002
    Messages
    962
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 962
    Points : 1 127
    Points
    1 127

    Par défaut

    Citation Envoyé par gorgonite Voir le message
    ce ne sont pas des classes très clairement, bien que tu puisses ajouter des méthodes à n'importe quel type F#
    tu peux tester... il n'est pas autorisé de les caster vers obj, alors que s'il s'agissait de classes, on pourrait
    Perdu
    Tout peut être converti en objet : c'est la fonction box ('a -> obj). Tu as presque raison, quand même : box sur une structure coute un peu, alors que c'est gratuit sur une classe. Mais ce point n'est généralement pas très important (parce qu'on n'est pas sous Java et on possède des generics sans faire du box/unbox 50 fois par seconde).


    En gros, le record (ou structure) sert de tuple nommé, comme ça a été dit. Dans un record, tout est public, il n'y a pas d'héritage, etc. Si tu te limites à des choses simples, le record peut être bien adapté (par exemple, un type coordonnée = {x: int; y: int}). Un avantage, c'est que tu peux faire du pattern matching et manipuler les structures plus facilement :

    Code F# :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    > type coordonnée = {x: int; y: int};;
    type coordonnée = {x: int;
                       y: int;}
    
    > let a = {x = 1; y = 2};;
    val a : coordonnée
    
    > {a with y = 3};;
    val it : coordonnée = {x = 1;
                           y = 3;}
    
    > let f = function
      | {x = 0} -> 0
      | {x = x; y = 0} -> 2 * x
      | c -> c.x + c.y;;
    
    val f : coordonnée -> int

    Les classes permettent de faire des choses plus complexes, mais elles ont tendance à être un peu plus verbeuses.

    Il y a aussi des différences de performance, limite les structures à ce qui est simple. Pour en savoir plus, utilise ton moteur de recherche préféré : C# possède aussi cette différence struct / class.

  6. #6
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro Nicolas Vallée
    Ingénieur d'études
    Inscrit en
    décembre 2005
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Nom : Homme Nicolas Vallée
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : décembre 2005
    Messages : 10 193
    Points : 16 751
    Points
    16 751

    Par défaut

    Citation Envoyé par LLB Voir le message
    Perdu
    Tout peut être converti en objet : c'est la fonction box ('a -> obj).

    ben j'ai pas faux... j'ai parlé de cast, pas d'encapsulation

    sinon Obj.magic et on peut dire qu'on peut caster n'importe quoi en n'importe quoi... et on obtient un résultat proche de n'importe quoi
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  7. #7
    LLB
    LLB est déconnecté
    Membre Expert
    Inscrit en
    mars 2002
    Messages
    962
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 962
    Points : 1 127
    Points
    1 127

    Par défaut

    Au niveau du langage, on voit pas trop la différence :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    > (5 :> obj);;
    val it : obj = 5
    
    > box a;;
    val it : obj = {x = 1;
                    y = 2;}
    
    > (a :> obj);;
    val it : obj = {x = 1;
                    y = 2;}
    
    > (upcast a : obj);;
    val it : obj = {x = 1;
                    y = 2;}
    
    > (Obj.magic a : obj);;
    val it : obj = {x = 1;
                    y = 2;}

  8. #8
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro Nicolas Vallée
    Ingénieur d'études
    Inscrit en
    décembre 2005
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Nom : Homme Nicolas Vallée
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : décembre 2005
    Messages : 10 193
    Points : 16 751
    Points
    16 751

    Par défaut

    Je pensais plus à ceci :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    > let a = 5 :?> obj;;
    
      let a = 5 :?> obj;;
      --------^^^^^^^^^^
    
    stdin(4,8): error: FS0016: The type 'int' does not have any proper subtypes and cannot be used as the source of a type test or runtime coercion.
    stopped due to error
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  9. #9
    LLB
    LLB est déconnecté
    Membre Expert
    Inscrit en
    mars 2002
    Messages
    962
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 962
    Points : 1 127
    Points
    1 127

    Par défaut

    :> est un upcast statique. int étant un sous-type de obj, 3 :> obj est accepté par le compilateur.

    :?> est un downcast dynamique. obj n'étant pas un sous-type de int, 3 :?> obj est refusé à la compilation. En revanche, x :?> int est accepté par le compilateur, si x est de type obj. Une exception est lancée à l'exécution en cas de problème.


    L'expression "x :?> obj" n'a pas de sens.
    Si x a le type obj, l'expression ne fait rien de plus que renvoyer x.
    Dans les autres cas, le compilateur refuse ce code : obj n'est le sous-type de rien. C'est le contraire : tous les types héritent de obj.

  10. #10
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro Nicolas Vallée
    Ingénieur d'études
    Inscrit en
    décembre 2005
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Nom : Homme Nicolas Vallée
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : décembre 2005
    Messages : 10 193
    Points : 16 751
    Points
    16 751

    Par défaut

    Citation Envoyé par LLB Voir le message
    L'expression "x > obj" n'a pas de sens.
    Si x a le type obj, l'expression ne fait rien de plus que renvoyer x.
    Dans les autres cas, le compilateur refuse ce code : obj n'est le sous-type de rien. C'est le contraire : tous les types héritent de obj.

    ben justement, ça prouve bien que les types natifs ne dérivent pas de obj, ce qui était le but de la manoeuvre, non ?
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  11. #11
    LLB
    LLB est déconnecté
    Membre Expert
    Inscrit en
    mars 2002
    Messages
    962
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 962
    Points : 1 127
    Points
    1 127

    Par défaut

    Non, tu fais à l'envers.

    Tu as montré que le type obj ne dérive pas du type int. Ce qui est normal. Si tu remplaces ton entier par une classe, tu obtiens le même résultat.

    Relis mon explication : l'un est un upcast, l'autre un downcast.
    Voir aussi :
    http://research.microsoft.com/fsharp...p.aspx#Upcasts


    PS : si tu n'es pas convaincu, essaie de trouver un exemple où un objet et un entier ne se comportent pas de la même façon.

  12. #12
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro Nicolas Vallée
    Ingénieur d'études
    Inscrit en
    décembre 2005
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Nom : Homme Nicolas Vallée
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : décembre 2005
    Messages : 10 193
    Points : 16 751
    Points
    16 751

    Par défaut

    effectivement, en fait leur int est un System.Int32 et donc un objet... vive les types natifs ^^
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  13. #13
    Max.Adorable
    Invité(e)

    Par défaut

    Merci de vos lumières sur ce sujet.

    Cordialement,
    Max.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •