Bioperl: Parameter tag style

Steve A. Chervitz sac@genome.stanford.edu
Thu, 8 Jan 1998 13:13:33 -0800 (PST)


Georg comments:

> You write
> >>>>>>
> $aln = new Bio::Tools::UnivAln(SEQS =>\@seqs);
> <<<<<<
> I guess you modified _rearrange this way -- but it really sucks
> during code development if you can no longer change names by s/seqs/foobar/g
> but need s/SEQS/FOOBAR/g as well -- why not do
> $aln = new Bio::Tools::UnivAln(seqs =>\@seqs);

I didn't modify _rearrange() at all. The statements below are equivalent:
 $aln = new Bio::Tools::UnivAln(SEQS =>\@seqs);
 $aln = new Bio::Tools::UnivAln(-seqs =>\@seqs);

The first thing _rearrange() does is to strip off the hyphens from the 
parameter tags and capitalize them, (so, in principle, I'm saving 
_rearrange() the extra work!). But this brings up a good issue that I would 
like your comments on. I decided to use ALL CAPS for named parameters for 
these reasons:

  1) A naming conflict can occur if a module has a method with the same 
name as a parameter. For example, if I call $fooObj->get(-file=>'readme')
and module Foo.pm defines a sub file {...}, perl may generate a 
warning that it interpreted the -file parameter name as -&file. I say 
"may" because sometimes perl seems to do the right thing and interpret 
-file as '-file'. But I have seen cases where this fails. I haven't 
been able to pin-point why, though (any ideas?). Using ALL CAP tags 
guarantees this ambiguity won't occur (except perhaps for DESTROY). 
Explicitly single quoting all parameter tags is the safest way to go, but is 
cumbersome. 

  2) I find ALL CAP parameter tags to be more readable within code. The 
parameter settings really stand out nicely.

  3) All caps conveys the idea that the tag is a special entity that is 
defined for you. This is consistent with the use of all cap things 
provided by perl (e.g., __END__).

  4) Other modules use the ALL CAP tag convention, though still other 
modules use the -tag convention. I haven't found any recommendation about 
this in the Perl style guidelines (consistent with the "more than one way 
to do it" motto). Honestly, I haven't used enough different modules to get an 
idea for which style is the most widely used. 

Notwithstanding all the above, I feel it is important that all modules 
under the aegis of Bioperl should use the same convention for all public 
methods. Using _rearrange() which supports both parameter naming styles 
is one possiblity, which allows the end user to chose the style that 
works best for them. However, calling _rearrange() for every method would 
be inefficient. Imposing a requirement that all constructors read their 
parameters via _rearrange() (or support both styles some other way) may 
be reasonable. 

Still, there is much to be said for choosing one style and sticking with 
it across all modules. It creates cleaner code and less confusion for users. 
I would argue for the ALL CAP tag style since I find it more readable and 
it solved a problem I had with the -tag style while developing and working 
with my extended module library. 

Opinions welcome!
SteveC

=========== Bioperl Project Mailing List Message Footer =======
Project URL: http://www.techfak.uni-bielefeld.de/bcd/Perl/Bio/
To unsubscribe: send email to majordomo@lists.uni-bielefeld.de with message body
unsubscribe vsns-bcd-perl
Please use the account from which you subscribed, or try:
unsubscribe vsns-bcd-perl <old email-address>
To subscribe: send email to majordomo@lists.uni-bielefeld.de with message body
subscribe vsns-bcd-perl
Administrativa: send email to vsns-bcd-perl-owner@lists.uni-bielefeld.de
====================================================================