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 :

F# - Orienté Objet


Sujet :

F#

  1. #1
    Max.Adorable
    Invité(e)
    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?

  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
    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

  3. #3
    Max.Adorable
    Invité(e)
    Par défaut
    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.

  4. #4
    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
    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.

  5. #5
    Max.Adorable
    Invité(e)
    Par défaut
    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.

  6. #6
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    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: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  7. #7
    Max.Adorable
    Invité(e)
    Par défaut
    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.

  8. #8
    Membre à l'essai

    Profil pro
    Inscrit en
    Août 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 8
    Points : 13
    Points
    13
    Par défaut
    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.

  9. #9
    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 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

  10. #10
    Membre à l'essai

    Profil pro
    Inscrit en
    Août 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 8
    Points : 13
    Points
    13
    Par défaut
    On pourrait imaginer un langage comme ça non ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let fresh_ident =
      let n = ref 0
      fun s -> incr n; s + string !n

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

Discussions similaires

  1. Définitions de programmation impérative et orientée objet
    Par sjrd dans le forum Langages de programmation
    Réponses: 10
    Dernier message: 10/09/2005, 19h32
  2. Stack OverFlow ou Violation d'adresse - Orienté Objet
    Par JakeGrafton dans le forum Langage
    Réponses: 7
    Dernier message: 31/05/2005, 16h34
  3. [DEBUTANT] Conseil sur la programmation orienté objet
    Par etiennegaloup dans le forum Langage
    Réponses: 7
    Dernier message: 27/05/2005, 12h59
  4. Réponses: 2
    Dernier message: 01/05/2005, 14h43
  5. [SGBDOO] Base de données orientée objet
    Par Jaona dans le forum Décisions SGBD
    Réponses: 19
    Dernier message: 14/04/2003, 11h07

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