[Bioperl-l] Re: Automatic generation of set and get methods
Allen Day
allenday@ucla.edu
Fri, 15 Nov 2002 00:16:08 -0800 (PST)
this is related to the dashed params issue i had raised in an earlier
thread -- you can't really have method names starting with dashes, and it
would be nice to autogenerate methods.
i think it would be nice to have a class in Bio::Root:: that either
depended on, or provided similar function to, either Class::MakeMethods or
Class::MethodMaker.
just my 2c.
-Allen
On Thu, 14 Nov 2002, Hilmar Lapp wrote:
>
>
> > -----Original Message-----
> > From: Lincoln Stein [mailto:lstein@cshl.org]
> > Sent: Thursday, November 14, 2002 12:12 PM
> > To: natg@shore.net
> > Cc: bioperl-l@bioperl.org; lstein@lsjs.org; jgrg@sanger.ac.uk
> > Subject: [Bioperl-l] Re: Automatic generation of set and get methods
> >
> [...]
> > One problem with the code you quote from Bio::Index::Abstract
> > is that it
> > provides no way to unset an instance variable. For example:
> >
> > $object->foo(undef);
> >
> > will *NOT* work, because the argument is undefined. I
> > consider this a
> > misfeature. We had a thread about this on bioperl-l mailing
> > list a month or
> > so ago and I'm surprised it isn't fixed by now.
>
> Every developer is more than welcome to fix it, and fellow core people even more so.
>
> My personal take on this is that I will not go into everyone else's code and change his/her getter/setters. For my own code I do employ both idioms. It's not that seldom that I don't want an attribute's value to be changeable to undef.
>
> > A better
> > idiom is this:
> >
> >
> > *$func = sub {
> > my $self = shift;
> > my $current = $self->{$field};
> > $self->{$field} = shift if @_;
> > return $current;
> > }
> >
> > This also has the advantage of preserving the semantics of
> > simultaneous get-and-set, and is consistent with LWP and other widely used
> > modules. The get part returns the existing value of the field, and the set
> > part sets the new value.
>
> The conclusion of said thread was that in Bioperl you should not rely on the return value of a set call. I'm not in favor of making returning the previous value a supported convention - I think it creates an unnecessary burden on code review.
>
> > >
> > > This seems so elegant, I wonder why it's not used
> > everywhere in BioPerl.
> > > Is there some hidden problem?
>
> My personal take on this is whether this is elegant or not is a matter of personal taste; to me for instance it's not. There is a risk of things becoming obfuscated to other programmers, but that's maybe my personal opinion only. I'm a strong proponent of explicit software APIs and code. I have to say that never in my programming life have I really experienced writing getter/setters to be the time-limiting factor. Overall design, writing the business logic, fixing the bugs, and writing the documentation take 98% of the whole time, not writing getter/setters. Writing those is quite boring, but it's not time consuming. YMMV though.
>
> -hilmar
> _______________________________________________
> Bioperl-l mailing list
> Bioperl-l@bioperl.org
> http://bioperl.org/mailman/listinfo/bioperl-l
>