Thread Klassen-Attribut auch in der Base-Klassen nutzen (5 answers)
Opened by Hagen at 2021-04-14 23:15

Hagen
 2021-04-16 21:14
#193216 #193216
User since
2007-09-06
233 Artikel
BenutzerIn
[default_avatar]
2021-04-15T07:49:36 haj
Der Ansatz ist etwas bergauf gedacht: Eine Eltern-Klasse sollte nicht wissen müssen, ob Kind-Klassen überhaupt existieren und kann daher nicht so einfach auf Daten der Kind-Klasse zugreifen.


Das hatte ich befürchtet bzw. macht auch Sinn. Ich hatte u.a. gehofft, dass man Attribute ähnlich wie Methoden überschreiben könnte.


2021-04-15T07:49:36 haj
Die Methode getTable wird in der Eltern-Klasse dann oft so implementiert, dass sie nicht leer ist, sondern lautstark stirbt, um klarzumachen, dass Kind-Klassen hier etwas zu tun gehabt hätten.


Ja, das habe ich in anderer Stelle gemacht bzw. auch häufiger bei anderen Sprachen gesehen.

Was mich stört ist der dadurch 'unnötig' erzeugte Programmcode. Ist es nur ein Konfigurations-Wert, dann geht das noch. Sind es aber mehrere und wenn es auch mehrere Kind-Klassen gibt sind es schon viele zusätzliche Funktionen, die sich nur minimal unterscheiden.

Angefangen hatte ich wie Linuxer in seinem Beispiel, alle Konfigurations-Werte dem Konstruktor als Parameter mitzugeben.

Code (perl): (dl )
my $customer = DB::Customer->new('customer');


Dann sind es aber mit der Zeit immer mehr gleiche Paremeter geworden

Code (perl): (dl )
1
2
3
4
my $customer1 = DB::Helper->new('id customer 1', 'customer', 'euro', '...', '...', '...');
my $customer2 = DB::Helper->new('id customer 2', 'customer', 'euro', '...', '...', '...');
my $customer3 = DB::Helper->new('id customer 3', 'customer', 'euro', '...', '...', '...');
my $customer4 = DB::Helper->new('id customer 1', 'customer', 'euro', '...', '...', '...');


Weshalb ich dann den Helper zur Eltern-Klasse gemacht habe und in der Klasse Customer versucht habe 'irgendwie' alles zu konfigurieren.

Aktuelle Lösung ist, dass ich die Werte jetzt im Konstruktor ergänze

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
#! /usr/bin/env perl
use strict;
use warnings;


package DB::Base {
sub new {
        my ( $class, $name, $options ) = @_;

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

        $self->{name}    = $name;
        $self->{options} = $options || {};

        return $self;
}

sub option {
        my ( $self, $key ) = @_;
        die('missing key') unless ($key);
        die( 'missing option `' . $key . '`' ) unless ( defined $self->{options}{$key} );

        return $self->{options}{$key};
}

};

package DB::Customer {
        use base "DB::Base";

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

                return $class->SUPER::new(
                        @args,
                        {
                                type     => 'Customer',
                                currency => 'Euro',
                                ...
                } );
        }
};

package main;

my $customer1 = DB::Customer->new('id_customer 1');

__END__;


Danke für eure Anregungen!
Gruß
Hagen

View full thread Klassen-Attribut auch in der Base-Klassen nutzen