Moose Design Patterns

Post on 15-May-2015

1,564 views 2 download

Tags:

description

One key benefit of Moose is the Object-Oriented jargon it brings to the table. With Moose, it's very easy to implement common design patterns, as I present in the keynote. This keynote was part of the Israeli Perl Workshop 2011.

transcript

Moose Design Patterns

Ynon Perekynonperek@yahoo.comhttp://ynonperek.com

Tuesday, February 28, 2012

Good Code Bad Code

Tuesday, February 28, 2012

OOP Use Cases

• Write code that other developers will use

• Write code that will survive in an ever changing environment

Tuesday, February 28, 2012

Meet The Moose

Tuesday, February 28, 2012

Moose

• Post Modern Object Oriented Perl

• Consistent OO Framework

• Stable

Tuesday, February 28, 2012

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

Object Methods

• A method takes the object (invocant) as its first argument

• That’s why we usemy $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

Whats In The Box

• A new method

• use strict, use warnings

• Type Validation

• Organize Your Code

Tuesday, February 28, 2012

OO Design

Tuesday, February 28, 2012

OO Design Patterns

Tested, Proven development paradigms for speeding up

development process

Tuesday, February 28, 2012

Pattern Structure

• Name

• Problem

• Solution

• Consequences

Tuesday, February 28, 2012

Categories

Creational Behavioral Structural

Singleton

Factory

Builder

Observer

Template Method

Mixins

Composite

Flyweight

Tuesday, February 28, 2012

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

Singleton Pattern

• Ensure a class only has one instance

• Manage Resource Sharing

Tuesday, February 28, 2012

Moose Singletonpackage 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

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

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

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

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

Creational Patterns

Tuesday, February 28, 2012

Behavioral Patterns

• Assignment of responsibility between objects and classes

• Use either inheritance or composition

Tuesday, February 28, 2012

Template Methods

Tuesday, February 28, 2012

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

Painter Example

Draw Pixel

Tuesday, February 28, 2012

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

Roles: Partialspackage 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

Behavioral Patterns

Tuesday, February 28, 2012

Structural

• Control structure of an object

• Is it composed of other objects ?

• How are these parts used ?

• Composition, Decorator, Adapter

Tuesday, February 28, 2012

Composition: What

Contact EmailSend Mail Send Mail

Phone

CallCall

Tuesday, February 28, 2012

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

Delegation: Howpackage 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

Delegation

• Delegation is explicit

• Performed via attributes

• Highly recommended

Tuesday, February 28, 2012

OO DesignConsider design patterns

Use the power of perl

Clean Code is worth it

Tuesday, February 28, 2012

Ynon Perekynonperek@yahoo.comhttp://ynonperek.com

Thanks For Listening

Tuesday, February 28, 2012