• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Froscamp2010_moose
 

Froscamp2010_moose

on

  • 1,507 views

 

Statistics

Views

Total Views
1,507
Views on SlideShare
1,408
Embed Views
99

Actions

Likes
0
Downloads
8
Comments
0

6 Embeds 99

http://reneeb-perlblog.blogspot.de 51
http://reneeb-perlblog.blogspot.com 40
http://reneeb-perlblog.blogspot.cz 4
http://reneeb-perlblog.blogspot.ch 2
http://orhowilearnedtolovetheperl.com 1
http://reneeb-perlblog.blogspot.hu 1

Accessibility

Categories

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Froscamp2010_moose Froscamp2010_moose Presentation Transcript

    •  
    • Moose
    • Renée Bäcker $foo – Perl-Magazin Frankfurt.pm Selbständiger Perl-Programmierer
    • Moose A postmodern object system for Perl 5
    •  
    • Warum Moose?
      • Vor Perl 5 gab es gar keine Objektorientierung in Perl
      • Objektorientierung ist also nichts „natives“ in Perl
      • Dadurch ist vieles nicht so schön wie in anderen Sprachen
      • … vieles muss händisch gemacht werden
    • Warum Moose? package Employee; sub new { bless {} } for my $attr (qw(name title)) { no strict; *$attr = sub { my $self = shift; $self->{ $attr } = shift if @_; return $self->{ $attr }; }; }
    • Warum Moose? package Employee; sub new { bless {} } sub name { my $self = shift; $self->{name} = shift if @_; return $self->{name}; } sub title { my $self = shift; $self->{title} = shift if @_; return $self->{title}; }
    • Warum Moose? class Employee attr_accessor :name attr_accessor :title end
    • Warum Moose? package Employee; use Moose; has name => (is => 'ro'); has title => (is => 'rw');
    • Warum Moose?
      • Moose vereinfacht diese Dinge enorm
      • Führt zu wartbarem, lesbarem Perl-Code
      • Ein Vergleich...
    • Elch vs. Kamel – ein Vergleich
    • Moose Eine Einführung
    • Moose – Eine Einführung
      • use Moose;
        • -> use strict;
        • -> use warnings;
        • -> @ISA = qw(Moose::Object) unless @ISA;
          • Liefert auch „new“
        • -> einige neue Schlüsselwörter
    • Moose - Attribute
      • has ist Schlüsselwort für Attribute
      has attributname => ( # … # Eigenschaften des Attributs # … );
    • Moose - Attribute package Event; use Moose; has 'name' => ( is => 'ro' ); no Moose; 1;
    • Moose - Attribute package Event; use Moose; has 'name' => ( is => 'ro' ); no Moose; 1; use Event; my $event = Event->new( name => 'FrOSCamp', ); print $event->name;
    • Moose - Attribute
      • Eigenschaften
        • is =>
          • 'ro' -> read only
          • 'rw' -> read/write
        • isa =>
          • Von welchem „Datentyp“ ist das Attribut
        • default =>
          • Standardwert des Attributs
        • required =>
          • Muss es angegeben werden?
        • ...
    • Moose - Attribute has name => ( is => 'ro', required => 1, ); has orga => ( is => 'rw', isa => 'ArrayRef[Str]', default => sub{ [qw/Sandro Marcus/] }, );
    • Moose - Attribute has name => ( is => 'ro', required => 1, ); has orga => ( is => 'rw', isa => 'ArrayRef[Str]', default => sub{ [qw/Sandro Marcus/] }, ); Man muss einen Namen beim Objekterzeugen angeben!
    • Moose - Attribute has name => ( is => 'ro', required => 1, ); has orga => ( is => 'rw', isa => 'ArrayRef[Str]', default => sub{ [qw/Sandro Marcus/] }, ); Hierfür gibt es sowohl „getter“ als auch „setter“
    • Moose - Attribute has name => ( is => 'ro', required => 1, ); has orga => ( is => 'rw', isa => 'ArrayRef[Str]', default => sub{ [qw/Sandro Marcus/] }, ); Das Attribut ist eine Arrayreferenz, in der nur Strings vorkommen dürfen.
    • Moose - Attribute has name => ( is => 'ro', required => 1, ); has orga => ( is => 'rw', isa => 'ArrayRef[Str]', default => sub{ [qw/Sandro Marcus/] }, ); Falls bei der Erzeugung des Objekts keine orga angegeben wird, ist das der Standardwert
    • Moose - Typen has orga => ( is => 'rw', isa => 'ArrayRef[Str]' , default => sub{ [qw/Sandro Marcus/] }, );
      • Moose hat einige Builtin-Typen
    • Moose – Typen
    • Moose – Typen
      • … aber man kann auch eigene Typen erstellen, für vieles reicht es, den Klassennamen anzugeben
      has start_date => ( is => 'rw', isa => 'DateTime' , );
    • Moose – Typen
      • … aber man kann auch eigene Typen erstellen, für vieles reicht es, den Klassennamen anzugeben
      my $event = Event->new( name => 'FrOSCamp', start_date => DateTime->new( year => 2010, month => 9, day => 17, ), );
    • Moose – Typen use Moose::Util::TypeConstraints; subtype 'TwitterMsg' => as 'Str' => where { length $_[0] <= 140 }; has twitter => ( is => 'rw', isa => 'ArrayRef[TwitterMsg]', auto_deref => 1, );
    • Moose – Typen use Moose::Util::TypeConstraints; subtype 'TwitterMsg' => as 'Str' => where { length $_[0] <= 140 }; has twitter => ( is => 'rw', isa => 'ArrayRef[TwitterMsg]', auto_deref => 1, ); Ein neuer Datentyp mit Namen „TwitterMsg“
    • Moose – Typen use Moose::Util::TypeConstraints; subtype 'TwitterMsg' => as 'Str' => where { length $_[0] <= 140 }; has twitter => ( is => 'rw', isa => 'ArrayRef[TwitterMsg]', auto_deref => 1,, ); … mit „Str“ als Basis
    • Moose – Typen use Moose::Util::TypeConstraints; subtype 'TwitterMsg' => as 'Str' => where { length $_[0] <= 140 } ; has twitter => ( is => 'rw', isa => 'ArrayRef[TwitterMsg]', auto_deref => 1, ); … und der Bedingung, dass der String kürzer als 140 Zeichen oder genau 140 Zeichen lang ist
    • Moose – Typen $event->twitter( [ 'hallo', 'welt' ], ); print &quot;<<$_>> &quot; for $event->twitter;
    • Moose – Typen $event->twitter( [ 'hallo', 'welt', 'y' x 144 ], ); print &quot;<<$_>> &quot; for $event->twitter; Attribute (twitter) does not pass the type constraint because: Validation failed for 'ArrayRef[TwitterMsg]'
    • Moose – Typen my $event = Event->new( name => 'FrOSCamp', start_date => '17.09.2010', );
    • Moose – Typen subtype 'DateTime' => as 'Object' => where { $_[0]->isa( 'DateTime' ) }; coerce 'DateTime' => from 'Str' => via { my %info; @info{qw/day month year/} = split /./, $_; DateTime->new( %info ); }; has start_date => ( is => 'rw', isa => 'DateTime', coerce => 1, );
    • Moose – Attribute
      • Man kann noch mehr mit den Attributen machen:
        • Zusätzliche Methoden delegieren
        • In Subklassen zusätzlich erweitern
    • Moose - Methoden
      • Erstmal nichts besonderes -> wie bei Standard Perl 5 OO
      sub send_cfp { my ($self,@recipients) = @_; for my $recipient ( @recipients ) { $self->send_email( $recipient, $self->cfp ); } }
    • Moose – Methoden
      • … aber man kann tolle Sachen drumherum machen
        • Code vor der der Subroutine aufrufen
      sub send_cfp { my ($self,@recipients) = @_; for my $recipient ( @recipients ) { $self->send_email( $recipient, $self->cfp ); } } before send_cfp => sub { print &quot;*vor* send_cfp &quot;; };
    • Moose – Methoden
      • … aber man kann tolle Sachen drumherum machen
        • Code vor der der Subroutine aufrufen
      sub send_cfp { my ($self,@recipients) = @_; for my $recipient ( @recipients ) { $self->send_email( $recipient, $self->cfp ); } } before send_cfp => sub { print &quot;*vor* send_cfp &quot;; } ;
    • Moose – Methoden
        • Code nach der Subroutine ausführen
      sub send_cfp { my ($self,@recipients) = @_; for my $recipient ( @recipients ) { $self->send_email( $recipient, $self->cfp ); } } after send_cfp => sub { print &quot;*nach* send_cfp &quot;; };
    • Moose – Methoden
        • Code nach der Subroutine ausführen
      sub send_cfp { my ($self,@recipients) = @_; for my $recipient ( @recipients ) { $self->send_email( $recipient, $self->cfp ); } } after send_cfp => sub { print &quot;*nach* send_cfp &quot;; } ;
    • Moose – Methoden
      • Bei „before“ und „after“ hat man allerdings keinen Einfluss auf Parameter für die Originalmethode oder deren Rückgabewert
      • Man bekommt bei „before“ aber die Parameter übergeben
    • Moose – Methoden
        • Code drumherum ausführen
      sub send_cfp { my ($self,@recipients) = @_; for my $recipient ( @recipients ) { $self->send_email( $recipient, $self->cfp ); } } around send_cfp => sub { my ($self,$code,@param) = @_; print &quot;*vor* send_cfp &quot;; $self->$code( @params ); print &quot;*nach* send_cfp &quot;; } ;
    • Moose – Methoden
        • Code drumherum ausführen
      sub send_cfp { my ($self,@recipients) = @_; for my $recipient ( @recipients ) { $self->send_email( $recipient, $self->cfp ); } } around send_cfp => sub { my ($self,$code,@param) = @_; print &quot;*vor* send_cfp &quot;; $self->$code( @params ); print &quot;*nach* send_cfp &quot;; } ;
    • Moose – Methoden
      • Noch mehr möglich
        • augment & inner
        • override & super
    • Moose – Vererbung
      • Vererbung mit Schlüsselwort 'extends'
      package Person; use Moose; has name => ( is => 'ro', isa => 'Str', ); no Moose; 1; package Attendee; use Moose; extends 'Person'; has nr_attended => ( is => 'ro', isa => 'Int', ); no Moose; 1;
    • Moose – Vererbung use Attendee; my $person = Attendee->new( name => 'renee', nr_attended => 3, ); print $person->name, ': ', $person->nr_attended;
    • Moose - Rollen
      • Moose unterstützt Mehrfachvererbung
        • Aber wer will das?
        • Kann zu Problemen bei mehreren Klassen, die die gleiche Subroutine zur Verfügung stellen, führen
        • -> Rollen
    • Moose – Rollen
    • Moose – Rollen
    • Moose – Rollen
    • Moose – Rollen
    • Moose – Rollen Was, wenn eine Person Speaker und Orga ist?
    • Moose – Rollen Hier besser Rollen verwenden
    • Moose – Rollen
      • Rollen definieren ein Verhalten
        • Sind wie Java Interfaces (safe) und mixins (useful)
        • Rollen für kleine wiederverwendbare Verhalten verwenden
        • Ein paar nützliche Rollen gibt es auch schon auf CPAN
    • Moose – Rollen
      • Entweder direkt einer Klasse zuweisen
      • … oder später eine Rolle für ein Objekt zuweisen
    • Moose – Rollen package OrgaAttendee; use Moose; extends 'Attendee'; with 'Orga'; no Moose; 1;
    • Moose – Rollen package OrgaAttendee; use Moose; extends 'Attendee'; with 'Orga'; no Moose; 1; 'OrgaAttendee' verwendet Rolle 'Orga'
    • Moose – Rollen use OrgaAttendee; my $person = OrgaAttendee->new( name => 'sandro', area => 'everything', ); $person->is_responsible;
    • Moose – Rollen use Attendee; use Speaker; my $person = Attendee->new( name => 'renee' ); Speaker->meta->apply( $person ); $person->speak;
    • Moose – Rollen use Attendee; use Speaker; my $person = Attendee->new( name => 'renee' ); Speaker->meta->apply( $person ); $person->speak; Rolle 'Speaker' wird dem Objekt nachträglich zugeordnet
    • Moose - Erweiterungen
      • Etliche Module im MooseX::*-Namensraum
        • MooseX::Types (::UUID, ::URI, ::NetAddr::IP, ::XMLSchema)
        • MooseX::Role::Parameterized
        • MooseX::Singleton
        • MooseX::Declare
        • ...
    • Moose – ein Fazit
      • Weniger Code bei Verwendung von Moose
        • Weniger Fehleranfällig
        • Bessere Wartbarkeit
        • Bessere Lesbarkeit
      • Die Hauptarbeit wird dem Programmierer abgenommen
    • Moose - Lesestoff
      • Moose::Cookbook
        • http://search.cpan.org/dist/Moose/ ...
      • $foo Perl-Magazin
        • Ausgabe 4 – Moose
        • Ausgabe 12 – Elchtest (Moose)
        • Ab Ausgabe 15 Moose-Tutorial
      • Moose-Webseite
        • http://moose.perl.org