Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

Good Code Bad Code Tuesday, February 28, 2012

Slide 3

Slide 3 text

OOP Use Cases • Write code that other developers will use • Write code that will survive in an ever changing environment Tuesday, February 28, 2012

Slide 4

Slide 4 text

Meet The Moose Tuesday, February 28, 2012

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

OO Design Tuesday, February 28, 2012

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

Creational Patterns Tuesday, February 28, 2012

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

Template Methods Tuesday, February 28, 2012

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

Painter Example Draw Pixel Tuesday, February 28, 2012

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

Behavioral Patterns Tuesday, February 28, 2012

Slide 28

Slide 28 text

Structural • Control structure of an object • Is it composed of other objects ? • How are these parts used ? • Composition, Decorator, Adapter Tuesday, February 28, 2012

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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