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 :

Les références en Perl - ou - mes débuts en POO : le constructeur :)


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut Les références en Perl - ou - mes débuts en POO : le constructeur :)
    Hello tout le monde,

    voilà, je commence à m'intéresser un peu à la POO en Perl, et, bien que je sache que les développeurs Perl travaillent toujours proprement, et qu'on a pas besoin de garde fous je voulais, pour ma culture personnelle, développer un peu le fonctionnement des constructeurs... et par extension, des références en Perl d'ailleurs.

    En gros, l'idée est la suivante: grâce aux supers cours/FAQ de ce même site (merci encore à tous les auteurs de la FAQ et des cours que je ne nommerai pas car j'en oublierai sûrement), j'ai commencé à faire une petite classe basique. Pour le constructeur, je passe en paramètre une référence anonyme à une table de hashage contenant les attributs (j'espère avoir le bon vocabulaire =).

    Pour le moment, j'avais 2 attributs :
    1. un scalaire
    2. une table de hashage dont je passe la référence


    Mon "problème", c'est que je voulais pouvoir "recopier" la table de hashage pour éviter de travailler sur la version passée en paramètre. J'ai une solution en utilisant une table temporaire, mais je voulais savoir s'il n'y avait pas quelque chose de plus propre...

    Exemple:
    test.pl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use Data::Dumper;
     
    use Server;
     
    my $cfg_ip='1.2.3.4';
    my %cfg_users=( toto => 'titi' );
     
    my $server = Server->new( {	ip => $cfg_ip,
    				ref_users => \%cfg_users
    			} );
     
    print $server->to_string();
     
    print Dumper(\%cfg_users);
    print $cfg_ip;
    Server.pm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    # --- fichier Server.pm ---
    package Server;
    use strict;
    use warnings;
    use Carp;
     
    # constructeur:
    #  1. nom de la classe (passe automatiquement)
    #  2. adresse ip du serveur
    #  3. tableau de hachage user => mdp
    sub new {
    	my ($classe, $ref_args) = @_;
     
    	# Vérification de la classe
    	$classe = ref($classe) || $classe;
     
    	# Vérification des champs nom, prenom et sexe
    	foreach my $attribut (qw/ ip ref_users /) {
    		croak ("[WARN] Attribut $attribut manquant") unless ( defined $ref_args->{$attribut} );
    	}
     
    	# Création de la référence anonyme de hachage vide (futur objet)
    	my $this = {};
     
    	# Liaison de l'objet à la classe
    	bless ($this, $classe);
     
    	$this->{_IP}	= $ref_args->{ip};
    	$this->{_USERS}	= $ref_args->{ref_users};
     
    	# test modif valeurs pour la portée
    	$this->{_IP} = '4.3.2.1';
    	$this->{_USERS}->{toto} = 'tutu';
     
    	return $this;
    }
     
    # to_string:
    sub to_string {
    	my $this = shift;
     
    	print "$this->{_IP} :\n";
     
    	foreach (sort keys %{$this->{_USERS}}) {
    		printf ("%10s\t%10s\n", $_, $this->{_USERS}->{$_});
    	}
    }
     
    1;
    Exécution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    D:\50-Travail>perl test.pl
    4.3.2.1 :
          toto            tutu
    $VAR1 = {
              'toto' => 'tutu'
            };
    1.2.3.4
    Bon, on voit bien que si je modifie les valeurs dans la classe, l'adresse ip du programme test.pl n'est pas modifiée (normal, je copie la valeur), alors que la hashtable des utilisateurs est modifiée car je passe par une référence... jusque là, ok !

    Maintenant, je souhaitais "protéger" la hashtable en entrée pour éviter ce genre de problème. Je n'ai trouvé qu'une solution, remplacer dans le constructeur ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$this->{_USERS}	= $ref_args->{ref_users};
    par cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	my %tmp_users = %{$ref_args->{ref_users}};
    	$this->{_USERS}	= \%tmp_users;
    Alors ça marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    D:\50-Travail>perl test.pl
    4.3.2.1 :
          toto            tutu
    $VAR1 = {
              'toto' => 'titi'
            };
    1.2.3.4
    mais je trouve pas ça beau

    Un indice ?!

    Merci d'avance.

  2. #2
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Tu as trouvé tout seul la solution. C'est en effet le problème en Perl POO. La protection des attributs ne dépends que de la bonne pratique du développeur.

    Si tu procèdes comme tu l'as fait, ce n'est peut être pas beau encore que ce n'est pas choquant. Le seul souci est peut être que ça nécessite de prendre un peu plus de mémoire.

    Mais tu peux par la suite utiliser des techniques plus avancées comme cela est expliqué dans l'article via l'utilisation d'autres modules. Et là, tu ne te posera plus la question

    Bonne apprentissage

  3. #3
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    mmmh, ok, merci pour l'info

    J'irais voir du côté de Coat quand même si je veux pousser un peu... parce que j'ai un autre trucs qui me chiffonne et pour lequel je ne vois pas de contournement simple : le contrôle des variables passées au constructeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $server = Server->new( {	ip => $cfg_ip,
    				ref_users => \%cfg_users
    			} );
    Si le mec se plante en passant un tableau au lieu d'un scalaire, ou au lieu du hashref ou n'importe quoi, ça fout un peu tout en l'air, et ça me semble complexe à contrôler !

  4. #4
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Non, moi je ne parle pas de Coat. Je te recommande Object::InsideOut.
    Avec Coat ou Moose, c'est sûr que l'écriture est propre, tu peux faire tout tes contrôles. La POO est un peu plus simple. Le seul inconvénient et la protection de l'encapsulation. Mais avec Object::InsideOut, Il est impossible de trifouiller l'objet. Tout est dans l'article.

  5. #5
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Erf, j'avais décider de faire un pause après le paragraphe C de ton tutorial (excellent soit dit en passant, j'espère arriver un jour à maîtriser autant ce langage !)... je commençais à fatiguer pour la suite ;o)

    Bon, j'y retourne !!

  6. #6
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Citation Envoyé par Alek-C Voir le message
    Erf, j'avais décider de faire un pause après le paragraphe C de ton tutorial (excellent soit dit en passant, j'espère arriver un jour à maîtriser autant ce langage !)... je commençais à fatiguer pour la suite ;o)

    Bon, j'y retourne !!


    N'hésite pas à laisser un commentaire ici.

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

Discussions similaires

  1. [XL-2003] lister les références actives de mes classeurs
    Par Henri-gp dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/03/2012, 10h39
  2. [PHP 5.0] Mes débuts en POO
    Par dpmix dans le forum Langage
    Réponses: 18
    Dernier message: 15/01/2010, 10h49
  3. Mes débuts en Perl, un peu d'aide svp
    Par Kiyoshi dans le forum Langage
    Réponses: 7
    Dernier message: 22/09/2008, 10h43
  4. Pb avec les références d'une base de données
    Par Celia1303 dans le forum Access
    Réponses: 8
    Dernier message: 01/12/2005, 15h44
  5. Problème avec les boutons de perl Tk
    Par jkevin2 dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 02/09/2005, 17h18

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