Précédent   Forum du club des développeurs et IT Pro > Autres langages > Langages fonctionnels > F#
F# Forum d'entraide sur la programmation en langage fonctionnel F#
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 10/02/2009, 11h48   #1
Max.Adorable
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Par défaut F# - Orienté Objet

Bonjour à tous,

J'ai lu récemment un article concernant la programmation orienté objet en F# :
http://weblogs.asp.net/podwysocki/ar...g-classes.aspx

Et je trouve la POO en F# vraiment intéressante. Cependant quelques questions me taraude. Le fait d'avoir, dans la majorité des cas, des objets immuables ne va-t-il pas impacter les performances?
  Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2009, 11h51   #2
gorgonite
Rédacteur/Modérateur

 
Avatar de gorgonite
 
Homme Nicolas Vallée
Ingénieur d'études
Inscription : décembre 2005
Messages : 9 963
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Vallée
Âge : 28
Localisation : France

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

Informations forums :
Inscription : décembre 2005
Messages : 9 963
Points : 18 157
Points : 18 157
Citation:
Envoyé par Max.Adorable Voir le message
Et je trouve la POO en F# vraiment intéressante. Cependant quelques questions me taraude. Le fait d'avoir, dans la majorité des cas, des objets immuables ne va-t-il pas impacter les performances?

pas forcemment... tout dépend de ce que tu vas faire avec
__________________
Evitez les MP pour les questions techniques... il y a des forums
Contributions sur DVP : Mes Tutos | Mon Blog
gorgonite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2009, 12h02   #3
Max.Adorable
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Je développe principalement des applications CRUD et sites web. Les classes représentent surtout des entités persistantes (en base de données la plupart du temps).
Je garde une approche par module pour les services en remplacement aux multiples classes aux méthodes statiques (bien que les modules F# soit compilé comme tel).

Max.
  Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2009, 14h15   #4
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 962
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 962
Points : 1 148
Points : 1 148
Si tu as besoin de modifier des variables, rien ne t'empêche de le faire.
Tu peux aussi faire du fonctionnel pur, sans utiliser d'objet.

Tu peux faire un peu comme tu veux, il est toujours possible d'avoir de bonnes performances (évidemment, si tu as un objet très lourd et que tu passes ron temps à le dupliquer, ça risuqe d'être lent).

Pour une réponse plus précise, il faudra une question plus précise.
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2009, 16h00   #5
Max.Adorable
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Il n'y a pas longtemps j'ai réécris en F# un système de cache que j'avais écris en VB.Net pour le boulot et j'ai été agréablement surpris pas le temps passé, la quantité de code et les performances de cette nouvelle version.

Aus vu de ce résultat, je me suis donc mis à réfléchir sur la réécriture d'une application de type CRUD. Le problème est que j'ai toujours appris à penser objet et donc l'approche fonctionnel non-objet bloque un peu.

Comment représenter des entités (tables en base de données) en fonctionnel et les relations entre ces entités. Dans ce genre de cas l'objet me semble le plus approprié (maintenant le fonctionnel est tout nouveau pour moi).

Est-il possible de faire de l'orienté objet fonctionnel? Si oui comment ?

Merci d'avance.
Max.
  Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2009, 18h05   #6
SpiceGuid
Rédacteur
 
Avatar de SpiceGuid
 
Homme Damien Guichard
Inscription : juin 2007
Messages : 1 512
Détails du profil
Informations personnelles :
Nom : Homme Damien Guichard
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : juin 2007
Messages : 1 512
Points : 2 495
Points : 2 495
La mixité de l'objet et du fonctionnel ne se fait pas en déclarant des classes qui seraient à tout prix immuables.

