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

Moose Design Patterns

ynonperek
February 28, 2012
370

Moose Design Patterns

ynonperek

February 28, 2012
Tweet

Transcript

  1. Moose Design
    Patterns
    Ynon Perek
    [email protected]
    http://ynonperek.com
    Tuesday, February 28, 2012

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  4. Meet The Moose
    Tuesday, February 28, 2012

    View full-size slide

  5. Moose
    • Post Modern Object Oriented Perl
    • Consistent OO Framework
    • Stable
    Tuesday, February 28, 2012

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  8. Whats In The Box
    • A new method
    • use strict, use warnings
    • Type Validation
    • Organize Your Code
    Tuesday, February 28, 2012

    View full-size slide

  9. OO Design
    Tuesday, February 28, 2012

    View full-size slide

  10. OO Design
    Patterns
    Tested, Proven development
    paradigms for speeding up
    development process
    Tuesday, February 28, 2012

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  14. Singleton Pattern
    • Ensure a class only has one instance
    • Manage Resource Sharing
    Tuesday, February 28, 2012

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  20. Creational Patterns
    Tuesday, February 28, 2012

    View full-size slide

  21. Behavioral Patterns
    • Assignment of responsibility
    between objects and classes
    • Use either inheritance or composition
    Tuesday, February 28, 2012

    View full-size slide

  22. Template Methods
    Tuesday, February 28, 2012

    View full-size slide

  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

    View full-size slide

  24. Painter Example
    Draw Pixel
    Tuesday, February 28, 2012

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  27. Behavioral Patterns
    Tuesday, February 28, 2012

    View full-size slide

  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

    View full-size slide

  29. Composition: What
    Contact Email
    Send Mail Send Mail
    Phone
    Call
    Call
    Tuesday, February 28, 2012

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  32. Delegation
    • Delegation is explicit
    • Performed via attributes
    • Highly recommended
    Tuesday, February 28, 2012

    View full-size slide

  33. OO Design
    Consider design patterns
    Use the power of perl
    Clean Code is worth it
    Tuesday, February 28, 2012

    View full-size slide

  34. Ynon Perek
    [email protected]
    http://ynonperek.com
    Thanks For
    Listening
    Tuesday, February 28, 2012

    View full-size slide