Moose Design Patterns

82fe3950bdbb0b1048e870fa04c89cfd?s=47 ynonperek
February 28, 2012
330

Moose Design Patterns

82fe3950bdbb0b1048e870fa04c89cfd?s=128

ynonperek

February 28, 2012
Tweet

Transcript

  1. Moose Design Patterns Ynon Perek ynonperek@yahoo.com http://ynonperek.com Tuesday, February 28,

    2012
  2. Good Code Bad Code Tuesday, February 28, 2012

  3. OOP Use Cases • Write code that other developers will

    use • Write code that will survive in an ever changing environment Tuesday, February 28, 2012
  4. Meet The Moose Tuesday, February 28, 2012

  5. Moose • Post Modern Object Oriented Perl • Consistent OO

    Framework • Stable Tuesday, February 28, 2012
  6. A First Class package Person; use Moose; has 'name', is

    => 'ro', isa => 'Str'; has 'age', is => 'rw', isa => 'Int'; package main; use feature ':5.10'; my $p = Person->new(name => "James"); say $p->name; Class Def Class Use • A class is just a package • A method is just a sub • An attribute is ... We’ll get to that later Tuesday, February 28, 2012
  7. Object Methods • A method takes the object (invocant) as

    its first argument • That’s why we use my $self = shift package Car; use Moose; has 'speed', is => 'ro'; sub go { my $self = shift; print "Vroom Vroom [speed: ", $self->speed, "]\n"; } package main; my $c = Car->new(speed => 10); $c->go; Tuesday, February 28, 2012
  8. Whats In The Box • A new method • use

    strict, use warnings • Type Validation • Organize Your Code Tuesday, February 28, 2012
  9. OO Design Tuesday, February 28, 2012

  10. OO Design Patterns Tested, Proven development paradigms for speeding up

    development process Tuesday, February 28, 2012
  11. Pattern Structure • Name • Problem • Solution • Consequences

    Tuesday, February 28, 2012
  12. Categories Creational Behavioral Structural Singleton Factory Builder Observer Template Method

    Mixins Composite Flyweight Tuesday, February 28, 2012
  13. Creational Patterns • Abstract instantiation process • We must only

    create one log file instance for the entire system • An XML tree is built gradually, node-by-node Tuesday, February 28, 2012
  14. Singleton Pattern • Ensure a class only has one instance

    • Manage Resource Sharing Tuesday, February 28, 2012
  15. Moose Singleton package Logger; use MooseX::Singleton; sub debug { ...

    } sub warn { ... } package main; my $logger = Logger->instance; my $same = Logger->instance; my $and_again = Logger->new; $logger->debug("Hello World"); Tuesday, February 28, 2012
  16. Factory • Create a different object based on some conditional

    • Treat the newly created objects the same way • Practical: abstract away OS related code Tuesday, February 28, 2012
  17. Factory • Use a Role to specify common behavior package

    AppConfig; use Moose::Role; requires 'debug_mode'; requires 'native_separators'; requires 'root_fs'; Tuesday, February 28, 2012
  18. Factory • All creation logic stays in the factory package

    ConfigFactory; use Moose; sub build_config { my $cfg; given ($^O) { $cfg = WinConfig->new when /MSWin32/; $cfg = UnixConfig->new; } return $cfg; } Tuesday, February 28, 2012
  19. Factory • Users only need to know about the role,

    not the various implementations package main; my $cfg = ConfigFactory->build_config; say $cfg->debug_mode; Tuesday, February 28, 2012
  20. Creational Patterns Tuesday, February 28, 2012

  21. Behavioral Patterns • Assignment of responsibility between objects and classes

    • Use either inheritance or composition Tuesday, February 28, 2012
  22. Template Methods Tuesday, February 28, 2012

  23. Template Method • Separate the algorithm from the actual implementation

    • Define the skeleton of an algorithm • Example: Paint on a canvas or printer Tuesday, February 28, 2012
  24. Painter Example Draw Pixel Tuesday, February 28, 2012

  25. Roles: Partials • Template methods are implemented using roles •

    Use requires to define a partial implementation package Painter; use Moose::Role; requires 'drawPixel'; sub draw_line { ... } sub draw_triangle { ... } sub draw_rectangle { ... } Tuesday, February 28, 2012
  26. Roles: Partials package ScreenPainter; use Moose; with 'Painter'; sub draw_pixel

    { ... } package main; my $painter = ScreenPainter->new; $painter->draw_line(0, 0, 100, 100); Tuesday, February 28, 2012
  27. Behavioral Patterns Tuesday, February 28, 2012

  28. Structural • Control structure of an object • Is it

    composed of other objects ? • How are these parts used ? • Composition, Decorator, Adapter Tuesday, February 28, 2012
  29. Composition: What Contact Email Send Mail Send Mail Phone Call

    Call Tuesday, February 28, 2012
  30. Moose Composition • Moose has a built-in support for delegation

    • Use handles on an attribute to create an effective composition • Prefer composition over inheritance Tuesday, February 28, 2012
  31. Delegation: How package Contact; use Moose; has 'email' => (

    is => 'ro', handles => [ qw/send_mail/ ] ); • Can take regular expressions • Can take hashref • perldoc Moose::Manual::Delegation my $c = Contact->new; $c->send_mail(subject => "Hello", text => "..."); Tuesday, February 28, 2012
  32. Delegation • Delegation is explicit • Performed via attributes •

    Highly recommended Tuesday, February 28, 2012
  33. OO Design Consider design patterns Use the power of perl

    Clean Code is worth it Tuesday, February 28, 2012
  34. Ynon Perek ynonperek@yahoo.com http://ynonperek.com Thanks For Listening Tuesday, February 28,

    2012