I almost got the ideas with all your replies, thanks.

On 7/20/06, D. Bolliger <[EMAIL PROTECTED]> wrote:
Hi Ken

Ken Perl am Mittwoch, 19. Juli 2006 12:04:
> ok, let me explain what I mean.

Better done by inline/bottom posting, if you already got a bottom answer :-)

> $account = new Account;
> then I can get the currency of the two countries,
> $account->currency_us;
> $account->currency_fr;
>
> after I freeze the code, a new country jumps out, suppose i need
> support Iraq, but now I can't use this,
> $account->currency_iraq;
> If I want to support this method, I have to modify the constructor
> again to add the new country, but what I am looking for is the
> solution that doesn't need to modify the constructor again.

If I don't misunderstand you, you are looking for a lookup class to find out
the currency of countries, and the (country, currency) pairs are defined in a
database.

You have two "variables" here:
1) the number of (country, currency) pairs
2) the information needed to access the underlying database table

sub new {
  my $class=shift;
  my $dbh=shift; # of DBI class
  my ($tablename, @fieldnames)[EMAIL PROTECTED] # if this flexibility needed

  my %pairs;
  # initialize %pairs (country, currency) from database

  return bless \%pairs, $class;
}

sub currency {
  my ($self, $country)[EMAIL PROTECTED];
  return exists $self->{$country}
    ? $self->{$country}
    : undef;
}

The usage of this class is not easy because of the many arguments to new().
But it's enough flexible as to not need changes.

For easier usage, you could derive a class that encapsulates most or all
arguments to new() of the base class (by hardcoding it, by using a
configfile).

But I'm a bit in doubt as to whether there is not a simpler solution...

Maybe this gives you an idea?
And sorry for my bad english :-)


Dani

[history]
> On 7/19/06, Rob Dixon <[EMAIL PROTECTED]> wrote:
> > Ken Perl wrote:
> > > I find a difficulty when writing the constructor which may has dynamic
> > > and non fixed number of properties, say we want to construct a new
> > > class Account,
> > >
> > > package Account;
> > >
> > > sub new {
> > >  my $class = shift;
> > >  my $self = { currency_us=>undef,
> > >                     currency_fr =>undef,
> > >  };
> > >  bless $self, $class;
> > >  return $self;
> > > }
> > >
> > > If we want to create new object with more other contries' currency and
> > > don't want to modify the code, for example, get more other contries'
> > > name from database, how to write my constructor method and it can live
> > > with the dynamic database?
> >
> > I'm unclear what you want. I don't see how you an do anything without
> > modifying the code. Do you mean you want to subclass Account?
> >
> > Suppose you have a list of currencies in @currencies (I can't explain how
> > to get it there as I don't know where it's coming from) you can add these
> > to your object with:
> >
> >    my @currencies = qw/ currency_uk currency_gr currency_sp /;
> >
> >    @[EMAIL PROTECTED] = ();
> >
> > Does this help at all?
> >
> > Rob
> >
> > --
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> > <http://learn.perl.org/> <http://learn.perl.org/first-response>
>
> --
> perl -e 'print unpack(u,"62V5N\"FME;G\!E<FQ`9VUA:6PN8V]M\"[EMAIL PROTECTED]
> ")'

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>





--
perl -e 'print unpack(u,"62V5N\"FME;G\!E<FQ`9VUA:6PN8V]M\"[EMAIL PROTECTED]
")'

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to