Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

New to Moose :)

7 views
Skip to first unread message

Fabrizio Levorin

unread,
Dec 30, 2011, 5:46:27 AM12/30/11
to
Ciao, sto da poco utilizzando Moose e la programmazione OOP per il
perl.
Una domanda credo proprio da niubbo.

Mettiamo di avere le informazioni di un utente memorizzate in db, io
creo l'oggetto passando l'id e la classe si occupa di ricavare tutte
le altre informazioni dal dabatase.

Avevo creato qualcosa del genere:

package Users;
use Moose;

has 'id' => (
is => 'ro',
isa => 'Str',
required => 1,
trigger => \&_db_info_set,
);

has 'name' => (
is => 'rw',
isa => 'Str',
);

sub _db_info_set {
my $self = shift;
my $name;
... query per ricavare il nome ...
$self->name($name);
}

no Moose;
1;

Questa cosa funziona ma:
1) non so se sia la strategia migliore
2) sono costretto a dichiarare 'name' come rw invece che ro

Qualche suggerimento per la strada giusta da imboccare?
Grazie mille e buona fine d'anno.
Fabrizio

Emanuele Zeppieri

unread,
Jan 4, 2012, 4:00:40 AM1/4/12
to
On Dec 30 2011, 11:46 am, Fabrizio Levorin <flevo...@gmail.com> wrote:

> [...]
>
> Mettiamo di avere le informazioni di un utente memorizzate in db, io
> creo l'oggetto passando l'id e la classe si occupa di ricavare tutte
> le altre informazioni dal dabatase.
>
> Avevo creato qualcosa del genere:
>
> [...]
>
> Questa cosa funziona ma:
> 1) non so se sia la strategia migliore

Se capisco le tue intenzioni, non è la strategia migliore.
Non perché tu stia facendo qualcosa di sbagliato, semplicemente perché
stai reinventando la ruota, visto che in pratica stai implementando un
ORM.

Su CPAN ne trovi tremila, testati su tutti i DBMS più diffusi,
sviluppati attivamente da anni e usati in produzione su progetti di
ogni dimensione.

Il più evoluto al momento è DBIx::Class, che probabilmente già
conosci:
https://metacpan.org/release/DBIx-Class

I suoi oggetti nativi non sono Moose-based, ma puoi facilmente
estenderli con Moose, se ti serve.

> 2) sono costretto a dichiarare 'name' come rw invece che ro

Se gli oggetti di quella classe sono mutabili (ovvero, nell'ottica
dell'ORM, se possono generare update sul db) non c'è niente di male.

Se sono invece immutabili (record in sola lettura, sempre nell'ottica
dell'ORM), allora puoi dichiarare 'name' come 'ro' associandogli un
'builder' (o un 'default'):
https://metacpan.org/module/Moose::Manual::Attributes#Default-and-builder-methods

Se poi vuoi che la totale privatezza dell'attributo, ricordati di
settare anche init_arg=>undef
https://metacpan.org/module/Moose::Manual::Attributes#Constructor-parameters-init_arg-

> Qualche suggerimento per la strada giusta da imboccare?

Se stai veramente tentando di implementare un ORM, non lo fare e usa
DBIx::Class ;-)

> Grazie mille e buona fine d'anno.

Grazie a te e buon inizio.
0 new messages