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

Langage Perl Discussion :

Module Moose - accesseur et mutateur


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 75
    Points : 42
    Points
    42
    Par défaut Module Moose - accesseur et mutateur
    Bonjour,

    J'ai une "encore" une petite question de cours concernant l'utilisation de moose.

    Dans le cour de djibril (que je remercie encore) on à un exemple suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #module Personne.pm
     
    has nom => (
                is => 'ro', # Attribut est lisible et non modifiable
                isa => 'Str', # Valeur de l'attribut de type chaîne de caractères
                required => 1, # Attribut obligatoire
                reader => 'obtenir_nom', # Nom de l'accesseur
                trigger => sub { $NbrPersonnes++; }, # Incrémente à chaque nouvelle personne
                );
    Dans ce que j'ai compris on a par exemple la méthode "'obtenir_nom" qui permet d'obtenir le nom .. ok

    mais uniquement dans le module.

    Car si je veux afficher le nom dans un script principal il faudra donc que je créer à nouveau une méthode pour avoir un accesseur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #script principal
    print Personne->obtenir_nom();

    du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #module Personne.pm
     
    # accesseur obtenir_nom
    sub obtenir_nom {
                                    my $this = shift;
                                    return $this->{_NOM};
                            }
    je trouve ça dommage du coup ou je m'y prend mal quelque chose m'échappe. J'ai l'impression que l' accesseur dans l'objet nom n'est utilisable que dans le module si je comprends bien.



    Je suis en train d'apprendre, donc peut être que je me mélange les pinceaux.


    Je vous remercie

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Non, justement, le fait de simplement déclarer un "reader" dans la définition du nom de ta classe Moose fournit automatiquement l'accesseur que tu peux utiliser dans ton code utilisateur. C'est l'un des avantages de Moose par rapport aux objets Perl bruts, tu n'a même pas besoin de coder ton accesseur, il suffit de le déclarer et Moose le "code pour toi" derrière la scène (et même, dans certains cas, tu n'a même pas besoin de le déclarer, comme l'explique Djibril).

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 75
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Non, justement, le fait de simplement déclarer un "reader" dans la définition du nom de ta classe Moose fournit automatiquement l'accesseur que tu peux utiliser dans ton code utilisateur. C'est l'un des avantages de Moose par rapport aux objets Perl bruts, tu n'a même pas besoin de coder ton accesseur, il suffit de le déclarer et Moose le "code pour toi" derrière la scène (et même, dans certains cas, tu n'a même pas besoin de le déclarer, comme l'explique Djibril).

    bonjour,

    C'est bien ce qui me semblait Moose permet donc d'avoir un accesseur .
    Par contre je vois bien que l'on peut l'utiliser dans "le module", la classe pas de souci. Mais je ne vois pas comme l'appeler dans mon script principal.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    #module Personne.pm
    has nom => (
                is => 'ro', # Attribut est lisible et non modifiable
                isa => 'Str', # Valeur de l'attribut de type chaîne de caractères
                required => 1, # Attribut obligatoire
                reader => 'obtenir_nom', # Nom de l'accesseur QUE JE VOUDRAI UTILISER
                trigger => sub { $NbrPersonnes++; }, # Incrémente à chaque nouvelle personne
                );
    danc ce cas là comment j'appelle mon accesseur dans script principal ?
    (sauf erreur de ma part) dribril dans son cours n'aborbe pas ce cas là (sauf si on crée une méthode dans notre module)

    dans ce cas là on l'appelle par
    Personne->obtenir_nom();

    mais avec la déclaration en utilisant la méthode moose avec le paramètre "reader" je ne comprends pas comment y acceder depuis mon script principal.
    Sauf bien sur en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print $Objet_Personne->{nom};
    en vous remerciant

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    personnellement j'aurais écrit
    reader => '_obtenir_nom', # Nom de l'accesseur QUE JE VOUDRAIS METHODE PRIVÉE d'où le tiret

    et ensuite

    print $Objet_Personne->nom;

    ce qui va déclencher l'appel à la methode privée _obtenir_nom..
    d'autant plus, si tu utilisais la propriété paresseuse "lazy" ... mais c'est une autre histoire.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par vidici Voir le message
    personnellement j'aurais écrit
    reader => '_obtenir_nom', # Nom de l'accesseur QUE JE VOUDRAIS METHODE PRIVÉE d'où le tiret

    et ensuite

    print $Objet_Personne->nom;

    ce qui va déclencher l'appel à la methode privée _obtenir_nom..
    d'autant plus, si tu utilisais la propriété paresseuse "lazy" ... mais c'est une autre histoire.
    j'ai répondu un peu vite, n'ayant pas trop compris la question.. j'ai donc confondu reader avec builder, pensant que tu voulais appliquer des changements au nom en question en interne.
    effectivement reader et writer permettent de donner un nom d'accesseur different de celui que moose prévoit plus simplement.
    veuillez donc ne pas tenir compte de mon intervention, vu que je vois pas où se trouve le problème.

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Un accesseur est par définition une méthode d'interface, il n'y a aucune raison d'en faire une méthode privée. Et il suffit d'appeler cet accesseur depuis le programme utilisateur pour obtenir l'attribut voulu.

    Dans le script utilisateur, une fois que l'on a créé la personne $prof avec le constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my $prof = Homme->new(
      { nom    => 'Tournesol',
        prenom => 'Tryphon',
        age    => 63,
      }
    );
    il suffit d'appeler (dans le programme utilisateur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print "mon nom est " . $prof->obtenir_nom();
    pour afficher le nom, en l'occurrence "Tournesol";

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 75
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Un accesseur est par définition une méthode d'interface, il n'y a aucune raison d'en faire une méthode privée. Et il suffit d'appeler cet accesseur depuis le programme utilisateur pour obtenir l'attribut voulu.

    Dans le script utilisateur, une fois que l'on a créé la personne $prof avec le constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my $prof = Homme->new(
      { nom    => 'Tournesol',
        prenom => 'Tryphon',
        age    => 63,
      }
    );
    il suffit d'appeler (dans le programme utilisateur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print "mon nom est " . $prof->obtenir_nom();
    pour afficher le nom, en l'occurrence "Tournesol";


    MERCI !!!

    Effectivement c'est simplisme navré j'ai l'air d'un idiot mais ça fait un moment que je me casse la tête dessus.
    Merci,ça m'aide beaucoup dans la compréhension...

    je comprenais pas comment y accéder...

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print "mon nom est " . $prof->obtenir_nom();
    pour afficher le nom, en l'occurrence "Tournesol";
    effectivement c'est joli
    c'est plus joli mais plus long
    que d'ecrire tout simplement
    $prof->nom;
    joyeuses fêtes.

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 75
    Points : 42
    Points
    42
    Par défaut
    Merci à tous

    passez de bonne fêtes

  10. #10
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par vidici Voir le message
    effectivement c'est joli
    c'est plus joli mais plus long
    que d'ecrire tout simplement
    $prof->nom;
    Oui, mais si on ne déclare pas explicitement un reader et un writer, l'inconvénient est que, dans ce cas, Moose créera pas défaut une seule fonction servant à la fois d'accesseur et de mutateur pourtant le nom de l'attribut ("nom") et, comme le dit Djibril dans son tuto (et comme le pensent la plupart des experts en POO, indépendamment du langage employé), il est souvent plus judicieux (et plus clair) de distinguer l'accesseur du mutateur (d'avoir deux méthodes différentes).

    Il est vrai cependant que, dans le cas spécifique de la classe Personne en question ici, le nom est en lecture seule et que l'accesseur ne pourra donc pas servir de mutateur, ce qui limite sérieusement la gravité de l'inconvénient. Il reste que "obtenir_nom" est un nom de méthode plus explicite que "nom" (les noms de méthodes avec un verbe sont souvent plus parlants), on sait exactement ce que ça fait et on peut se douter que l'on ne pourra pas s'en servir pour modifier le nom.

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Citation Envoyé par vidici Voir le message
    effectivement c'est joli
    c'est plus joli mais plus long
    que d'ecrire tout simplement
    $prof->nom;
    joyeuses fêtes.
    Le choix du nom de l'accesseur/mutateur revient au concepteur du module s'il estime qu'il faille un nom plus approprié en clarté. Il faut garder à l'esprit que la lisibilité et la clarté sont importantes pour une bonne lecture du code. Alors s'il faut quelques caractères en plus, ce n'est pas gênant.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par djibril Voir le message
    Le choix du nom de l'accesseur/mutateur revient au concepteur du module s'il estime qu'il faille un nom plus approprié en clarté. Il faut garder à l'esprit que la lisibilité et la clarté sont importantes pour une bonne lecture du code. Alors s'il faut quelques caractères en plus, ce n'est pas gênant.
    à priori je ne suis pas trop d'accord.
    obtenir_nom évoque clairement le nom d'une méthode, que je m'attends à trouver parmi les méthodes de la classe ou de sa hiérarchie. Or ce n'est pas le cas, et il va falloir que je me dise "wait a minut! c'est peut être un writer ou un rider" et que je fouille dans les attributs de la classe pour en trouver la trace.
    Si j'ecris $prof->nom; ou $prof->nom('tournesol'); pour moi en tous cas, c'est plus clair.

  13. #13
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    On ne va pas faire un débat sur le nom des accesseur/mutateur (méthodes), hein !
    Pour être le plus clair et propre possible, on aurait dû avoir get_nom, set_nom, mais vu que l'on est francophone, j'ai choisi obtenir_nom et j'aurais pu rajouter modifier_nom. Bien évidement, à ce code, il aurait fallu rajouter de la documentation POD qui explique chacune des méthodes...
    Tout cela pour dire que Moose te laisse la possibilité de faire comme tu le souhaites. Maintenant, quand tu développes un module, il faut penser aux personnes les utilisant en étant le plus clair possible.

    Pour aller dans l'extrême inverse, autant golpher .

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par djibril Voir le message
    Maintenant, quand tu développes un module, il faut penser aux personnes les utilisant en étant le plus clair possible.
    Dans ce cas effectivement, tout le monde n'est pas censé savoir comment fonctionne moose.
    Cela dit, pourquoi j'aime Moose ? parce qu'il me fournit un cadre de développement objet hyper simple et efficace qui me conduit à penser attribut d'abord. En particulier le fait qu' "un nom d'attribut égal un nom de fonction" fait qu'une classe est pratiquement construite quand les attributs de la classe sont définis ..Wouahou!
    Et là que me dit on ?
    Oui... mais c'est pas bien, il faut fait faire des get_setter plus classique ...
    alors moi je ronchonne. (même si je pense que c'est bien que moose le permette)

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

Discussions similaires

  1. Accesseurs et mutateurs
    Par boobaie dans le forum Général Java
    Réponses: 2
    Dernier message: 05/12/2012, 13h25
  2. Mutateur et accesseur sur énumération
    Par stallaf dans le forum Débuter
    Réponses: 13
    Dernier message: 17/08/2010, 13h44
  3. Accesseur de collection dans un module de classe
    Par in dans le forum Général VBA
    Réponses: 4
    Dernier message: 17/08/2007, 18h09
  4. [Doc] Mutateurs/Accesseurs PHP5, comment faites vs ?
    Par ePoX dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 28/02/2006, 01h34
  5. Outils pour creer les accesseurs et les mutateurs
    Par MarieMtl dans le forum MFC
    Réponses: 3
    Dernier message: 03/10/2005, 17h03

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