Froscamp2010_moose

  • 1,331 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,331
On Slideshare
0
From Embeds
0
Number of Embeds
3

Actions

Shares
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