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

Moose Design Patterns

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for ynonperek ynonperek
February 28, 2012
600

Moose Design Patterns

Avatar for ynonperek

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