Moose
Renée Bäcker $foo – Perl-Magazin Frankfurt.pm Selbständiger Perl-Programmierer
Moose A postmodern object system for Perl 5
 
Warum Moose? <ul><li>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 </li></ul>
Warum Moose? package Employee; sub new { bless {} } for my $attr (qw(name title)) { no strict; *$attr = sub { my $self = s...
Warum Moose? package Employee; sub new { bless {} } sub name { my $self = shift; $self->{name} = shift if @_; return $self...
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? <ul><li>Moose vereinfacht diese Dinge enorm
Führt zu wartbarem, lesbarem Perl-Code
Ein Vergleich... </li></ul>
Elch vs. Kamel – ein Vergleich
Moose Eine Einführung
Moose – Eine Einführung <ul><li>use Moose; </li><ul><li>-> use strict;
-> use warnings;
-> @ISA = qw(Moose::Object) unless @ISA; </li><ul><li>Liefert auch „new“ </li></ul><li>-> einige neue Schlüsselwörter </li...
Moose - Attribute <ul><li>has ist Schlüsselwort für Attribute </li></ul>has attributname => ( # … # Eigenschaften des Attr...
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( ...
Moose - Attribute <ul><li>Eigenschaften </li><ul><li>is => </li><ul><li>'ro' -> read only
'rw' -> read/write </li></ul><li>isa => </li><ul><li>Von welchem „Datentyp“ ist das Attribut </li></ul><li>default =>  </l...
Moose - Attribute has name => ( is  => 'ro', required => 1, ); has orga => ( is  => 'rw', isa  => 'ArrayRef[Str]', default...
Moose - Attribute has name => ( is  => 'ro', required => 1, ); has orga => ( is  => 'rw', isa  => 'ArrayRef[Str]', default...
Moose - Attribute has name => ( is  => 'ro', required => 1, ); has orga => ( is  => 'rw', isa  => 'ArrayRef[Str]', default...
Moose - Attribute has name => ( is  => 'ro', required => 1, ); has orga => ( is  => 'rw', isa  => 'ArrayRef[Str]', default...
Moose - Attribute has name => ( is  => 'ro', required => 1, ); has orga => ( is  => 'rw', isa  => 'ArrayRef[Str]', default...
Moose - Typen has orga => ( is  => 'rw', isa  => 'ArrayRef[Str]' , default => sub{ [qw/Sandro Marcus/] }, ); <ul><li>Moose...
Moose – Typen
Moose – Typen <ul><li>… aber man kann auch eigene Typen erstellen, für vieles reicht es, den Klassennamen anzugeben </li><...
Moose – Typen <ul><li>… aber man kann auch eigene Typen erstellen, für vieles reicht es, den Klassennamen anzugeben </li><...
Moose – Typen use Moose::Util::TypeConstraints; subtype 'TwitterMsg' => as 'Str'  => where { length $_[0] <= 140 }; has tw...
Moose – Typen use Moose::Util::TypeConstraints; subtype 'TwitterMsg' => as 'Str'  => where { length $_[0] <= 140 }; has tw...
Moose – Typen use Moose::Util::TypeConstraints; subtype 'TwitterMsg' =>  as 'Str'   => where { length $_[0] <= 140 }; has ...
Moose – Typen use Moose::Util::TypeConstraints; subtype 'TwitterMsg' => as 'Str'  =>  where { length $_[0] <= 140 } ; has ...
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; Attribu...
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'  =...
Moose – Attribute <ul><li>Man kann noch mehr mit den Attributen machen: </li><ul><li>Zusätzliche Methoden delegieren
In Subklassen zusätzlich erweitern </li></ul></ul>
Moose - Methoden <ul><li>Erstmal nichts besonderes -> wie bei Standard Perl 5 OO </li></ul>sub send_cfp { my ($self,@recip...
Moose – Methoden <ul><li>… aber man kann tolle Sachen drumherum machen </li><ul><li>Code vor der der Subroutine aufrufen <...
Moose – Methoden <ul><li>… aber man kann tolle Sachen drumherum machen </li><ul><li>Code vor der der Subroutine aufrufen <...
Moose – Methoden <ul><ul><li>Code nach der Subroutine ausführen </li></ul></ul>sub send_cfp { my ($self,@recipients) = @_;...
Moose – Methoden <ul><ul><li>Code nach der Subroutine ausführen </li></ul></ul>sub send_cfp { my ($self,@recipients) = @_;...
Moose – Methoden <ul><li>Bei „before“ und „after“ hat man allerdings keinen Einfluss auf Parameter für die Originalmethode...
Man bekommt bei „before“ aber die Parameter übergeben </li></ul>
Moose – Methoden <ul><ul><li>Code drumherum ausführen </li></ul></ul>sub send_cfp { my ($self,@recipients) = @_; for my $r...
Moose – Methoden <ul><ul><li>Code drumherum ausführen </li></ul></ul>sub send_cfp { my ($self,@recipients) = @_; for my $r...
Moose – Methoden <ul><li>Noch mehr möglich </li><ul><li>augment & inner
override & super </li></ul></ul>
Moose – Vererbung <ul><li>Vererbung mit Schlüsselwort 'extends' </li></ul>package Person; use Moose; has name => (  is => ...
Moose – Vererbung use Attendee; my $person = Attendee->new( name  => 'renee', nr_attended => 3, ); print $person->name,  '...
Moose - Rollen <ul><li>Moose unterstützt Mehrfachvererbung </li><ul><li>Aber wer will das?
Kann zu Problemen bei mehreren Klassen, die die gleiche Subroutine zur Verfügung stellen, führen
-> Rollen </li></ul></ul>
Moose – Rollen
Moose – Rollen
Moose – Rollen
Upcoming SlideShare
Loading in...5
×

Froscamp2010_moose

1,406

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,406
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Froscamp2010_moose

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

    Clipping is a handy way to collect important slides you want to go back to later.

×