Froscamp2010_moose
Upcoming SlideShare
Loading in...5
×
 

Froscamp2010_moose

on

  • 1,532 views

 

Statistics

Views

Total Views
1,532
Views on SlideShare
1,432
Embed Views
100

Actions

Likes
0
Downloads
8
Comments
0

6 Embeds 100

http://reneeb-perlblog.blogspot.de 52
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