--- Nicole Seitz <[EMAIL PROTECTED]> wrote: > Hi there! > > I've just started to learn OOP with Perl.With the help of perltoot I wrote a > class Person and some methods(see below).
'perltoot' is great, but there are a few things that can be done differently. Admittedly, it's aimed at beginners, so I can't take *too* much issue with it :) First, here's what I think is a cleaner way of writing the constructor: sub new { my $class = shift; my %self = map {$_ => undef} qw(CNAME SNAME STREET CITY PHONE EMAIL); return bless \%self, $class; } Note how that compares to the following: > sub new { > my $self = {}; > my $proto = shift; > my $class = ref($proto) || $proto; > $self->{CNAME} = undef; > $self->{SNAME} = undef; > $self->{STREET} = undef; > $self->{CITY} = undef; > $self->{PHONE} = undef; > $self->{EMAIL} = undef; > > bless ($self, $class); > return $self; > } The "ref($proto) || $proto" line, unfortunately, should *not* be there. All it does is allow you to call a constructor on an instance of an object. Typically, that's useful if you want to clone an object (create a new object with the same properties), but that's not being done here and should be left out. > sub cname { > my $self = shift; > if (@_) {$self->{CNAME} = shift } > return $self->{CNAME}; > } [snip] > To store some data in my object I did the follwing: > > use Person; > > $myPerson = Person->new(); > $myPerson->cname("John"); > $myPerson->sname("Smith"); > $myPerson->street("Euston Road"); > $myPerson->city("London"); > $myPerson->phone("414 3344"); > > Do I really need all these methods? Probably. You can rewrite your constructor to handle these properties, but later if a person changes their phone number, you'll want a way to change it. Another way to write the constructor is to assign the arguments when you run the program: sub new { my $class = shift; my %self = map { $_ => @_ ? shift : undef } qw(CNAME SNAME STREET CITY PHONE EMAIL); return bless \%self, $class; } That's bad, though, because there's no data validation. It's just an example. Change the constructor as above and you can test it: use Data::Dumper; $myPerson = Person->new( 'John', 'Public', '123 Main Street', 'Portland', 'Oregon', '[EMAIL PROTECTED]' ); print Dumper $myPerson; In reality, I would use named arguments to the constructor and test them for validity before assigning them. They should be tested for validity in the constructor, though, and *not* in your code that calls them. That way, when you reuse the object, you don't need to worry about whether or not you forgot to test your args. Cheers, Ovid ===== "Ovid" on http://www.perlmonks.org/ Web Programming with Perl: http://users.easystreet.com/ovid/cgi_course/ Silence Is Evil: http://users.easystreet.com/ovid/philosophy/decency.txt __________________________________________________ Do you Yahoo!? Yahoo! Mail Plus - Powerful. Affordable. Sign up now. http://mailplus.yahoo.com -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]