Your SlideShare is downloading. ×
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Froscamp2010_moose
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Froscamp2010_moose

1,373

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,373
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1.  
  • 2. Moose
  • 3. Renée Bäcker $foo – Perl-Magazin Frankfurt.pm Selbständiger Perl-Programmierer
  • 4. Moose A postmodern object system for Perl 5
  • 5.  
  • 6. Warum Moose?
    • Vor Perl 5 gab es gar keine Objektorientierung in Perl
    • 7. Objektorientierung ist also nichts „natives“ in Perl
    • 8. Dadurch ist vieles nicht so schön wie in anderen Sprachen
    • 9. … vieles muss händisch gemacht werden
  • 10. 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 }; }; }
  • 11. 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}; }
  • 12. Warum Moose? class Employee attr_accessor :name attr_accessor :title end
  • 13. Warum Moose? package Employee; use Moose; has name => (is => 'ro'); has title => (is => 'rw');
  • 14. Warum Moose?
    • Moose vereinfacht diese Dinge enorm
    • 15. Führt zu wartbarem, lesbarem Perl-Code
    • 16. Ein Vergleich...
  • 17. Elch vs. Kamel – ein Vergleich
  • 18. Moose Eine Einführung
  • 19. Moose – Eine Einführung
    • use Moose;
      • -> use strict;
      • 20. -> use warnings;
      • 21. -> @ISA = qw(Moose::Object) unless @ISA;
        • Liefert auch „new“
      • -> einige neue Schlüsselwörter
  • 22. Moose - Attribute
    • has ist Schlüsselwort für Attribute
    has attributname => ( # … # Eigenschaften des Attributs # … );
  • 23. Moose - Attribute package Event; use Moose; has 'name' => ( is => 'ro' ); no Moose; 1;
  • 24. Moose - Attribute package Event; use Moose; has 'name' => ( is => 'ro' ); no Moose; 1; use Event; my $event = Event->new( name => 'FrOSCamp', ); print $event->name;
  • 25. Moose - Attribute
    • Eigenschaften
      • is =>
        • 'ro' -> read only
        • 26. 'rw' -> read/write
      • isa =>
        • Von welchem „Datentyp“ ist das Attribut
      • default =>
        • Standardwert des Attributs
      • required =>
        • Muss es angegeben werden?
      • ...
  • 27. Moose - Attribute has name => ( is => 'ro', required => 1, ); has orga => ( is => 'rw', isa => 'ArrayRef[Str]', default => sub{ [qw/Sandro Marcus/] }, );
  • 28. 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!
  • 29. 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“
  • 30. 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.
  • 31. 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
  • 32. Moose - Typen has orga => ( is => 'rw', isa => 'ArrayRef[Str]' , default => sub{ [qw/Sandro Marcus/] }, );
    • Moose hat einige Builtin-Typen
  • 33. Moose – Typen
  • 34. Moose – Typen
    • … aber man kann auch eigene Typen erstellen, für vieles reicht es, den Klassennamen anzugeben
    has start_date => ( is => 'rw', isa => 'DateTime' , );
  • 35. 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, ), );
  • 36. Moose – Typen use Moose::Util::TypeConstraints; subtype 'TwitterMsg' => as 'Str' => where { length $_[0] <= 140 }; has twitter => ( is => 'rw', isa => 'ArrayRef[TwitterMsg]', auto_deref => 1, );
  • 37. 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“
  • 38. 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
  • 39. 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
  • 40. Moose – Typen $event->twitter( [ 'hallo', 'welt' ], ); print &quot;<<$_>> &quot; for $event->twitter;
  • 41. 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]'
  • 42. Moose – Typen my $event = Event->new( name => 'FrOSCamp', start_date => '17.09.2010', );
  • 43. 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, );
  • 44. Moose – Attribute
    • Man kann noch mehr mit den Attributen machen:
      • Zusätzliche Methoden delegieren
      • 45. In Subklassen zusätzlich erweitern
  • 46. 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 ); } }
  • 47. 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;; };
  • 48. 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;; } ;
  • 49. 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;; };
  • 50. 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;; } ;
  • 51. Moose – Methoden
    • Bei „before“ und „after“ hat man allerdings keinen Einfluss auf Parameter für die Originalmethode oder deren Rückgabewert
    • 52. Man bekommt bei „before“ aber die Parameter übergeben
  • 53. 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;; } ;
  • 54. 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;; } ;
  • 55. Moose – Methoden
    • Noch mehr möglich
      • augment & inner
      • 56. override & super
  • 57. 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;
  • 58. Moose – Vererbung use Attendee; my $person = Attendee->new( name => 'renee', nr_attended => 3, ); print $person->name, ': ', $person->nr_attended;
  • 59. Moose - Rollen
    • Moose unterstützt Mehrfachvererbung
      • Aber wer will das?
      • 60. Kann zu Problemen bei mehreren Klassen, die die gleiche Subroutine zur Verfügung stellen, führen
      • 61. -> Rollen
  • 62. Moose – Rollen
  • 63. Moose – Rollen
  • 64. Moose – Rollen
  • 65. Moose – Rollen
  • 66. Moose – Rollen Was, wenn eine Person Speaker und Orga ist?
  • 67. Moose – Rollen Hier besser Rollen verwenden
  • 68. Moose – Rollen
    • Rollen definieren ein Verhalten
      • Sind wie Java Interfaces (safe) und mixins (useful)
      • 69. Rollen für kleine wiederverwendbare Verhalten verwenden
      • 70. Ein paar nützliche Rollen gibt es auch schon auf CPAN
  • 71. Moose – Rollen
    • Entweder direkt einer Klasse zuweisen
    • 72. … oder später eine Rolle für ein Objekt zuweisen
  • 73. Moose – Rollen package OrgaAttendee; use Moose; extends 'Attendee'; with 'Orga'; no Moose; 1;
  • 74. Moose – Rollen package OrgaAttendee; use Moose; extends 'Attendee'; with 'Orga'; no Moose; 1; 'OrgaAttendee' verwendet Rolle 'Orga'
  • 75. Moose – Rollen use OrgaAttendee; my $person = OrgaAttendee->new( name => 'sandro', area => 'everything', ); $person->is_responsible;
  • 76. Moose – Rollen use Attendee; use Speaker; my $person = Attendee->new( name => 'renee' ); Speaker->meta->apply( $person ); $person->speak;
  • 77. 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
  • 78. Moose - Erweiterungen
    • Etliche Module im MooseX::*-Namensraum
      • MooseX::Types (::UUID, ::URI, ::NetAddr::IP, ::XMLSchema)
      • 79. MooseX::Role::Parameterized
      • 80. MooseX::Singleton
      • 81. MooseX::Declare
      • 82. ...
  • 83. Moose – ein Fazit
    • Weniger Code bei Verwendung von Moose
      • Weniger Fehleranfällig
      • 84. Bessere Wartbarkeit
      • 85. Bessere Lesbarkeit
    • Die Hauptarbeit wird dem Programmierer abgenommen
  • 86. Moose - Lesestoff
    • Moose::Cookbook
      • http://search.cpan.org/dist/Moose/ ...
    • $foo Perl-Magazin
      • Ausgabe 4 – Moose
      • 87. Ausgabe 12 – Elchtest (Moose)
      • 88. Ab Ausgabe 15 Moose-Tutorial
    • Moose-Webseite
      • http://moose.perl.org

×