La mixité se fait en préservant l'existant sur certaines parties de l'application (typiquement ce sont les parties qui impliquent d'autres composants dotnet) tout en repensant certaines autres parties de façon purement fonctionnelle, sans objets ou avec peu d'objets (typiquement les parties plus riches en spécifications et plus pauvres en interactivité).

La transition peut se faire de façon incrémentale, en donnant la priorité aux parties où le bénéfice est le plus évident tout en touchant peu ou pas les parties où tu as des doutes sur l'approche à adopter.

À mon avis, sur dotnet, il faut voir le fonctionnel plutôt comme une option qui éventuellement est une bonne idée de conception ou de refactoring.
Il faut garder à l'esprit que dotnet est par nature une plateforme à objets et donc le fonctionnel n'est pas une fin en soi mais un moyen d'améliorer la qualité en abaissant la complexité sémantique des applications.
__________________
Du même auteur: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo.
Avant de poser une question je lis les règles du forum.
SpiceGuid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2009, 08h52   #7
Max.Adorable
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Citation:
Envoyé par SpiceGuid Voir le message
La mixité de l'objet et du fonctionnel ne se fait pas en déclarant des classes qui seraient à tout prix immuables.
oui ça je m'en doutais

Merci pour les précisions.

Max.
  Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2009, 13h49   #8
Quentin_
Candidat au titre de Membre du Club
 
Inscription : août 2009
Messages : 8
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 8
Points : 11
Points : 11
Bonjour,

Pourquoi le fonctionnel et l'objet seraient incompatibles ?
A priori je ne vois pas pourquoi on ne peut pas mélanger ces deux concepts.
Quentin_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2009, 14h48   #9
gorgonite
Rédacteur/Modérateur

 
Avatar de gorgonite
 
Homme Nicolas Vallée
Ingénieur d'études
Inscription : décembre 2005
Messages : 9 963
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Vallée
Âge : 28
Localisation : France

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

Informations forums :
Inscription : décembre 2005
Messages : 9 963
Points : 18 157
Points : 18 157
Citation:
Envoyé par Quentin_ Voir le message
Pourquoi le fonctionnel et l'objet seraient incompatibles ?
A priori je ne vois pas pourquoi on ne peut pas mélanger ces deux concepts.

il faudrait des objets immutables... si on veut rester avec du fonctionnel pur

la POO implique souvent la notion d'état interne modifié, de manière invisible au développeur (boite noire), et fonctionnel fait parfois mauvais ménage avec effets de bords
__________________
Evitez les MP pour les questions techniques... il y a des forums
Contributions sur DVP : Mes Tutos | Mon Blog
gorgonite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2009, 21h00   #10
Quentin_
Candidat au titre de Membre du Club
 
Inscription : août 2009
Messages : 8
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 8
Points : 11
Points : 11
On pourrait imaginer un langage comme ça non ? :
Code :
1
2
3
4
5
6
7
8
9
10
11
class Voiture
(
  public nom = ""

  public let edit_nom s = 
     nom := (s^" 403")
)
let v = new Voiture
let v = v.edit_nom("speciale canne")
print_string (v.nom);
L'opérateur d'assignation `:=` ne modifie pas directement la variable, il en créé une autre du même nom (pas d'effets de bord donc).

La seule différence, ça serait qu'au lieu de faire v.edit(), on ferait let v = v.edit(), qui recréerait un nouvel objet.

On pourrait par la suite autoriser cette syntaxe :
v.edit("ok")

Qui serait équivalente à :
let v = v.edit("ok"), c'est à dire sans effets de bords.

Qu'est-ce que vous en pensez ?
Quentin_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2009, 00h32   #11
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 962
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 962
Points : 1 148
Points : 1 148
Oui, on peut mélanger objet et fonctionnel.

Au niveau de F#, les entiers sont des objets, tout comme les types somme, etc. L'objet string possède plein de méthodes, mais il reste entièrement pur (contrairement à Caml !). Cela ne pose aucun problème, bien au contraire.

Quant on commence à faire une modélisation objet, comme on en voit souvent en Java, C++, etc., on a souvent tendance à vouloir des valeurs mutables. Recopier tout l'objet n'est pas toujours une solution souhaitable. Cela dit, même s'il faut se méfier des effets de bord, avoir du code pur n'est pas forcément un objectif.

La fonction suivante n'est pas très dangereuse :
Code :
1
2
3
let fresh_ident =
  let n = ref 0
  fun s -> incr n; s + string !n
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h11.


 
 
 
 
Partenaires

Hébergement Web