Thread OOP, Parameter fuer Konstruktor pruefen (9 answers)
Opened by styx-cc at 2007-12-14 15:55

Strat
 2007-12-15 12:49
#103936 #103936
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich wuerde die Initialisierung in eine eigene sub namens init packen; dann hat der User die Wahl, ob er den Kram gleich beim new mitgeben will oder erst beim init. Dann würde ich object interface methoden schreiben, ueber die auf die einzelnen Attribute zugegriffen werden koennen (und das dann innerhalb der Klasse auch machen)
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
my @objectInterfaceMethods = qw( db user pass db_handle );

foreach my $method ( @objectInterfaceMethods ) {

    # anonyme sub erzeugen
    my $sub = sub {
        my( $self, @params ) = @_;

        $self->{ $method } = $params[0] if @params;

        return $self->{ $method };
    }; # sub

    # sub in der symboltabelle unter dem Namen $method verankern
    no strict 'refs';
    *{ $method } = $sub;

} # foreach

sub new {
    my( $class, @params ) = @_;

    croak 'class name needed in constructor' if ref $class;

    my $self = bless( {}, $class );

    $self->init( @params ) if scalar @params;

    return $self;
}

sub init {
    my( $self, %params ) = @_;

    foreach my $param ( keys %params ) {
        if( $self->can( $param ) ) {
            $self->$param( $params{$param} );
        }
        else {
            croak( "Invalid param '$param'" );
        }
    } # foreach

   # hier eventuell noch ueberpruefen, ob alle benoetigten parameter gesetzt sind
   # ...

  $self->connect();

  return $self;
}

sub connect {
    my $self = shift;
    my $dbh = DBI->connect("dbi:mysql:" . $self->db, 
                                                $self->user, 
                                                $self->pass)
                     or croak "DB-error: $DBI::errstr\n";
    $self->db_handle( $dbh );

    return $self;
}

dann hast du es einfacher, den Kern (hier hashRef) jederzeit auszutauschen


----
Modedit Gwendragon:
Quellcode repariert wg. inkorrektem Highlighting
----
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/

View full thread OOP, Parameter fuer Konstruktor pruefen