9.13 Getters That Double as Setters


Another alternative to the pattern of creating two different methods for getting and setting a parameter is to create one method that notes whether or not it gets any additional arguments. If the arguments are absent, it's a get operation; if the arguments are present, it's a set operation. A simple version looks like:

 sub color {   my $shift;   if (@_) {              # are there any more parameters?     # yes, it's a setter:     $self->{Color} = shift;   } else {     # no, it's a getter:     $self->{Color};   } } 

Now you can say:

 my $tv_horse = Horse->named("Mr. Ed"); $tv_horse->color("black-and-white"); print $tv_horse->name, " is colored ", $tv_horse->color, "\n"; 

The presence of the parameter in the second line denotes that you are setting the color, while its absence in the third line indicates a getter.

While this strategy might at first seem attractive because of its apparent simplicity, it complicates the actions of the getter (which will be called frequently). This strategy also makes it difficult to search through your listings to find only the setters of a particular parameter, which are often more important than the getters. In fact, we've been burned by this in the past when a setter became a getter because another function returned more parameters than expected after an upgrade.



Learning Perl Objects, References & Modules
Learning Perl Objects, References, and Modules
ISBN: 0596004788
EAN: 2147483647
Year: 2003
Pages: 199

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net