Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Moose Design Patterns

ynonperek
February 28, 2012
390

Moose Design Patterns

ynonperek

February 28, 2012
Tweet

Transcript

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

    use • Write code that will survive in an ever changing environment Tuesday, February 28, 2012
  2. Moose • Post Modern Object Oriented Perl • Consistent OO

    Framework • Stable Tuesday, February 28, 2012
  3. 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
  4. 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
  5. Whats In The Box • A new method • use

    strict, use warnings • Type Validation • Organize Your Code Tuesday, February 28, 2012
  6. OO Design Patterns Tested, Proven development paradigms for speeding up

    development process Tuesday, February 28, 2012
  7. 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
  8. Singleton Pattern • Ensure a class only has one instance

    • Manage Resource Sharing Tuesday, February 28, 2012
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. Behavioral Patterns • Assignment of responsibility between objects and classes

    • Use either inheritance or composition Tuesday, February 28, 2012
  15. 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
  16. 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
  17. 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
  18. Structural • Control structure of an object • Is it

    composed of other objects ? • How are these parts used ? • Composition, Decorator, Adapter Tuesday, February 28, 2012
  19. 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
  20. 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
  21. Delegation • Delegation is explicit • Performed via attributes •

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

    Clean Code is worth it Tuesday, February 28, 2012