Bill Ward ha scritto:
On 9/4/07, Giacomo Cerrai <[EMAIL PROTECTED]> wrote:
A typical case I feel the need for that is when you have a hierarchy of
classes where you deal with a lot of data fields and you name them with
class data members:

     our FIELDNAME1 = 'field1';
     our FIELDNAME2 = 'field2';
     ...
     our FIELDNAMEn = 'fieldn';

and then you use them like this:

     foo({param1 => $val,
          fields => { $FIELDNAME1 => $val1,
                      $FIELDNAME2 => $val2,
                      ...
                      $FIELDNAMEn => $valn,
                     },
          });
     ...
     foreach my $field ($FIELD4, $FIELD2, ..., $FIELD10) {
     ...

With accessor methods this would be considerably more verbose:

     foo({param  => $val,
          fields => { $SomeClass->FIELDNAME1 => $val1,
                      $SomeClass->FIELDNAME2 => $val2,
                      ...
                      $SomeClass->FIELDNAMEn => $valn,
                     },
          });
     ...
     foreach my $field ($SomeClass->FIELD4, $SomeClass->FIELD2, ...,
$SomeClass->FIELD10) {
     ...

This becomes quickly unreadable and is not lazy.
Furthermore every fieldname access is a method call which is too much
overhead, especially when you have many fields to deal with.

If you put the field names into an array (or hash) then it becomes a lot easier.

      our @FIELDNAMES = ( ... );
      sub fieldnames { @FIELDNAMES };

      my %fields;
      my @names = $SomeClass->fieldnames();
      @[EMAIL PROTECTED] = ($val1, $val2, ..., $valn);
      foo({param1 => $val, fields => \%fields );
      ...
      foreach my $field (@{$SomeClass->fieldnames()}) {
      ...

The set of fields a statement works on is not always the same.
Notice that the fields passed to foo() and the fields used in the
foreach are different.

cheers,
Giacomo


Reply via email to