[Toulouse-pm] Un tutorial OO pas mal

Michel Rodriguez mirod at xmltwig.com
Fri Dec 13 04:46:01 CST 2002


On Fri, 2002-12-13 at 10:07, Paul Gaborit wrote:

> Quant à la réponse d'Abigail, elle est intéressante mais ne convient 
> pas dans tous les cas. En particulier, lorsqu'on veut faire un "dump" 
> ou une "sérialisation" de l'objet. Il ne contient pas ses attributs ! 
> Cela me semble être un problème. Il faut donc ajouter une méthode de 
> sérialisation qui doit être modifiée à chaque ajout d'attribut...

La methode de serialization peut etre simple, il suffit de stocker la
liste des hash qui contiennent les attributs et de la parcourir. Si on
veut vraiment faire OO on peut remplacer les adresses des hash par les
adresses des methodes qui donnent la valeur des attributs. On pourrait
aussi faire encore plus sioux et generer les noms des methodes a partir
des noms des champs (ca marche pas ici a cause de 'is_approved', mais si
on avait toujours 'get<att>' par example un petit coup de ' eval
"get_$field->($self)" ' devrait bieng marcher (mais pas vite)).

Voila l'exemple d'Abigail avec les 2 methodes (et une typo corrigee dans
l'original):


#!/usr/bin/perl -w
use strict;

use Data::Dumper;

my $quote= Quote->new();
$quote->set_phrase( q{I don't know if it's what you want, but it's what
you get.  :-)});
$quote->set_author( q{Larry Wall});
$quote->is_approved( 1);

my %serialized= $quote->serialize;
print Dumper \%serialized;

my %oo_serialized= $quote->oo_serialize;
print Dumper \%oo_serialized;

package Quote;

use strict;   
use warnings;

my (%phrase, %author, %approved);
my %fields;
BEGIN { %fields= ( phrase => \%phrase, author => \%author, approved =>
\%approved); }

my %serialize_att;
BEGIN { %serialize_att= ( phrase => \&get_phrase, author =>
\&get_author, approved => \&is_approved); }


sub new {   
    bless [] => shift;   # Any reference will do.
}

sub serialize {
    my $self= shift;
    return map { $_ => $fields{$_}{$self} } keys %fields;
}
    
sub oo_serialize {
    my $self= shift;
    return map { $_ => $serialize_att{$_}->($self) } keys %fields;
}
    
sub set_phrase {
    my $self   = shift;
    my $phrase = shift;
    $phrase {$self} = $phrase;
}

sub get_phrase {
    my $self   = shift;
    return $phrase {$self};
}

sub set_author {
    my $self   = shift;
    my $author = shift;
    $author {$self} = $author;
}

sub get_author {
    my $self   = shift;
    return $author {$self};  
}

sub is_approved {
    my $self = shift;
    @_ ? $approved {$self} = shift : $approved {$self};
}

    
sub DESTROY {
    my $self = shift;
    delete $phrase   {$self};
    delete $author   {$self};
    delete $approved {$self};
}


-- 
Michel Rodriguez <mirod at xmltwig.com>



More information about the Toulouse-pm mailing list