Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 11 sur 11
  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 Nicolas Vallée
    Ingénieur d'études
    Inscrit en
    décembre 2005
    Messages
    10 162
    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 162
    Points : 18 669
    Points
    18 669

    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 Expert
    Inscrit en
    mars 2002
    Messages
    962
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 962
    Points : 1 160
    Points
    1 160

    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
    Rédacteur
    Avatar de SpiceGuid
    Homme Profil pro Damien Guichard
    Inscrit en
    juin 2007
    Messages
    1 569
    Détails du profil
    Informations personnelles :
    Nom : Homme Damien Guichard
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : juin 2007
    Messages : 1 569
    Points : 2 571
    Points
    2 571

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

  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
    Candidat au titre de Membre du Club

    Inscrit en
    août 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 8
    Points : 11
    Points
    11

    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 Nicolas Vallée
    Ingénieur d'études
    Inscrit en
    décembre 2005
    Messages
    10 162
    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 162
    Points : 18 669
    Points
    18 669

    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
    Candidat au titre de Membre du Club

    Inscrit en
    août 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 8
    Points : 11
    Points
    11

    Par défaut

    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 ?

  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 160
    Points
    1 160

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

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
  •