Thread mal wieder design frage (8 answers)
Opened by mark05 at 2011-06-01 08:35

renee
 2011-06-01 10:00
#149334 #149334
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich würde das nicht über Vererbung lösen, sondern über Rollen. Ganz grob gesagt, sind Rollen dafür da, "Verhalten" - das nicht spezifisch für eine Klasse ist - wiederverwendbar zu machen. Man muss auch nicht gleich CPAN:Moose benutzen, um Rollen nutzen zu können.

Mein Code würde für Deinen Fall so aussehen:

FileRole.pm
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
package FileRole;

use strict;
use warnings;
use Carp;
use Role::Basic;

sub readfile {
    my ($self,$args) = @_;
    
    my $file = $args->{file};
    
    if ( !$file || !-e $file ) {
        return 'filenotexists';
    }
    
    open my $fh, '<', $args->{file} or croak "can't open $file for readfile $!";
    my @lines = <$fh>;
    close $fh;
    
    return @lines;
}

1;


Mit use Role::Basic sagst Du, dass es eine Rolle sein soll.

TestClass.pm
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package TestClass;

use strict;
use warnings;

use Role::Basic 'with';

eval{
  with qw(FileRole);
};


sub new {
    my ($class) = @_;
    
    my $self = bless {}, $class;
    return $self;
}

1;


Wie Du siehst, ist da nichts mit Vererbung gemacht. Role::Basic bietet die Funktion with, mit der man die Rollen dann laden kann. Ich packe das in ein eval damit das bei einer nicht vorhandenen Rolle nicht gleich abbricht.

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

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

use TestClass;

my $obj = TestClass->new;

if ( $obj->DOES( 'FileRole' ) ) {
    my @lines = $obj->readfile({ file => $0 });

    print @lines;
}


Hier lade ich nur noch die Klasse und erzeuge ein Objekt. Wenn ein Objekt das Verhalten einer Rolle "tun kann", liefert die Methode DOES "true" zurück...


Edit: Etwas Eigenwerbung: Im Perl-Magazin gibt es in der aktuellen Ausgabe etwas mehr Infos zu Rollen (in Moose) und in der kommenden Ausgabe gibt es einen Artikel über Role::Basic ;-)

Editiert von renee: Typo gefixt
Last edited: 2011-06-01 10:01:59 +0200 (CEST)
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/

View full thread mal wieder design frage