Schrift
[thread]8330[/thread]

Objekte erweitern?: Neue Funktionen hinzufügen/alte umbiegen



<< >> 4 Einträge, 1 Seite
sosum
 2006-09-14 01:52
#69854 #69854
User since
2006-01-10
11 Artikel
BenutzerIn
[default_avatar]
Hallo Leute,

in Kürze: kann man Funktionen von Objekten umbiegen/ überschreiben, ohne das Objekt neu erstellen oder zerstören zu müssen?

Hintergrund:
ich habe da ein Modul das zyklisch eine Aufgabe erledigt. Zur Erledigung dieser Aufgabe werden je nach Parameter unterschiedliche Funktionen benötigt. Genauer: der Ablaufplan ist immer gleich, doch die Funktionen der Teilaufgaben ändern sich.

Skizziert ist es etwa so:
Code: (dl )
1
2
3
4
5
6
7
8
package foo;

sub ctrl () {...}

sub step1_a () {}
sub step1_b () {}

sub step2() {}


Je nach Parameter soll die Kontrollfunktion ctrl() die Funktionen step1_a und step2 oder step1_b und step2 aufrufen.

Da es recht viele solcher "Weichen" gibt, wird der Code unglaublich unübersichtlich, wenn man ihn mit den zig ifs zupflastert. Perfomant ist es zudem sicherlich nicht.

Daher gehe ich aktuell den Weg, in einem Array Referenzen auf zuständige Funktionen abzuspeichern, damit ich in den Teilaufgaben keine IFs habe. Diese Referenzen werden Ereignisgesteuert umgebogen.

Es stellte sich aber die Frage, ob man das nicht etwa noch übersichtlicher, also objektorientiert proggen kann. Leider müsste ich hierzu das Objekt selbst zur Laufzeit manipulieren können. Das geht afaik nicht. Ein entsprechendes Datenfeld im Objekt abzulegen macht wohl kaum Sinn.

greetz sosum
Ronnie
 2006-09-14 08:13
#69855 #69855
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
In einigen Fällen reicht eine dispatch-table mit anonymen Subs. Hängt davon ab wie kompliziert deine Vergleiche sind:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my $dispatch = {
'test' => sub { # ... },
'debug' => sub { return 1 },
# ...
}

sub ctrl {
my $self = shift;
my $p = shift || 'debug';
my $ret = $dispatch->{$p}(@_);
# ...
}
sosum
 2006-09-14 17:10
#69856 #69856
User since
2006-01-10
11 Artikel
BenutzerIn
[default_avatar]
Hm, ja könnte schon klappen, aber das läuft im Endeffekt wieder auf die Verwengung von Hashes hinaus. Die wollte ich eigentlich vermeiden.
renee
 2006-09-14 17:22
#69857 #69857
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was spricht gegen die Verwendung von Hashes?

Methoden "überschreiben" kannst Du so:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package Test;

use strict;
use warnings;

sub new{
bless {},shift;
}

sub test{
print "Hallo\n";
}

1;


Skript:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl

use strict;
use warnings;
use lib qw(.);
use Test;

my $test = Test->new();
$test->test();

no warnings 'redefine';
*Test::test = sub{print "Welt\n"};
$test->test();


Davon würde ich aber eher abraten!
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 4 Einträge, 1 Seite



View all threads created 2006-09-14 01:52.