The code above is quite truncated, but I'll bet you get the idea of how things are working.package Group; use strict; use warnings; use Person; sub new { my $proto = shift; my $class = ref( $proto ) || $proto; my $self = { 'group_id' => 0, 'name' => '', '_members' => [], }; bless( $self, $class ); return $self; } sub get_members { my $self = shift; my $members = $dbh->selectcol_arrayref('SELECT person_id FROM grou +p_member WHERE group_id = ' . $self->id()); foreach my $person_id ( @{$members} ) { push( @members, Person->new($person_id) ); } return \@members; } 1;
_Person.pmpackage Person; use strict; use warnings; use _Person; sub read { my $self = shift; my $id = shift || []; return [] unless ( $id ); my @objects = (); my $stRead = $dbh->prepare('SELECT person_id, firstname, lastname +FROM person WHERE person_id IN (' . join(', ', @{$id}) . ')'); $stRead->execute(); while ( my ($person_id, $firstname, $lastname) = $stRead->fetchrow +() ) { my $Person = _Person->new(person_id => $person_id, firstname => $firstname, lastname => $lastname); push( @objects, $Person ); } $stRead->finish(); return ( wantarray ) ? @objects : pop( @objects ); } 1;
Now, Group.pm's get_members() method would look something like this:package _Person; use strict; use warnings; sub new { my $proto = shift; my $class = ref( $proto ) || $proto; my $self = { 'person_id' => 0, 'firstname' => '', 'lastname' => '', }; $self->_init( @_ ); return $self; } sub _init { my $self = shift; my %args = @_; return unless ( %args ); $self->person_id( $args{'person_id'} ); $self->firstname( $args{'firstname'} ); $self->lastname( $args{'lastname'} ); } sub person_id { my $self = shift; my $data = shift; $self->{'person_id'} = $data if ( defined $data ); return ( defined $self->{'person_id'} && $self->{'person_id'} =~ m +,^\d+$, ) ? $self->{'person_id'} : 0; } sub firstname { # Same as person_id(), except the obvious } sub lastname { # Same as person_id() and firstname(), except the obvious } 1;
This way, generating many Person objects requires only one call to the database.sub get_members { my $self = shift; my $members = $dbh->selectcol_arrayref('SELECT person_id FROM grou +p_member WHERE group_id = ' . $self->id()); return Person->read( $members ); }
In reply to Battling with OOP performance by Evil Attraction
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |