IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

F# Discussion :

Records ou Classe


Sujet :

F#

  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
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    record, si mes souvenirs sont bons, ce sont des éléments du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {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
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    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 expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    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# : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    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 expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Au niveau du langage, on voit pas trop la différence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Je pensais plus à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    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
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    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 expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    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
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    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.

Discussions similaires

  1. Classe et record
    Par pepi22 dans le forum Langage
    Réponses: 10
    Dernier message: 24/02/2009, 18h13
  2. Erreur "Type Record, Object ou Class requis"
    Par gogéta91 dans le forum Débuter
    Réponses: 5
    Dernier message: 31/07/2008, 09h16
  3. Record et classe
    Par Gweta dans le forum Débuter
    Réponses: 5
    Dernier message: 09/01/2008, 11h43
  4. Réponses: 9
    Dernier message: 10/03/2007, 08h39
  5. type record, objerct ou classe requis ?
    Par babou54 dans le forum Delphi
    Réponses: 3
    Dernier message: 10/01/2007, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo