|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité(e)
Messages : n/a ![]() |
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. |
00
|
|
|
#2 |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 978 ![]() |
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 |
|
|
00
|
|
|
#3 |
|
Invité(e)
Messages : n/a ![]() |
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. |
00
|
|
|
#4 |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 978 ![]() |
jamais fait, il te sera difficile de trouver de la doc francophone
commences ici : http://tomasp.net/blog/aspnet-fsharp-intro.aspx |
|
|
00
|
|
|
#5 | |||
|
Membre Expert
![]() Inscription : mars 2002 Messages : 962 ![]() |
Citation:
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# :
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. |
|||
|
|
00
|
|
|
#6 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 978 ![]() |
Citation:
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
|
|
|
|
00
|
|
|
#7 | ||
|
Membre Expert
![]() Inscription : mars 2002 Messages : 962 ![]() |
Au niveau du langage, on voit pas trop la différence :
Code :
|
||
|
|
00
|
|
|
#8 | ||
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 978 ![]() |
Je pensais plus à ceci :
Code :
|
||
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() Inscription : mars 2002 Messages : 962 ![]() |
:> 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. |
|
|
00
|
|
|
#10 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 978 ![]() |
Citation:
ben justement, ça prouve bien que les types natifs ne dérivent pas de obj, ce qui était le but de la manoeuvre, non ? |
|
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() Inscription : mars 2002 Messages : 962 ![]() |
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. |
|
|
00
|
|
|
#12 |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 978 ![]() |
effectivement, en fait leur int est un System.Int32 et donc un objet... vive les types natifs ^^
|
|
|
00
|
|
|
#13 |
|
Invité(e)
Messages : n/a ![]() |
Merci de vos lumières sur ce sujet.
Cordialement, Max. |
00
|
Copyright © 2000-2013 - www.developpez.com