moose design patterns
Post on 15-May-2015
1.565 Views
Preview:
DESCRIPTION
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
top related